我正在创建一个 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 对象应该去哪里。我明白问题是什么,但不是解决问题的正确想法。
谁能推动我朝正确的方向前进?您需要为每个 Store
对象的实例,使用
Store.GetDefaultFolder
检索收件箱文件夹,将
Items
对象存储在该包装类中,然后设置
ItemAdd
事件处理程序。您的插件调用将所有包装器存储在列表中(
List<MyStoreWrapper>
) - 您可以在循环中将新包装器添加到该列表中
Namespace.Stores
。