我想按域(可能还有用户)组织文件夹中的消息。我有一个脚本,但它无法从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地址,而不在乎它是什么类型的邮件
尽管如此,还是要有更好的方法。。。