Outlook VSTO NewMailEx не срабатывает для нового хранилища

Я разрабатываю плагин для 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 работает как обычно.

Есть ли у вас какие-либо идеи, как это исправить или какой-то обходной путь?


person user1570891    schedule 25.06.2017    source источник


Ответы (1)


Ваш обработчик события items_ItemAdd никогда не сработает, потому что вы установили обработчик события для неявной переменной, созданной компилятором в строке inbox.Items.ItemAdd += items_ItemAdd. Вам нужно сохранить объект Items в специальной переменной (или в событии лучше List<Items>), чтобы убедиться, что он остается в живых, и GC никогда его не выпускает.

person Dmitry Streblechenko    schedule 26.06.2017