Привязка метода к событию «item-add» из коллекции «Items» с C # - PullRequest
0 голосов
/ 19 октября 2019

В настоящее время я выполняю миграцию надстройки VSTO, написанной на VB, на C # для внешнего вида.

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

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

Я знаю, что длятот факт, что это может быть решено в событии «добавление элемента», потому что мы на самом деле решаем эту проблему в коде 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

Вот мой ошибочный код C #:

//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);
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 21 октября 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!");
    }

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

0 голосов
/ 20 октября 2019

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

...