【问题标题】:Get Message-ID after send mail发送邮件后获取 Message-ID
【发布时间】:2016-07-31 11:25:48
【问题描述】:

对于我的 Outlook 插件,我需要处理电子邮件,计算 唯一 哈希并将此哈希存储在服务器/数据库中。例如:

有 4 个用户:

  • user1@company.com
  • user2@company.com
  • user3@company.com

  • randomperson@gmail.com

案例 1:

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)并且服务器知道,他已经得到了这个哈希值.这很好用。

案例 2: User1 想向 User2User3randomperson 发送邮件。因为 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(除了 cmets): 案例 3: randomperson 想向 User1User2User3 发送邮件。因为 randomperson 不属于他们的公司,User1 想使用函数StoreFromInbox()。所有三个用户的收件箱中的邮件都具有相同的 Message-ID。但是他们有不同的 _PR_SEARCH_KEY_ ,所以我们不能使用这个属性。

【问题讨论】:

标签: c# email outlook outlook-redemption


【解决方案1】:

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

【讨论】:

  • 我应该将它用作哈希码的值吗?我更改了一些代码以使用更多的兑换功能。但目前我在使用rdoSession.GetMessageFromID(outlookMailItem.EntryID, outlookMailItem.Parent.StoreID, 0x200) as IRDOMail; 时遇到了异常。我希望即使在缓存模式下也能使用此代码获取消息 ID
  • 该死的 Outlook 缓存。如果我使用计时器并在发送邮件大约一分钟后拨打rdoSession.GetMessageFromID(outlookMailItem.EntryID, outlookMailItem.Parent.StoreID, 0x200) as IRDOMail;,也不例外。除了等待还有其他解决方案吗?
  • 当然,我不明白为什么不 - 只是散列 PR_SEARCH_KEY 的值。为什么要通过条目 ID 重新打开该项目?
  • 我在这个问题上添加了一个新的编辑。 PR_SEARCH_KEY 不是唯一的,如果收到了外部邮件(收件人 User1 找到了与收件人 User2 不同的值),因此这不是计算哈希的可能属性。 PR_SEARCH_KEY 和 PR_SENDER_SEARCH_KEY 有什么区别?
  • 如果发送消息,当然PR_SEARCH_KEY在接收方会有所不同。
猜你喜欢
  • 2022-11-04
  • 1970-01-01
  • 1970-01-01
  • 2018-06-07
  • 1970-01-01
  • 2011-07-30
  • 1970-01-01
  • 2011-10-16
  • 1970-01-01
相关资源
最近更新 更多