web-dev-qa-db-fra.com

Comment puis-je obtenir l'adresse e-mail de l'expéditeur à l'aide d'Outlook.MailItem dans VB.NET?

J'ai essayé d'utiliser mailItem.SenderEmailAddress Et mailItem.Sender.Address Mais ils renvoient tous les deux une chaîne qui ressemble à ceci:

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

Où en réalité je veux que [email protected] Soit retourné.

Quelqu'un a des idées?

Merci beaucoup.

Edit: j'ai fait quelques fouilles; il fonctionne parfaitement pour les adresses e-mail du SMTP "SenderEmailType", il ne fonctionne tout simplement pas pour les adresses e-mail Exchange.

Edit 2: J'ai essayé le code spécifié ici , mais je suppose qu'il est obsolète car il génère une erreur "Impossible de créer le composant Active-X".

EDIT 3: Pour tous ceux qui ont le même problème que moi, j'ai trouvé la réponse (en C #, converti à VB.NET, fonctionne toujours):

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
13
ubergorp

Je vois que vous avez répondu à votre propre question. Je publierai ma fonction C # ici au cas où quiconque en aurait besoin ou si vous souhaitez l'utiliser comme aide supplémentaire. Ma fonction C # pour faire ce que vous faites ressemble à ceci:

 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;
}
26
Alex Harvey

Si quelqu'un cherche toujours une solution à ce problème, voici une version VBA simplifiée et véritablement bleue du code pour gérer cette exigence.

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
9
prgSRR

Solution VBA également (vient de traduire le VB.net)

Fonction privée GetSenderSMTPAddress (mail As 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

Fonction de fin

6
Gerry Wilton

Pour moi, une réponse beaucoup plus simple est la suivante

Où obtenir une adresse externe, vous avez peut-être utilisé SenderEmailAddress, puis pour une adresse interne (c'est-à-dire à partir d'un échange), utilisez plutôt Sender.GetExchangeUser.PrimartySmtpAdress

Si vous voulez qu'elle fonctionne pour les adresses internes et externes, effectuez un test pour voir si l'adresse était d'abord interne ou externe. Exemple d'extrait de code ci-dessous

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