【问题标题】:Extract SMTP address from Exchange User in the FROM field of a message在邮件的 FROM 字段中从 Exchange 用户中提取 SMTP 地址
【发布时间】:2015-11-12 01:47:16
【问题描述】:

我想按域(可能还有用户)组织文件夹中的邮件。我有一个脚本,但它无法从交换用户那里获取 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=7E2removedtextforstackF6-USERNAME”

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

【问题讨论】:

  • 哈!是的,我现在明白你的意思了……

标签: vba outlook


【解决方案1】:

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

【讨论】:

  • 是的,SenderEmailAddress 属性解决了很多问题。我不敢相信我错过了!谢谢!我也计划尽快实施 PR_SENT...。非常感谢您的帮助!
【解决方案2】:

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

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 地址,而不关心它是什么类型的消息。

不过还是有更好的办法……

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-18
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2018-11-17
    • 2014-03-03
    • 2021-08-15
    • 2015-10-15
    相关资源
    最近更新 更多