Berlangganan metode untuk acara penambahan item dari Items Collection Dengan C#

Saat ini saya sedang memigrasikan tambahan VSTO yang ditulis dalam VB ke C# untuk Outlook.

Ide umumnya adalah mencatat setiap informasi email ke dalam database saya sendiri. Saya telah mencari secara menyeluruh dan tampaknya peristiwa NewMail/NewMailEX (dari objek aplikasi) adalah pilihan terbaik untuk menanganinya.

Namun, kedua peristiwa tersebut tidak akan memicu email yang diterima saat klien Outlook tidak aktif. Saya mengalami masalah saat mencoba memproses semua email yang diunduh saat startup dari server pertukaran, jadi menurut saya acara "Penambahan item" dari koleksi item, mungkin mengatasi masalah ini.

Saya tahu pasti bahwa ini dapat diatasi dalam acara "penambahan item" karena kami sebenarnya menangani masalah ini dalam kode VB.

Namun, ketika mencoba berlangganan acara "tambahan item" untuk setiap folder Kotak Masuk di Outlook, tidak terjadi apa-apa! Tidak ada kesalahan atau pengecualian apa pun.

dalam kode VB kami, kami dapat mengikuti acara yang disebutkan dengan kode ini:

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

Ini kode C# saya yang gagal:

//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 sumber
comment
Apakah ini berfungsi bila Anda hanya berlangganan satu akun dan satu kotak masuk?   -  person Markus Deibel    schedule 19.10.2019
comment
aku melakukannya, tapi tidak berhasil.   -  person Esquilax    schedule 19.10.2019


Jawaban (2)


Objek yang memunculkan peristiwa (myInboxItems) harus hidup - jika tidak maka akan dilepaskan oleh Pengumpul Sampah dan tidak ada peristiwa yang dimunculkan. Pola yang biasa dilakukan adalah dengan memperkenalkan kelas wrapper Anda sendiri yang mengambil objek COM yang dimaksud (Item) sebagai parameter konstruktor, menyimpannya di anggota kelas dan menyiapkan event handler. Anda kemudian dapat membuat kelas pembungkus untuk setiap folder Kotak Masuk dan menyimpan setiap pembungkus dalam daftar. Daftar tersebut harus dideklarasikan pada tingkat kelas untuk memastikannya (dan item-itemnya) tetap hidup ketika InitialOutlookConfiguration() selesai.

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!");
    }

Kalau-kalau ada yang mengalami masalah yang sama, terima kasih Dmitry atas wawasan Anda tentang pemulung!

person Esquilax    schedule 21.10.2019