在Outlook中获取发送的邮件的MessageID

问题描述:

我目前正在写一个Outlook VSTO AddIn。使用此AddIn,我想跟踪电子邮件对话并能够唯一标识邮件消息。我们使用Exchange作为MTA。在Outlook中获取发送的邮件的MessageID

对于收件箱(和许多其他文件夹),我可以利用消息ID从邮件的标题做匹配,但邮件趴在“已发送邮件”文件夹中没有消息ID集中的所有邮件。

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

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

首先,让我们弄清楚为什么你的

的意思是有另一种方式来识别邮件

其实你可以复制电子邮件的话,他们将有相同MessageID但不同ItemId 。如果您有多个收件人:[email protected][email protected],[email protected]他们将具有相同的MessageID(又名InternetMessageId),即使第一个甚至不是Exchange。对于另外两个,在同一个Exchange服务器中有两个不同的消息。有不同的ItemID(又名EntryId)。

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

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

+0

感谢您的回复。我基本需要的是MessageID。将新邮件放入发送文件夹时收到AddItem消息。该对象是一个'Outlook.MailItem'使用这个,我想获得相应的MessageID。使用MAP或EWS将是可能的,EWS是首选方法。你有更多关于如何实现这一点的信息吗? – TomS

+0

我认为更简单的方法是OutlookRedemption。当我遇到类似的问题,那就是我所走的道路。有关EWS,请参阅https://blogs.msdn.microsoft.com/brijs/2009/02/06/how-to-do-finditem-and-getitem-operations-of-exchange-web-services-using-vb-net/ –

+0

请考虑将答案标记为已接受。 –

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

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

如果扩展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")