获取Outlook中已发送邮件的MessageID

时间:2017-02-17 06:49:31

标签: email outlook vsto outlook-addin

我目前正在使用Outlook VSTO AddIn编写。使用此AddIn,我想跟踪电子邮件对话并能够唯一地识别邮件消息。我们使用Exchange作为MTA。

对于收件箱中的所有邮件(以及许多其他文件夹),我可以使用邮件标题中的邮件ID进行匹配,但邮件位于"已发送邮件中#34;文件夹没有设置消息ID。

有没有办法从这些邮件中获取邮件ID?

(我猜邮件没有标题,因为它们在发送之前放在文件夹中;但是在发送邮件之后,MTA会发送一条包含邮件ID的状态代码为250的邮件。)是否Outlook知道或以某种方式保存MessageID?如果Outlook不知道MessageID,Outlook如何跟踪对话? 还有另一种识别邮件的方法吗?

2 个答案:

答案 0 :(得分:1)

首先让我们澄清为什么你的意思是

  

是否有另一种识别邮件的方法

实际上,您可以复制电子邮件,但它们将具有相同的MessageID但不同的ItemId。如果您有多个收件人:toms@gmail.comtoms@an.exchange.mailbox.comtoms2@an.exchange.mailbox.com他们将拥有相同的MessageID(即InternetMessageId),即使第一个收件人甚至不是Exchange。对于其他两个,同一个Exchange服务器中有两个不同的消息。有差异ItemID(又名EntryId)。

结论,MessageID标识来自其内容的邮件,并由发送电子邮件的邮件服务器设置。据我所知,除了从电子邮件的不可变属性创建自己的“摘要”之外别无选择(除了创建自己的“摘要”)。还要记住,当您将电子邮件从文件夹移动到另一个文件夹时,“ItemId”会发生变化。 See

对于VSTO加载项,您可以使用Redemption检索MessageID又名InternetMessageId。 另一种方法是使用MAPIEWS询问ExchangeServer。 在所有情况下都会有“服务器调用”,并且在发送后无法直接检索,因为此属性由Exchange邮件服务器设置。

答案 1 :(得分:0)

Exchange始终会为所有现有电子邮件分配邮件ID,即使它们未被发送也是如此。问题是在缓存模式下可能无法显示id,因为MSEMS提供程序尝试最小化网络流量,并且不会同步来自“已发送邮件”文件夹的数据,因为缓存的存储具有“几乎”相同的副本。

通过在调用MAPI_NO_CACHE时指定0x0200标志(IMsgStore::OpenEntry)然后阅读PR_INTERNET_MESSAGE_ID属性,您可以在在线模式下从已发送邮件文件夹重新打开邮件(0x1035001F)。

如果扩展MAPI不是一个选项(它只能在C ++或Delphi中使用),您可以使用Redemption及其RDOSessionGetMessageFromID方法,允许(可选)指定标志:

 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")