如何在VB.NET中使用Outlook.MailItem获取发件人电子邮件地址?

25

我尝试使用mailItem.SenderEmailAddressmailItem.Sender.Address,但它们都返回一个看起来像这样的字符串:

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

实际上我想要返回joebloggs@domainname.co.uk

有人有什么想法吗?

非常感谢。

编辑:我进行了一些调查;它对于'SenderEmailType' SMTP的电子邮件地址完美地工作,但对于Exchange电子邮件地址则不起作用。

编辑2:我尝试了这里指定的代码,但我认为它已经过时了,因为它会抛出“无法创建Active-X组件”错误。

编辑3:对于任何遇到与我相同问题的人,我找到了答案(以C#的形式,转换为VB.NET,但仍然有效):

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
7个回答

35

我看到你已经回答了自己的问题。为了帮助其他人或者让你更好地使用它,我会在这里发布我的C#函数。我用于执行你所做的操作的C#函数如下:

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

复制并粘贴这段代码到邮件中后,当if语句执行时会出现“System.NullReferenceException, HResult=0x80004003, Message=Object reference not set to an instance of an object.”的异常。 - user2924019
@user2924019 只有在您尝试处理的电子邮件没有发件人时才会发生这种情况,这意味着您尝试验证的发件人对象为空。 - SysC0mp
@SysC0mp 有一个发件人,这封电子邮件是收件箱中的一封邮件。找到一个可靠的解决方案很困难(涉及次要邮箱、交换/非交换),但最终我成功让它工作了。 - user2924019

9
如果有人仍在寻找解决此问题的方法,这里提供了一个简化且真实可靠的VBA代码版本,可处理此要求。
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

同时也有VBA解决方案(只是将VB.net翻译成了VBA)

Private Function 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
End Function

如果我错了请纠正我,但这仅适用于Outlook 2010或更高版本,因为在Outlook 2007中 Sender 不是 MailItem 的属性。 - BlueMonkMN
谢谢,伙计。这非常有帮助。 - Neophile

8
我认为一个更简单的答案如下:
要获取外部地址,您可能已经使用了 SenderEmailAddress,请使用 Sender.GetExchangeUser.PrimartySmtpAdress 来获取内部(即来自 Exchange)地址。
如果您想使其同时适用于内部和外部地址,请先进行地址类型的测试。下面是示例代码片段。
If itm.SenderEmailType = "SMTP" Then
        mailfrom = itm.SenderEmailAddress
Else
If itm.SenderEmailType = "EX" Then
        mailfrom = itm.Sender.GetExchangeUser.PrimarySmtpAddress
End If
End If

0
这是使用pywin32的Python版本:
import win32com.client
if(message.SenderEmailType == "EX"):
    sender_email = message.Sender.GetExchangeUser().PrimarySmtpAddress

0
在C#中,您可以使用Outlook MailItem的SendUsingAccount.SmtpAddress属性访问发件人的电子邮件地址。它返回一个字符串对象。VB.net应该类似。
string sender = mail.SendUsingAccount.SmtpAddress;

其中邮件是一个 Outlook.MailItem


被投票否决了,因为这会向每个邮件提供我的地址,而不是发件人的电子邮件地址。 - Eric

-1
创建了一个 VBA 函数,如果您想要使用它来简化操作。一个示例调用如下: Left(GetEmailAddress(mai) & Space(50), 50) 其中 mai 应该是一个 MailItem 对象。在 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接