การสมัครวิธีการเพิ่มเหตุการณ์จาก Items Collection ด้วย C #

ขณะนี้ฉันกำลังย้ายการเพิ่ม VSTO ที่เขียนใน VB ไปยัง C# สำหรับ Outlook

แนวคิดทั่วไปคือบันทึกข้อมูลอีเมลทุกรายการลงในฐานข้อมูลของฉันเอง ฉันได้ค้นหาอย่างละเอียดแล้วและดูเหมือนว่าเหตุการณ์ 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);
        }
    }
}

person Esquilax    schedule 19.10.2019    source แหล่งที่มา
comment
ใช้งานได้หรือไม่เมื่อคุณสมัครสมาชิกเพียงบัญชีเดียวและกล่องจดหมายเดียว   -  person Markus Deibel    schedule 19.10.2019
comment
ฉันทำ แต่มันใช้งานไม่ได้   -  person Esquilax    schedule 19.10.2019


คำตอบ (2)


อ็อบเจ็กต์ที่ทำให้เกิดเหตุการณ์ (myInboxItems) จะต้องมีชีวิตอยู่ - ไม่เช่นนั้นจะถูกปล่อยโดย Garbage Collector และไม่มีเหตุการณ์ใดเกิดขึ้น รูปแบบปกติคือการแนะนำคลาส wrapper ของคุณเองที่รับอ็อบเจ็กต์ COM ที่ต้องการ (Items) เป็นพารามิเตอร์ Constructor เก็บไว้ในสมาชิกของคลาส และตั้งค่าตัวจัดการเหตุการณ์ จากนั้นคุณสามารถสร้างคลาส wrapper สำหรับแต่ละโฟลเดอร์ Inbox และจัดเก็บแต่ละ wrapper ไว้ในรายการ รายการนั้นจะต้องได้รับการประกาศในระดับชั้นเรียนเพื่อให้แน่ใจว่า (และรายการต่างๆ ในรายการ) จะยังคงอยู่เมื่อ 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!");
    }

ในกรณีที่ใครยังติดอยู่กับปัญหาเดียวกัน ขอขอบคุณ Dimitry สำหรับข้อมูลเชิงลึกของคนเก็บขยะ!

person Esquilax    schedule 21.10.2019