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
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;
}
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
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
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