我有一个加载项,我想在电子邮件发送成功时做点什么,我写道:
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
Outlook.Application application = this.Application;
var sentMail = Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail);
sentMail.Items.ItemAdd += new Outlook.ItemsEvents_ItemAddEventHandler(Items_ItemAdd);
}
void Items_ItemAdd(object item)
{
// do something
}
但是当我发送第一封电子邮件成功时,我的方法只运行一次,下一封电子邮件不会触发事件。
请帮帮我!
答案 0 :(得分:0)
您正在隐式局部变量上设置事件处理程序。一旦垃圾收集器释放该变量,就不会触发任何事件。您需要有一个全局(类)Items变量:
private Outlook.Items _items;
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
Outlook.Application application = this.Application;
_items = Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail).Items;
_items.ItemAdd += new Outlook.ItemsEvents_ItemAddEventHandler(Items_ItemAdd);
}
答案 1 :(得分:0)
我也想发布我的解决方案。 我几乎尝试了在stackoverflow上建议的所有内容,但效果不佳,包括将“ Items”添加到列表中,这样就不会收集垃圾,等等。
最适合我的方法是告诉GC不要显式收集“项目”,然后开始提取收件箱中的每个新项目。
这是我最终使用的代码:
public partial class ThisAddIn
{
// Keep a static copy of the Inbox and Items
private static MAPIFolder Inbox { get; set; }
private static Items Items { get; set; }
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
Inbox = Application.Session.GetDefaultFolder(OlDefaultFolders.olFolderInbox);
Items = Inbox.Items;
Items.ItemAdd += new ItemsEvents_ItemAddEventHandler(ProcessesEmail);
// Tell the GC to *not* collect these objects
GC.KeepAlive(Inbox);
GC.KeepAlive(Items);
}
public static void ProcessesEmail(object Item)
{
// Rest of your code here
}
}