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

Posted

技术标签:

【中文标题】如何在 VB.NET 中使用 Outlook.MailItem 获取发件人电子邮件地址?【英文标题】:How can I get the sender email address using Outlook.MailItem in VB.NET? 【发布时间】:2014-08-13 05:53:30 【问题描述】:

我尝试过使用mailItem.SenderEmailAddressmailItem.Sender.Address,但它们都返回一个如下所示的字符串:

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

实际上我希望joebloggs@domainname.co.uk 被返回。

有人有什么想法吗?

非常感谢。

编辑:我做了一些挖掘;它非常适用于“SenderEmailType”SMTP 的电子邮件地址,但它不适用于 Exchange 电子邮件地址。

编辑 2:我已尝试指定 here 的代码,但我认为它已过时,因为它会引发“无法创建 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

【问题讨论】:

【参考方案1】:

我看到你已经回答了你自己的问题。我将在这里发布我的 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 只有当您尝试处理的电子邮件没有发件人时才会发生这种情况,这意味着您尝试验证的发件人对象为空。 @SysC0mp 有一个发件人,电子邮件是收件箱中的电子邮件。很难找到一个可靠的解决方案(使用辅助邮箱,交换/非交换),但我最终设法让它工作。【参考方案2】:

如果有人仍在寻找解决这个问题的方法,这里有一个简化的、真正的蓝色 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

【讨论】:

【参考方案3】:

VBA 解决方案也是如此(刚刚翻译了 VB.net)

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 或更高版本,因为 Sender 不是 Outlook 2007 中 MailItem 的属性。 谢谢伙计。这很有帮助。【参考方案4】:

对我来说,一个更简单的答案如下

在哪里获取您可能使用过 SenderEmailAddress 的外部地址,然后对于内部(即来自交换)地址,请改用 Sender.GetExchangeUser.PrimartySmtpAdress

如果您希望它同时适用于内部地址和外部地址,请先进行测试以查看地址是内部地址还是外部地址。下面是示例代码sn-p

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

【讨论】:

【参考方案5】:

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

string sender = mail.SendUsingAccount.SmtpAddress;

其中邮件是Outlook.MailItem

【讨论】:

感谢分享!【参考方案6】:

为了简单起见,如果您想使用它,请创建一个 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

【讨论】:

以上是关于如何在 VB.NET 中使用 Outlook.MailItem 获取发件人电子邮件地址?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 VB.Net 的虚拟键语句中使用变量

如何使用 vb.net 2003 在 asp.net 1.1 中手动填充数据网格?

如何在 VB.NET 中使用 protobuf-net 添加枚举?

如何使用VB.NET在Access数据库中插入多条记录

如何在 VB.NET 中使用 OleDbDataReader 搜索数据?

如何在 VB.NET 中使用 <DllImport>?