2014-06-23 18 views
8

Ich habe versucht, mailItem.SenderEmailAddress und mailItem.Sender.Address verwenden, aber sie beide zurückgeben eine Zeichenfolge, die wie folgt aussieht:Wie kann ich die Absender-E-Mail-Adresse mit Outlook.MailItem in VB.NET erhalten?

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

Wo in Wirklichkeit Ich will [email protected] retrurned werden.

Wer hat irgendwelche Ideen?

Vielen Dank.

Edit: Ich habe etwas graben; Es funktioniert perfekt für E-Mail-Adressen des 'SMTP-SMTP-Absenders', es funktioniert einfach nicht für Exchange-E-Mail-Adressen.

Edit 2: Ich habe versucht, den angegebenen Code here, aber ich nehme an, es ist veraltet, weil es einen Fehler "Kann Active-X-Komponente nicht erstellen" -Fehler.

EDIT 3: Für alle, die immer das gleiche Problem hat wie ich, ich die Antwort gefunden (in C#, VB.NET umgewandelt, noch funktioniert aber):

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 

Antwort

19

I Sehen Sie, Sie haben Ihre eigene Frage beantwortet. Ich werde meine C# -Funktion hier posten, wenn jemand es braucht oder wenn Sie es als weitere Hilfe verwenden möchten. Mein C# Funktion zu tun, was Sie tun, sieht wie folgt aus:

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

Dies funktioniert nur mit Outlook 2010 oder später, oder? – BlueMonkMN

6

VBA-Lösung als auch

Private Function GetSenderSMTPAddress (mail Als Outlook.MailItem) As String

(einfach die VB.net übersetzt)
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

Korrigieren Sie es Ich liege falsch, aber das funktioniert nur mit Outlook 2010 oder höher, weil Absender keine Eigenschaft von MailItem in Outlook 2007 ist. – BlueMonkMN

+0

Danke mate. Das ist sehr hilfreich. – Neophile

6

Wenn jemand noch ist eine Lösung für dieses Problem suchen, hier ist eine vereinfachte und true-blue VBA Version des Codes, diese Anforderung zu verarbeiten.

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

Erstellt eine VBA-Funktion, wenn Sie es zur Vereinfachung verwenden möchten. Ein Beispielaufruf wäre Left(GetEmailAddress(mai) & Space(50), 50) , wobei mai erwartet wird, ein MailItem Objekt zu sein. Gebrauchte und erfolgreich in 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

Für mich eine viel einfachere Antwort wird wie folgt getestet

Wo eine externe Adresse erhalten Sie SenderEmailAddress verwendet haben, dann für eine interne (dh von exchange) Adresse Verwendung Absender .GetExchangeUser.PrimartySmtpAdress stattdessen

Wenn Sie möchten, dass es für interne und externe Adressen funktioniert, dann führen Sie einen Test durch, um zu sehen, ob die Adresse zuerst intern oder extern war. Beispiel Code-Snippet unter

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