Outlook VSTO - 如何在关闭时拦截电子邮件

Outlook VSTO - How to intercept an email at the time of its closure

我正在编写一些代码来拦截用户并在不满足某些条件时提示他们做某事。我的问题是我希望用户通过单击右上角的 x 关闭电子邮件。我正在使用

收听此内容

展望。ItemEvents_10_CloseEventHandler

基本代码:

private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        public Outlook.MailItem OriginalMailItem
        ((Outlook.ItemEvents_10_Event)OriginalMailItem).Close += new Outlook.ItemEvents_10_CloseEventHandler(Item_Close);
    }

函数:

void Item_Close(ref bool Cancel)
    {
    // Do something with the OriginalMailItem here
        private Outlook.MAPIFolder workersavefolder = ohaworker.Inbox.Folders[ohaworker.WorkerJobFolderName];
        Outlook.MailItem workerMailItem = OriginalMailItem.Move(workersavefolder);
    }

鉴于以下错误,我无法在此处对目标电子邮件执行任何操作:

“不能在此事件过程中使用该项目的属性和方法。”

我认为基本原因可能是因为电子邮件即将关闭。我的问题是 - 有没有其他方法我仍然可以在关闭后获取这封电子邮件并对其进行处理?

我最初的想法是我可能会获取 EntryID 或对话 ID,然后以某种方式通过其他方式获取电子邮件,但我似乎无法找到任何可以连接的东西以便我可以继续代码。欢迎评论和反馈!

谢谢

是的,您可以稍后在离开事件处理程序时通过项目的条目 ID 重新打开该项目。您可以使用 Timer(在主线程上运行时使用来自 Forms 命名空间的那个)或使用 Dispatcher.CurrentDispatcher.InvokeAsync()

您可以使用 NameSpace.GetItemFromID 方法,其中 returns 由指定条目 ID(如果有效)标识的 Microsoft Outlook 项目。因此,要获取有效对象并获取其属性,您可以使用 GetItemFromID 方法。

请注意,Outlook 对象模型使用单线程单元模型,因此来自辅助线程的任何访问都可能导致由 OOM 生成的异常。如果要处理 OOM,则需要使用主线程。这就是为什么您需要获取在主线程上触发的任何事件 - System.Windows.Forms.Timer 或任何其他机制。