2014-06-23 35 views
8

Próbowałem, używając mailItem.SenderEmailAddress i mailItem.Sender.Address ale obaj powrócić ciąg znaków, który wygląda tak:Jak mogę uzyskać adres e-mail nadawcy za pomocą Outlook.MailItem w VB.NET?

/O=DOMAINNAME/OU=EXCHANGE ADMINISTRATIVE GROUP (FYDIBOHI43SPCLT)/CN=RECIPIENTS/CN=JOE BLOGGS8C3

Gdzie w rzeczywistości chcę [email protected] być retrurned.

Ktoś ma jakieś pomysły?

Dziękuję bardzo.

Edytuj: Zrobiłem trochę kopania; działa idealnie na adresy e-mail SMTP "SenderEmailType", po prostu nie działa dla adresów e-mail Exchange.

Edycja 2: Próbowałem kodu określonego here, ale zakładam, że jest nieaktualny, ponieważ rzuca błąd "Nie można utworzyć składnika Active-X".

EDIT 3: Dla każdego, kto kiedykolwiek miał ten sam problem jak ja, znalazłem odpowiedź (w języku C#, VB.NET przekształca się, choć nadal działa):

Private Function GetSenderSMTPAddress(mail As Outlook.MailItem) As String 
    Dim PR_SMTP_ADDRESS As String = "http://schemas.microsoft.com/mapi/proptag/0x39FE001E" 
    If mail Is Nothing Then 
     Throw New ArgumentNullException() 
    End If 
    If mail.SenderEmailType = "EX" Then 
     Dim sender As Outlook.AddressEntry = mail.Sender 
     If sender IsNot Nothing Then 
      'Now we have an AddressEntry representing the Sender 
      If sender.AddressEntryUserType = Outlook.OlAddressEntryUserType.olExchangeUserAddressEntry OrElse sender.AddressEntryUserType = Outlook.OlAddressEntryUserType.olExchangeRemoteUserAddressEntry Then 
       'Use the ExchangeUser object PrimarySMTPAddress 
       Dim exchUser As Outlook.ExchangeUser = sender.GetExchangeUser() 
       If exchUser IsNot Nothing Then 
        Return exchUser.PrimarySmtpAddress 
       Else 
        Return Nothing 
       End If 
      Else 
       Return TryCast(sender.PropertyAccessor.GetProperty(PR_SMTP_ADDRESS), String) 
      End If 
     Else 
      Return Nothing 
     End If 
    Else 
     Return mail.SenderEmailAddress 
    End If 
End Function 

Odpowiedz

19

I widzisz, że odpowiedziałeś na własne pytanie. Opublikuję moją funkcję C#, jeśli ktoś tego potrzebuje, lub jeśli chciałbyś jej użyć jako dodatkowej pomocy. Moja funkcja C# za to, co robisz wygląda następująco:

private string getSenderEmailAddress(Outlook.MailItem mail) 
{ 
Outlook.AddressEntry sender = mail.Sender; 
string SenderEmailAddress = ""; 

    if (sender.AddressEntryUserType == Outlook.OlAddressEntryUserType.olExchangeUserAddressEntry || sender.AddressEntryUserType == Outlook.OlAddressEntryUserType.olExchangeRemoteUserAddressEntry) 
    { 
     Outlook.ExchangeUser exchUser = sender.GetExchangeUser(); 
     if (exchUser != null) 
     { 
      SenderEmailAddress = exchUser.PrimarySmtpAddress; 
     } 
    } 
    else 
    { 
     SenderEmailAddress = mail.SenderEmailAddress; 
    } 

    return SenderEmailAddress; 
} 
+0

Działa to tylko z Outlookiem 2010 lub nowszym, prawda? – BlueMonkMN

6

VBA Rozwiązanie, jak również (tylko przetłumaczył VB.net)

private function GetSenderSMTPAddress (mail jako Outlook.MailItem) As String

If mail Is Nothing Then 
    GetSenderSMTPAddress = vbNullString 
    Exit Function 
End If 
If mail.SenderEmailType = "EX" Then 
    Dim sender As Outlook.AddressEntry 
    Set sender = mail.sender 
    If Not sender Is Nothing Then 
     'Now we have an AddressEntry representing the Sender 
     If sender.AddressEntryUserType = Outlook.OlAddressEntryUserType.olExchangeUserAddressEntry Or sender.AddressEntryUserType = Outlook.OlAddressEntryUserType.olExchangeRemoteUserAddressEntry Then 
      'Use the ExchangeUser object PrimarySMTPAddress 
      Dim exchUser As Outlook.ExchangeUser 
      Set exchUser = sender.GetExchangeUser() 
      If Not exchUser Is Nothing Then 
       GetSenderSMTPAddress = exchUser.PrimarySmtpAddress 
      Else 
       GetSenderSMTPAddress = vbNullString 
      End If 
     Else 
      GetSenderSMTPAddress = sender.PropertyAccessor.GetProperty(PR_SMTP_ADDRESS) 
     End If 
    Else 
     GetSenderSMTPAddress = vbNullString 
    End If 
Else 
    GetSenderSMTPAddress = mail.SenderEmailAddress 
End If 

End Function

+0

Popraw mnie, jestem w błędzie, ale to działa tylko z Outlookiem 2010 lub później, ponieważ nadawca nie jest własnością MailItem w Outlook 2007. – BlueMonkMN

+0

Dzięki kolego. Jest to bardzo pomocne. – Neophile

6

Jeśli ktoś nadal szuka rozwiązania tego problemu, tutaj jest uproszczoną i true-blue wersja VBA kodu do obsługi tego wymogu.

Public Sub GetCurrentItem() 
On Error Resume Next 
Set ObjSelectedItem = Outlook.ActiveExplorer.Selection.Item(1) 
If TypeName(ObjSelectedItem) = "MailItem" Then 
    If ObjSelectedItem.SenderEmailType = "EX" Then 
     MsgBox (ObjSelectedItem.Sender.GetExchangeUser.PrimarySmtpAddress) 
    Else 
     MsgBox (ObjSelectedItem.SenderEmailAddress) 
    End If 
Else 
    MsgBox ("No items selected (OR) Selected item not a MailItem.") 
End If 
Set ObjSelectedItem = Nothing 
End Sub 
-1

Utworzono funkcję VBA, jeśli chcesz ją użyć dla uproszczenia. Wywołanie przykładowe to: Left(GetEmailAddress(mai) & Space(50), 50) , gdzie oczekuje się, że obiekt mai będzie obiektem MailItem. Wykorzystywane i testowane z powodzeniem w Microsoft Outlook 2010

Public Function GetEmailAddress(mai As Object) As String 
    On Error Resume Next 
    Set ObjSelectedItem = mai 
    If TypeName(ObjSelectedItem) = "MailItem" Then 
     If ObjSelectedItem.SenderEmailType = "EX" Then 
      GetEmailAddress = ObjSelectedItem.Sender.GetExchangeUser.PrimarySmtpAddress 
     Else 
      GetEmailAddress = ObjSelectedItem.SenderEmailAddress 
     End If 
    Else 
     GetEmailAddress = "Not a MailItem" 
    End If 

    Set ObjSelectedItem = Nothing 
    End Function 
2

Dla mnie o wiele prostsza odpowiedź jest następująca

Gdzie można uzyskać adresu zewnętrznego może użyłeś SenderEmailAddress, to dla wewnętrznego (czyli od wymiany) wykorzystują adres nadawcy .GetExchangeUser.PrymartySmtAdres zamiast:

Jeśli chcesz, aby działał zarówno dla adresów wewnętrznych, jak i zewnętrznych, następnie wykonaj test, aby sprawdzić, czy adres był wewnętrzny czy zewnętrzny. Przykładowy fragment kodu poniżej

If itm.SenderEmailType = "SMTP" Then 
     mailfrom = itm.SenderEmailAddress 
Else 
If itm.SenderEmailType = "EX" Then 
     mailfrom = itm.Sender.GetExchangeUser.PrimarySmtpAddress 
End If 
End If