使用C#

时间:2019-10-19 01:58:14

标签: c# visual-studio events outlook

我目前正在将以VB编写的VSTO插件迁移到C#中以获取前景。

通常的想法是将每个电子邮件信息记录到我自己的数据库中。 我已经进行了彻底的搜索,似乎NewMail / NewMailEX事件(来自应用程序对象)是处理它的最佳选择。

但是,当Outlook Client关闭时,两个事件都不会触发收到的电子邮件。 我在尝试处理从交换服务器启动时下载的所有邮件时遇到问题,因此我认为项目集合中的“项目添加”事件可能会解决此问题。

我知道这一点可以在“ item-add”事件中解决,因为我们实际上是在VB代码中处理此问题的。

但是,当尝试为Outlook中的每个“收件箱”文件夹添加“ item-add”事件时,什么也没有发生! 没有任何错误也没有引发异常。

在我们的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 :(得分:0)

引发事件的对象(myInboxItems)必须处于活动状态-否则它会被垃圾收集器释放,并且不会引发任何事件。 通常的模式是引入您自己的包装器类,该包装器类将有问题的COM对象(Items)作为构造函数参数,将其存储在类成员中并设置事件处理程序。然后,您可以为每个“收件箱”文件夹创建该包装器类,并将每个包装器存储在列表中。必须在类级别上声明该列表,以确保在InitialOutlookConfiguration()完​​成时该列表(及其项目)保持活动状态。

答案 1 :(得分:0)

    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对垃圾收集器的见识!