2014-06-23 17 views
8

Ho provato con mailItem.SenderEmailAddress e mailItem.Sender.Address ma entrambi restituire una stringa che assomiglia a questo:Come posso ottenere l'indirizzo email del mittente utilizzando Outlook.MailItem in VB.NET?

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

Dove in realtà voglio [email protected] da retrurned.

Qualcuno ha qualche idea?

Grazie mille.

Modifica: ho fatto un po 'di scavo; funziona perfettamente per gli indirizzi di posta elettronica del SMTP 'SenderEmailType', ma non funziona per gli indirizzi di posta elettronica di Exchange.

Modifica 2: Ho provato il codice specificato here, ma presumo che sia obsoleto perché genera un errore "Impossibile creare il componente Active-X".

EDIT 3: Per chi mai ha lo stesso problema come me, ho trovato la risposta (in C#, convertito in VB.NET, funziona ancora però):

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 

risposta

19

I vedi che hai risposto alla tua stessa domanda. Pubblicherò qui la mia funzione C# nel caso in cui qualcuno ne avesse bisogno o se vorresti utilizzarlo come ulteriore aiuto. La mia funzione C# per fare quello che fai è simile al seguente: Soluzione

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

Questo funziona solo con Outlook 2010 o successivo, giusto? – BlueMonkMN

6

VBA così (appena tradotto il VB.net)

privata Funzione GetSenderSMTPAddress (mail Come 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

Correggetemi, ho sbagliato, ma funziona solo con Outlook 2010 o successivo perché Sender non è una proprietà di MailItem in Outlook 2007. – BlueMonkMN

+0

Grazie amico. Questo è abbastanza utile. – Neophile

6

Se qualcuno è ancora alla ricerca di una soluzione a questo problema, qui è una versione semplificata e vero-blu VBA del codice per gestire questo requisito.

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

Creata una funzione VBA se si desidera utilizzarlo per semplicità. Una chiamata di esempio sarebbe Left(GetEmailAddress(mai) & Space(50), 50) dove mai si prevede che sia un oggetto MailItem. Usato e testato con successo 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

Per me una risposta molto più semplice è la seguente

Dove ottenere un indirizzo esterno potrebbe essere utilizzato SenderEmailAddress, poi per un interno (cioè dal cambio) uso l'indirizzo del mittente .GetExchangeUser.PrimartySmtpAdress invece

Se si desidera che funzioni sia per gli indirizzi interni che per quelli esterni, inserire un test per verificare se l'indirizzo era prima interno o esterno. Esempio di snippet di codice sotto

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