将 Outlook.ItemsEvents_ItemAddEventHandler 添加到所有商店

问题描述 投票:0回答:1

我正在创建一个 Outlook 插件,当新电子邮件到达收件箱时,该插件会触发一个事件。但我的配置文件有多个多种类型的商店,因此在所有商店的循环中,我仅过滤邮箱类型(以排除共享文件夹或其他项目)。然后我想向该商店的收件箱添加一个事件。

一切都很好,除了......它只适用于一家商店,而不适用于所有商店。它始终是序列中的最后一个,但序列是随机的,因此触发器始终位于不同的收件箱上。我很确定我需要在某处添加一个标识符来区分事件中的商店。但我忽略了什么?

到目前为止我的代码(有效但仅适用于一个收件箱):

public partial class ThisAddIn
{
    Outlook.MAPIFolder inbox;
    Outlook.Items items;
    Outlook.NameSpace ns;
    Outlook.Stores stores;
    Outlook.Store store;

    private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {

        ns = Application.GetNamespace("MAPI");
        stores = ns.Stores;

        for (int i = 1; i <= stores.Count; i++)
        {
            store = stores[i];

            if (store.ExchangeStoreType == OlExchangeStoreType.olExchangeMailbox || store.ExchangeStoreType == OlExchangeStoreType.olPrimaryExchangeMailbox || store.ExchangeStoreType == OlExchangeStoreType.olAdditionalExchangeMailbox) 
            {
                inbox = store.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox);
                items = inbox.Items;
                items.ItemAdd += new Outlook.ItemsEvents_ItemAddEventHandler(items_ItemAdd);
            }

            if (store != null)
                Marshal.ReleaseComObject(store);
        }
    }
    
    void items_ItemAdd(object Item)
    {
        Outlook.MailItem mail = (Outlook.MailItem)Item;
        if (Item != null)
        {
            if (mail.MessageClass == "IPM.Note")
            {
                Debug.Print("A new email has arrived.");
            }
        }
    }
}
过去曾问过一个“类似的问题”,但我不明白 Items 对象应该去哪里。我明白问题是什么,但不是解决问题的正确想法。 谁能推动我朝正确的方向前进?

您需要为每个
c# vsto outlook-addin
1个回答
0
投票
对象创建一个包装类 - 使其在构造函数中获取

Store

 对象的实例,使用 
Store.GetDefaultFolder
 检索收件箱文件夹,将 
Items
 对象存储在该包装类中,然后设置 
ItemAdd
 事件处理程序。您的插件调用将所有包装器存储在列表中(
List<MyStoreWrapper>
) - 您可以在循环中将新包装器添加到该列表中
Namespace.Stores

© www.soinside.com 2019 - 2024. All rights reserved.