Outlook VSTO 插件 - 在 OLK 规则执行之前处理 MailItem

Outlook VSTO addin - process MailItem before OLK rules do

在我的 OLK 2016 插件中我定义了

private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
   this.Application.NewMail += new Microsoft.Office.Interop.Outlook.ApplicationEvents_11_NewMailEventHandler(ThisApplication_NewMail);
}

在 ThisApplication_NewMail 中,我有一些代码可以在邮件到达时对邮件进行分类,具体取决于发件人等。这很好用。 然而,我也在 OLK 中定义了一些 "move email" 类型的规则(邮件被移动到嵌套在收件箱中的文件夹中,而不是邮箱之外),这些规则有时适用于应该由我分类的邮件加入。 方法入口上的断点没有发生,这表明手动定义的规则在我的代码之前处理邮件(因为缺乏更明智的技术解释)。

所以我正在寻找一种方法,我可以用不同的方式编写代码以便在手动定义规则之前使用我的代码进行处理,或者在两者之间定义优先级,或者在这些行中定义一些优先级。

我想解决它的一种方法是简单地枚举收件箱中的所有文件夹和 运行 我的 IF,但是,这可能会导致性能下降,因为有很多待处理的未读邮件。

有人对如何实现我的场景有更好的想法吗?指点就够了,不一定要代码

所有事件都是异步的,而且服务器端规则几乎可以保证 运行 在您的代码执行之前。

尝试在收件箱文件夹、垃圾邮件和规则指向的所有文件夹上设置 Items.ItemAdd 事件处理程序。

首先,NewMail 事件不会为您提供收到电子邮件的上下文。当收件箱中收到一封或多封新电子邮件时触发。如果要处理到达收件箱的项目,请考虑对收件箱中的项目集合使用 ItemAdd 事件。 ItemAdd 事件传递对添加到文件夹的每个项目的引用。

另外,我建议尝试 NewMailEx event which is fired for once for every received item that is processed by Microsoft Outlook. The NewMailEx event fires when a new message arrives in the Inbox and before client rule processing occurs. You can use the Entry ID returned in the EntryIDCollection array to call the NameSpace.GetItemFromID 方法并处理该项目。请谨慎使用此方法,以尽量减少对 Outlook 性能的影响。但是,根据客户端计算机上的设置,在新邮件到达收件箱后,垃圾邮件过滤和将新邮件从收件箱移动到另一个文件夹的客户端规则等过程可能会异步发生。您不应该假设在这些事件触发后,收件箱中的项目数量总是会增加一个项目。