C# 使用一种方法来;项目加上「;来自“的事件”;项目“;用C语言收集#
我目前正在将用VB编写的VSTO加载项迁移到C#for outlook 总体思路是将每一封电子邮件信息都记录到我自己的数据库中。 我已经彻底搜索过了,似乎NewMail/NewMailEX事件(来自应用程序对象)是处理它的最佳选项 但是,outlook客户端关闭时收到的电子邮件不会触发这两个事件。 我在尝试处理启动时从exchange服务器下载的所有邮件时遇到问题,因此我认为items collection中的“Item add”事件可能会解决此问题 我知道这可以在“item add”事件中解决,因为我们实际上是在VB代码中处理这个问题 但是,当您尝试为Outlook中的每个收件箱文件夹订阅“项目添加”事件时,什么都不会发生! 没有抛出任何错误或异常 在我们的VB代码中, 我们可以通过以下代码成功注册上述事件:C# 使用一种方法来;项目加上「;来自“的事件”;项目“;用C语言收集#,c#,visual-studio,events,outlook,C#,Visual Studio,Events,Outlook,我目前正在将用VB编写的VSTO加载项迁移到C#for outlook 总体思路是将每一封电子邮件信息都记录到我自己的数据库中。 我已经彻底搜索过了,似乎NewMail/NewMailEX事件(来自应用程序对象)是处理它的最佳选项 但是,outlook客户端关闭时收到的电子邮件不会触发这两个事件。 我在尝试处理启动时从exchange服务器下载的所有邮件时遇到问题,因此我认为items collection中的“Item add”事件可能会解决此问题 我知道这可以在“item add”事件中解决
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#代码:
引发事件的对象(myInboxItems)必须处于活动状态,否则它将被垃圾收集器释放,并且不会引发任何事件。 通常的模式是引入您自己的包装器类,该类将有问题的COM对象(项)作为构造函数参数,将其存储在类成员中并设置事件处理程序。然后,您可以为每个收件箱文件夹创建包装器类,并将每个包装器存储在列表中。必须在类级别声明该列表,以确保它(及其项)在InitialOutlookConfiguration()完成时保持活动状态
public List myInboxMailItems=new List();
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!");
}
邮件中的公共物品;
私有void ThisAddIn_启动(对象发送方,System.EventArgs e)
{
//watch.Start();
//在结构设计方面的要求
//this.Application.Startup+=新建Outlook.ApplicationEvents\u 11\u StartupEventHandler(OnOutlookOutStartup);
Outlook.Accounts myAccounts=this.Application.GetNamespace(“MAPI”).Accounts;
foreach(Outlook.Account myAccount在myAccounts中)
{
Outlook.MapipFolder inbox=myAccount.DeliveryStore.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
添加(inbox.Items);
foreach(myInboxMailItems中的Outlook.Items i)
{
i、 ItemAdd+=新Outlook.ItemsEvents\u ItemAddEventHandler(测试);
}
}
}
公共无效测试(对象i)
{
System.Windows.Forms.MessageBox.Show(“Eureka!”);
}
以防有人坚持同样的问题,感谢Dimitry对垃圾收集器的洞察 当你只订阅一个帐户和一个收件箱时,它能工作吗?我做了,但它不工作。
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!");
}