我正在通过VSTO加载项对所有传入的答复执行自定义操作。加载项将传入回复的ConversationID与现有电子邮件进行比较。如果我必须在一个文件夹中搜索,效果很好,但我的问题是电子邮件可以在商店的任何文件夹中。这是我的代码。
void items_ItemAdd(object Item)
{
Outlook.Application application = new Outlook.Application();
string filter = "RE: ";
Outlook.MailItem mail = (Outlook.MailItem)Item;
Outlook.Folder folder = mail.Parent as Outlook.Folder;
if (Item != null)
{
if (mail.MessageClass == "IPM.Note" && mail.Subject.ToUpper().Contains(filter.ToUpper()))
{
var RequiredMail = (from e in folder.Items.Cast<Outlook.MailItem>().OrderBy(X => X.ReceivedTime).Where(C => C.ConversationID == mail.ConversationID) select mail).FirstOrDefault();
// Perform custom action
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}
此外,我已经阅读到使用Linq搜索电子邮件不是很有效。还有其他更有效的方法来获取RequiredMail
吗?
我们将不胜感激任何帮助。
谢谢。
答案 0 :(得分:1)
首先,您必须意识到如果将超过16个项目添加到集合中,则可能不会触发ItemAdd
事件。这是Outlook中的一个已知问题。以下系列文章介绍了可能的解决方法:
混合LINQ和COM对象不是一个好主意。您应该立即释放基础COM对象,以防止出现任何已知问题。
如果需要搜索所有文件夹中的项目,则可以使用Application类的AdvancedSearch
方法,该方法允许基于指定的DAV搜索和定位(DASL)搜索字符串执行搜索。
在Outlook中使用AdvancedSearch方法的主要好处是:
AdvancedSearch
方法会在后台自动运行该线程。Restrict
和Find
/ FindNext
方法应用于特定的Items集合(请参阅Outlook中Folder类的Items属性)。IsInstantSearchEnabled
属性)。Stop
类的Search
方法停止搜索过程。在Advanced search in Outlook programmatically: C#, VB.NET文章中了解有关此内容的更多信息。