在邮件的from字段中提取Exchange用户的SMTP地址



我想按域(可能还有用户)组织文件夹中的消息。我有一个脚本,但它无法从exchange用户那里获取SMTP地址。下面的代码摘录自地址提取器。

///For each obj in objFolder.Items
    If obj.SenderEmailAddress = "EX" Then
    Set objSender = obj.Sender
        If Not (objSender Is Nothing) Then
            Set objExchUser = Sender.GetExchangeUser()
            If Not (objExchUser Is Nothing) Then
                strSender = objExchUser.PrimarySmtpAddress
            End If
        End If
    Else
        If obj.SenderEmailAddress = "" Then
        strSender = "ERROR@ERROR.GOV"
        Else
        MsgBox obj.SenderEmailAddress
        'MsgBox obj.PrimarySmtpAddress 'errs out
        'MsgBox Sender.GetExchangeUser() 'errs out
        'MsgBox Obj.Sender.GetExchangeUser() 'errs out
        strSender = obj.PrimarySmtpAddress
        End If
    End If
///Next

该代码适用于来自电子邮件组的用户(helpdesk@myexchange.org例如)或伪造的电子邮件地址。

obj.SenderEmailAddress导致"/O=EXCHANGELABS/OU=EXCHANGE ADMINISTRATIVE GROUP(removedtextforstack)/CN=RECIPIENTS/CN=7E2removedtextfor stackF6 USERNAME"

我相信这是意料之中的事,但是Sender.GetExchangeUser()给出了一个Object Required错误。我并不特别希望3000行代码通过AD来查找每封电子邮件的AD代码/用户。我们使用office 365,它由许多人管理,因此访问地址列表时不会出现问题。

MailItem.Sender.GetExchnageUser().ProimarySmtpAddress对于EX发送方应该可以正常工作,但您的代码检查的是SenderEmailAddress属性,而不是SenderEmailType。将其更改为

If obj.SenderEmailType = "EX" Then

在使用MailItem.Sender属性(更昂贵)之前,您还可以检查PR_SENT_REPRESENTING_SMTP_ADDRESS属性(DASL名称http://schemas.microsoft.com/mapi/proptag/0x5D02001F,使用MailItem.PropertyAccessor.GetProperty

我有一个看起来相当高效的解决方案。

Const PR_TRANSPORT_MESSAGE_HEADERS = "http://schemas.microsoft.com/mapi/proptag/0x007D001E"
a = Split(obj.PropertyAccessor.GetProperty(PR_TRANSPORT_MESSAGE_HEADERS), vbCrLf)
For i = 0 To UBound(a)
    If InStr(1, a(i), "From:", vbTextCompare) = 1 Then
    MsgBox Replace(Split(a(i), "<")(1), ">", "")
    End If
Next

这会直接从邮件头中提取SMTP地址,而不在乎它是什么类型的邮件

尽管如此,还是要有更好的方法。。。

最新更新