我目前正在使用Outlook VSTO AddIn编写。使用此AddIn,我想跟踪电子邮件对话并能够唯一地识别邮件消息。我们使用Exchange作为MTA。
对于收件箱中的所有邮件(以及许多其他文件夹),我可以使用邮件标题中的邮件ID进行匹配,但邮件位于"已发送邮件中#34;文件夹没有设置消息ID。
有没有办法从这些邮件中获取邮件ID?
(我猜邮件没有标题,因为它们在发送之前放在文件夹中;但是在发送邮件之后,MTA会发送一条包含邮件ID的状态代码为250的邮件。)是否Outlook知道或以某种方式保存MessageID?如果Outlook不知道MessageID,Outlook如何跟踪对话? 还有另一种识别邮件的方法吗?
答案 0 :(得分:1)
首先让我们澄清为什么你的意思是
是否有另一种识别邮件的方法
实际上,您可以复制电子邮件,但它们将具有相同的MessageID
但不同的ItemId
。如果您有多个收件人:toms@gmail.com
,toms@an.exchange.mailbox.com
,toms2@an.exchange.mailbox.com
他们将拥有相同的MessageID
(即InternetMessageId
),即使第一个收件人甚至不是Exchange。对于其他两个,同一个Exchange服务器中有两个不同的消息。有差异ItemID
(又名EntryId
)。
结论,MessageID
标识来自其内容的邮件,并由发送电子邮件的邮件服务器设置。据我所知,除了从电子邮件的不可变属性创建自己的“摘要”之外别无选择(除了创建自己的“摘要”)。还要记住,当您将电子邮件从文件夹移动到另一个文件夹时,“ItemId”会发生变化。 See
对于VSTO加载项,您可以使用Redemption检索MessageID
又名InternetMessageId
。
另一种方法是使用MAPI或EWS询问ExchangeServer。
在所有情况下都会有“服务器调用”,并且在发送后无法直接检索,因为此属性由Exchange邮件服务器设置。
答案 1 :(得分:0)
Exchange始终会为所有现有电子邮件分配邮件ID,即使它们未被发送也是如此。问题是在缓存模式下可能无法显示id,因为MSEMS提供程序尝试最小化网络流量,并且不会同步来自“已发送邮件”文件夹的数据,因为缓存的存储具有“几乎”相同的副本。
通过在调用MAPI_NO_CACHE
时指定0x0200
标志(IMsgStore::OpenEntry
)然后阅读PR_INTERNET_MESSAGE_ID
属性,您可以在在线模式下从已发送邮件文件夹重新打开邮件(0x1035001F
)。
如果扩展MAPI不是一个选项(它只能在C ++或Delphi中使用),您可以使用Redemption及其RDOSession。GetMessageFromID
方法,允许(可选)指定标志:
set YourMailItem = Application.ActiveExplorer.Selection(1)
MAPI_NO_CACHE = &H0209
MAPI_BEST_ACCESS = &H0010
set Session = CreateObject("Redemption.RDOSession")
Session.MAPIOBJECT = Application.Session.MAPIOBJECT
set Mail = Session.GetMessageFromID(YourMailItem.EntryID, , MAPI_NO_CACHE + MAPI_BEST_ACCESS)
MsgBox Mail.Fields("http://schemas.microsoft.com/mapi/proptag/0x1035001F")