发送邮件后获取Message-ID

Get Message-ID after send mail

对于我的 outlook 插件,我需要处理电子邮件,计算一个 唯一的 散列并将这个散列存储在 server/database 上。例如:

有4个用户:

案例一:

User1User2User3 发送邮件。 User2 想要存储 mailhash 服务器端,因此他单击了一个插件按钮。哈希是用这样的代码计算的

var accessor = mailItem.PropertyAccessor;
var subject = accessor.GetProperty(_PR_SUBJECT_W_TAG).ToString();
var messageId  = accessor.GetProperty(_PR_INTERNET_MESSAGE_ID_W_TAG).ToString();
var hash = CalulateHash(subject + messageId);

此散列存储在服务器上。如果 User3 也尝试存储邮件的哈希值,他会得到相同的哈希值(因为主题和消息 ID 应该相同 ==> rfc822)并且服务器知道,他已经得到了这个哈希。这很好用。

案例二: User1 想发送邮件给 User2,User3randomperson.因为randomperson不属于他们公司,User1想使用功能SendAndStore()。在发送邮件之前,在新邮件

中添加一个自定义属性
mailItem.UserProperties.Add("HandleAfterSent", MSOutlook.OlUserPropertyType.olText);
var aasProp = mailItem.UserProperties.Find("HandleAfterSent");
if (aasProp != null)
{
    aasProp.Value = "some_value";
}
mailItem.Save();

SendMailItem(mailItem);

此外,如果将新项目添加到收件箱文件夹,则有可能收到通知。所以我观察了 sent 文件夹。

inbox = outlookNameSpace.GetDefaultFolder(MSOutlook.OlDefaultFolders.olFolderSentMail);
items = inbox.Items;
items.ItemAdd += OnInboxItemAdded;

如果邮件是通过 SendMailItem(mailItem); 发送的,则会调用处理程序(也可以正常工作)。但不幸的是,我在计算发送邮件的哈希值时遇到了问题,因为这封邮件没有 Message-ID。有没有人知道如何获取刚刚发送的邮件的 Message-ID。 我已经尝试自己设置 Message-ID,但它被 MS Exchange 服务器覆盖了。

编辑: Outlook 处于缓存模式。我也需要为这种情况获取 Message-ID 的可能性。

EDIT2(除了评论): 案例 3: randomperson 想向 User1User2User3[=69 发送邮件=].因为randomperson不属于他们公司,User1想使用功能StoreFromInbox()。所有三个用户收件箱中的邮件都具有相同的 Message-ID。但是他们有不同的 _PR_SEARCH_KEY_ ,所以我们不能使用这个 属性.

尝试使用 PR_SEARCH_KEY MAPI 属性 - 在邮件发送并移动到“已发送邮件”文件夹后它应该保持不变。