发送邮件后获取Message-ID
Get Message-ID after send mail
对于我的 outlook 插件,我需要处理电子邮件,计算一个 唯一的 散列并将这个散列存储在 server/database 上。例如:
有4个用户:
- user1@company.com
- user2@company.com
user3@company.com
randomperson@gmail.com
案例一:
User1 向 User2 和 User3 发送邮件。 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,User3 和 randomperson.因为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 想向 User1、User2 和 User3[=69 发送邮件=].因为randomperson不属于他们公司,User1想使用功能StoreFromInbox()
。所有三个用户收件箱中的邮件都具有相同的 Message-ID。但是他们有不同的 _PR_SEARCH_KEY_ ,所以我们不能使用这个 属性.
尝试使用 PR_SEARCH_KEY
MAPI 属性 - 在邮件发送并移动到“已发送邮件”文件夹后它应该保持不变。
对于我的 outlook 插件,我需要处理电子邮件,计算一个 唯一的 散列并将这个散列存储在 server/database 上。例如:
有4个用户:
- user1@company.com
- user2@company.com
user3@company.com
randomperson@gmail.com
案例一:
User1 向 User2 和 User3 发送邮件。 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,User3 和 randomperson.因为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 想向 User1、User2 和 User3[=69 发送邮件=].因为randomperson不属于他们公司,User1想使用功能StoreFromInbox()
。所有三个用户收件箱中的邮件都具有相同的 Message-ID。但是他们有不同的 _PR_SEARCH_KEY_ ,所以我们不能使用这个 属性.
尝试使用 PR_SEARCH_KEY
MAPI 属性 - 在邮件发送并移动到“已发送邮件”文件夹后它应该保持不变。