Outlook 2016 VSTO文件夹添加项目事件仅触发一次

时间:2018-05-24 10:20:24

标签: c# events plugins outlook

我有一个加载项,我想在电子邮件发送成功时做点什么,我写道:

    private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        Outlook.Application application = this.Application;

        var sentMail = Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail);
        sentMail.Items.ItemAdd += new Outlook.ItemsEvents_ItemAddEventHandler(Items_ItemAdd);
    }

    void Items_ItemAdd(object item)
    {
      // do something
    }

但是当我发送第一封电子邮件成功时,我的方法只运行一次,下一封电子邮件不会触发事件。

请帮帮我!

2 个答案:

答案 0 :(得分:0)

您正在隐式局部变量上设置事件处理程序。一旦垃圾收集器释放该变量,就不会触发任何事件。您需要有一个全局(类)Items变量:

private Outlook.Items _items;
private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        Outlook.Application application = this.Application;

        _items = Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail).Items;
        _items.ItemAdd += new Outlook.ItemsEvents_ItemAddEventHandler(Items_ItemAdd);
    }

答案 1 :(得分:0)

我也想发布我的解决方案。 我几乎尝试了在stackoverflow上建议的所有内容,但效果不佳,包括将“ Items”添加到列表中,这样就不会收集垃圾,等等。

最适合我的方法是告诉GC不要显式收集“项目”,然后开始提取收件箱中的每个新项目。

这是我最终使用的代码:

public partial class ThisAddIn
{
    // Keep a static copy of the Inbox and Items
    private static MAPIFolder Inbox { get; set; }
    private static Items Items { get; set; }

    private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        Inbox = Application.Session.GetDefaultFolder(OlDefaultFolders.olFolderInbox);
        Items = Inbox.Items;
        Items.ItemAdd += new ItemsEvents_ItemAddEventHandler(ProcessesEmail);

        // Tell the GC to *not* collect these objects
        GC.KeepAlive(Inbox);
        GC.KeepAlive(Items);
    }

    public static void ProcessesEmail(object Item)
    {
        // Rest of your code here
    }
}