我目前正在将以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);
}
}
}
答案 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对垃圾收集器的见识!