Vb.net 检查Outlook SenderEmailType是否为exchange和set变量

Vb.net 检查Outlook SenderEmailType是否为exchange和set变量,vb.net,outlook,Vb.net,Outlook,我正在尝试检测电子邮件是否为exchange 以下是我的代码: Private Sub Application_ItemSend(ByVal Item As Object, ByRef Cancel As Boolean) Handles Application.ItemSend Dim sendAddress As String If Item.SenderEmailType = "EX" Then sendAddress = Item.Sender.Get

我正在尝试检测电子邮件是否为exchange

以下是我的代码:

Private Sub Application_ItemSend(ByVal Item As Object, ByRef Cancel As Boolean) Handles Application.ItemSend

    Dim sendAddress As String

    If Item.SenderEmailType = "EX" Then
        sendAddress = Item.Sender.GetExchangeUser().PrimarySmtpAddress
    Else
        sendAddress = Item.SenderEmailAddress
    End If

    System.Windows.Forms.MessageBox.Show(sendAddress)

End Sub
当我运行此操作时,会出现以下错误:

System.NullReferenceException:“未设置对象变量或带块变量。”

你知道为什么吗?

受此启发,我想你想要的是这样的:

Private Sub Application_ItemSend(ByVal Item As Object, ByRef Cancel As Boolean) Handles application.ItemSend

    Dim mailItem As Outlook.MailItem = DirectCast(Item, Outlook.MailItem)

    Dim sender As Outlook.AddressEntry = mailItem.Sender
    Dim senderAddress As String = ""

    If sender IsNot Nothing AndAlso
       (sender.AddressEntryUserType = Outlook.OlAddressEntryUserType.olExchangeAgentAddressEntry OrElse _
        sender.AddressEntryUserType = Outlook.OlAddressEntryUserType.olExchangeRemoteUserAddressEntry) Then
        Dim exchangeUser As Outlook.ExchangeUser = sender.GetExchangeUser()

        If exchangeUser IsNot Nothing Then
            senderAddress = exchangeUser.PrimarySmtpAddress()
        End If
    Else
        Dim recipient As Outlook.Recipient = application.Session.CreateRecipient(mailItem.SenderEmailAddress)
        If recipient IsNot Nothing Then
            Dim exchangeUser As Outlook.ExchangeUser = recipient.AddressEntry.GetExchangeUser()
            If exchangeUser IsNot Nothing Then
                senderAddress = exchangeUser.PrimarySmtpAddress()
            End If
        End If

        'check if senderAddress has been set with above code. If not try SenderEmailAddress
        If senderAddress = "" Then
            senderAddress = mailItem.SenderEmailAddress()
        End If
    End If

    MessageBox.Show(senderAddress)

End Sub
Private Sub Application_ItemSend(ByVal Item As Object, ByRef Cancel As Boolean) Handles Application.ItemSend

    Dim mailItem As Outlook.MailItem = DirectCast(Item, Outlook.MailItem)

    Dim senderAddress As String = mailItem.SenderEmailAddress

    Dim recipient As Outlook.Recipient = Application.Session.CreateRecipient(senderAddress)
    If recipient IsNot Nothing Then
        Dim exchangeUser As Outlook.ExchangeUser = recipient.AddressEntry.GetExchangeUser()
        If exchangeUser IsNot Nothing Then
            senderAddress = exchangeUser.PrimarySmtpAddress()
        End If
    End If

    MessageBox.Show(senderAddress)

End Sub
首先要注意的是,我正在将对象
Item
转换为
MailItem
。这样我才能正确访问属性。我建议你转向:

将隐式数据类型转换限制为仅扩大转换、不允许后期绑定以及不允许导致对象类型的隐式类型

您可能还想检查其他
OlAddressEntryUserType
s,但我将把它留给您。此代码至少可以解决您的错误

但是,在查看了上述代码之后,我想知道是否有必要,至少在
应用程序.ItemSend
方法中是这样。我相信这可以浓缩成这样:

Private Sub Application_ItemSend(ByVal Item As Object, ByRef Cancel As Boolean) Handles application.ItemSend

    Dim mailItem As Outlook.MailItem = DirectCast(Item, Outlook.MailItem)

    Dim sender As Outlook.AddressEntry = mailItem.Sender
    Dim senderAddress As String = ""

    If sender IsNot Nothing AndAlso
       (sender.AddressEntryUserType = Outlook.OlAddressEntryUserType.olExchangeAgentAddressEntry OrElse _
        sender.AddressEntryUserType = Outlook.OlAddressEntryUserType.olExchangeRemoteUserAddressEntry) Then
        Dim exchangeUser As Outlook.ExchangeUser = sender.GetExchangeUser()

        If exchangeUser IsNot Nothing Then
            senderAddress = exchangeUser.PrimarySmtpAddress()
        End If
    Else
        Dim recipient As Outlook.Recipient = application.Session.CreateRecipient(mailItem.SenderEmailAddress)
        If recipient IsNot Nothing Then
            Dim exchangeUser As Outlook.ExchangeUser = recipient.AddressEntry.GetExchangeUser()
            If exchangeUser IsNot Nothing Then
                senderAddress = exchangeUser.PrimarySmtpAddress()
            End If
        End If

        'check if senderAddress has been set with above code. If not try SenderEmailAddress
        If senderAddress = "" Then
            senderAddress = mailItem.SenderEmailAddress()
        End If
    End If

    MessageBox.Show(senderAddress)

End Sub
Private Sub Application_ItemSend(ByVal Item As Object, ByRef Cancel As Boolean) Handles Application.ItemSend

    Dim mailItem As Outlook.MailItem = DirectCast(Item, Outlook.MailItem)

    Dim senderAddress As String = mailItem.SenderEmailAddress

    Dim recipient As Outlook.Recipient = Application.Session.CreateRecipient(senderAddress)
    If recipient IsNot Nothing Then
        Dim exchangeUser As Outlook.ExchangeUser = recipient.AddressEntry.GetExchangeUser()
        If exchangeUser IsNot Nothing Then
            senderAddress = exchangeUser.PrimarySmtpAddress()
        End If
    End If

    MessageBox.Show(senderAddress)

End Sub

项目的类型是什么?请添加更多相关代码。对不起,我已编辑。这有帮助吗?对象的可能副本可以是任何东西,猜测它不具有您认为它具有的属性,即发件人或SenderEmailAddress。调试代码并查看哪一行抛出错误以及该项由什么组成。我还建议你熟悉强类型的课程和习惯。绝对完美!谢谢@bugs