Подписание метода для события добавления элемента из коллекции элементов с помощью С#

В настоящее время я переношу добавление VSTO, написанное на VB, на C # для Outlook.

Общая идея состоит в том, чтобы регистрировать каждую информацию об электронной почте в моей собственной базе данных. Я тщательно искал, и кажется, что события NewMail/NewMailEX (из объекта приложения) - лучшие варианты для его обработки.

Однако оба события не будут срабатывать для сообщений электронной почты, полученных, когда клиент Outlook не работает. У меня возникли проблемы при попытке обработать все письма, загружаемые при запуске с сервера обмена, поэтому я подумал, что событие «Item-add» из коллекции элементов может решить эту проблему.

Я точно знаю, что это можно решить с помощью события "item-add", потому что мы фактически обрабатываем эту проблему в коде VB.

Однако при попытке подписаться на событие «добавление элемента» для каждой папки «Входящие» в Outlook ничего не происходит! Нет ни ошибки, ни исключения.

в нашем коде VB нам удалось подписаться на упомянутое событие с помощью этого кода:

outlookNameSpace = Me.Application.GetNamespace("MAPI")
inbox = outlookNameSpace.Stores(account).GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox)
Mailitem = inbox.Items

Private Sub Items_ItemAdd(ByVal item As Object) Handles Mailitem.ItemAdd

Вот мой неудачный код С#:

//looping to fetch all my inboxes
public static void InitialOutlookConfiguration(Outlook.Application myOutlookInstance)
{
    Outlook.Accounts myAccounts = myOutlookInstance.GetNamespace("MAPI").Accounts;
    foreach(Outlook.Account myAccount in myAccounts)
    {
        Outlook.MAPIFolder inbox = myAccount.DeliveryStore.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
        string storeID = myAccount.DeliveryStore.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox).StoreID;
        myInboxes.Add(inbox, storeID);

        foreach(Outlook.MAPIFolder inbox in myInboxes.Keys)
        {
            Outlook.Items myInboxItems = inbox.Items;
            myInboxItems.ItemAdd += new Outlook.ItemsEvents_ItemAddEventHandler(OnNewItem);
        }
    }
}

person Esquilax    schedule 19.10.2019    source источник
comment
Работает ли это, когда вы подписываетесь только на одну учетную запись и один почтовый ящик?   -  person Markus Deibel    schedule 19.10.2019
comment
я сделал, но это не работает.   -  person Esquilax    schedule 19.10.2019


Ответы (2)


Объект, вызывающий события (myInboxItems), должен быть живым, иначе он будет освобожден сборщиком мусора, и никакие события не возникнут. Обычный шаблон заключается в том, чтобы ввести свой собственный класс-оболочку, который принимает рассматриваемый COM-объект (элементы) в качестве параметра конструктора, сохраняет его в члене класса и устанавливает обработчик событий. Затем вы можете создать этот класс-оболочку для каждой папки «Входящие» и сохранить каждую оболочку в списке. Этот список должен быть объявлен на уровне класса, чтобы гарантировать, что он (и его элементы) останется в живых после завершения InitialOutlookConfiguration().

person Dmitry Streblechenko    schedule 20.10.2019

    public List<Outlook.Items> myInboxMailItems = new List<Outlook.Items>();
    public Items InboxMails;


    private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        //watch.Start();
        //chequear el orden en que solicitamos la ejecucion de la configuracion
        //this.Application.Startup += new Outlook.ApplicationEvents_11_StartupEventHandler(OnOutlookOutlookStartup);
        Outlook.Accounts myAccounts = this.Application.GetNamespace("MAPI").Accounts;
        foreach (Outlook.Account myAccount in myAccounts)
        {
            Outlook.MAPIFolder inbox = myAccount.DeliveryStore.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
            myInboxMailItems.Add(inbox.Items);

            foreach (Outlook.Items i in myInboxMailItems)
            {
                i.ItemAdd += new Outlook.ItemsEvents_ItemAddEventHandler(test);
            }
        }
    }


    public void test(object i)
    {
        System.Windows.Forms.MessageBox.Show("Eureka!");
    }

На всякий случай, если у кого-то возникнет такая же проблема, спасибо Дмитрию за понимание сборщика мусора!

person Esquilax    schedule 21.10.2019