VSTO itemadd事件不一致触发



我对VSTO和c#编程很陌生,并且是自学的。我创建了一个Outlook插件,它可以做几件事。其中一个特性是,它接收所有发送的项并将它们添加到数据库中。当用户从Outlook发送电子邮件时,它会按预期工作,并完美地提示/添加它。但是当他们用手机发送电子邮件时,它只会提示他们发送的最后一封邮件。我预计,一旦他们打开Outlook并下载了最新发送的项目,它就会提示他们将每个项目保存到数据库中。但它只提示最后下载的项目,而不是每个下载。我认为需要某种形式的队列,但我找不到任何例子。如有任何帮助,我将不胜感激。

这是我的代码。

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(SentFolderItemAdded);
}
private void SentFolderItemAdded(object item)
{
// Code to prompt the user and add it to the DB
}

很可能在你的代码有机会在启动时在文件夹上设置事件接收器之前,旧消息就被同步到缓存文件夹了。

您可以持久化(注册表等)您同步的最后一个项目的创建日期,除了使用ItemAdd事件监视新项目外,还可以使用Items.RestrictItems.Find/FindNext处理启动时比保存日期更新的所有项目,搜索条件基于保存的日期。

首先,您需要在全局作用域(类级别)声明源对象,以防止它被GC从堆中清除。

Outlook.Items _items = null;
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(SentFolderItemAdded);
}
private void SentFolderItemAdded(object item)
{
// Code to prompt the user and add it to the DB
}

请注意,当多个项目被添加到文件夹(超过16个)时,ItemAdd事件不会被触发。在处理Outlook对象模型时,这是一个已知的问题。

如果项目是在订阅ItemAdd事件之前从Exchange服务器同步的,则可以使用items类的Find/FindNext或Restrict方法来过滤项目。在这种情况下,您可以处理与搜索条件相对应的项。关于这些方法的更多信息,请参阅我为这个技术博客撰写的以下文章:

  • 如何:使用Find和FindNext方法从文件夹中检索Outlook邮件项目(c#, VB.NET)
  • 如何:使用Restrict方法从文件夹
  • 中检索Outlook邮件项目

你也可以找到一个类似的解决方案来处理传入的电子邮件(在相同的情况下),参见Outlook NewMail释放:编写一个工作的解决方案(c#示例)。

最新更新