Outlook VSTO NewMailEx未针对新存储触发

时间:2017-06-25 18:22:06

标签: events outlook vsto outlook-addin mailitem

我正在开发一个Outlook插件,并且在没有为新添加的存储调用我的回调NewMailEx时遇到问题。

我的代码看起来像下一个:

private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
    Application.ItemSend += Application_ItemSend;
    Application.NewMailEx += Application_NewMailEx;
}

private void Application_NewMailEx(string EntryIDCollection)
 {
    logger.Debug("Received e-mail with ID: {0}", EntryIDCollection);

    var outlook_namespace = Application.GetNamespace("MAPI");
    dynamic item = outlook_namespace.GetItemFromID(EntryIDCollection);

    if (!(item is Outlook.MailItem))
        return;

     // do some stuff with mail
 }

我还尝试订阅新存储空间:

{
    Application.Session.Stores.StoreAdd += Stores_StoreAdd;
}

private void Stores_StoreAdd(Outlook.Store store)
{
    logger.Info("New store is added: " + store.DisplayName);
    Outlook.MAPIFolder rootFolder = store.GetRootFolder();
    Outlook.MAPIFolder inbox = store.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
    inbox.Items.ItemAdd += items_ItemAdd;
}


private void items_ItemAdd(object item)
{
    if (item is Outlook.MailItem)
    {
        Outlook.MailItem mail = item as Outlook.MailItem;
        // do some stuff with mail
    }
}

但仅在同步期间为项目调用ItemAdd。对于新邮件,不会调用NewMailEx或ItemAdd。

但重启后一切正常,NewMailEx照常工作。

您有任何想法如何修复它或某些解决方法吗?

1 个答案:

答案 0 :(得分:0)

您的items_ItemAdd事件处理程序永远不会触发,因为您在编译器在inbox.Items.ItemAdd += items_ItemAdd行上创建的隐式变量上设置了事件处理程序。您需要将Items对象保存在专用的变量器中(或更好的事件List<Items>),以确保它保持活动状态,GC永远不会释放它。