Outlook 2013插件正则表达式邮件搜索问题求助
解决Outlook 2013插件的邮件搜索问题
我来帮你搞定这两个开发里的问题:
1. 如何获取所有年限的邮件
你现在只能拿到1年内的邮件,主要是因为Outlook在缓存Exchange模式下,默认只把最近1年的邮件同步到本地。直接用inbox.Items只能读取本地缓存的内容,自然拿不到更早的邮件。
最可靠的解决方法是用MAPIFolder.GetTable()方法,它可以直接从Exchange服务器拉取全量邮件,不受本地缓存限制。给你个示例代码:
Outlook.MAPIFolder inbox = this.Application.ActiveExplorer().Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox); // 创建Table对象,指定要加载的字段(EntryID用来获取完整邮件,Body可选) Outlook.Table mailTable = inbox.GetTable("", Outlook.OlTableContents.olUserItems); mailTable.Columns.Add("EntryID"); mailTable.Columns.Add("Body"); while (!mailTable.EndOfTable) { Outlook.Row row = mailTable.GetNextRow(); string entryId = row["EntryID"].ToString(); // 通过EntryID获取完整的邮件对象(如果需要更多属性的话) Outlook.MailItem mail = this.Application.Session.GetItemFromID(entryId) as Outlook.MailItem; // 这里继续你的正则匹配逻辑... }
要是你不想改用Table,也可以试试给Items集合加个排序并开启IncludeRecurrences,有时候能强制加载更多历史邮件,但这个方法的可靠性不如GetTable:
Outlook.Items items = inbox.Items; items.Sort("[ReceivedTime]", Outlook.OlSortOrder.olAscending); items.IncludeRecurrences = true;
2. 更高效的正则搜索方案
直接遍历所有邮件跑正则,在邮件多的时候肯定慢。推荐你用先粗筛、后精查的思路:
- 第一步:先用Outlook内置的筛选工具(比如
Restrict)把明显不相关的邮件过滤掉。比如你的正则里有某个固定关键词,就先把包含这个关键词的邮件挑出来:// 用SQL语法筛选正文包含指定关键词的邮件 string filter = "@SQL=\"http://schemas.microsoft.com/mapi/proptag/0x1000001F\" LIKE '%你的关键词%'"; Outlook.Items filteredItems = inbox.Items.Restrict(filter); - 第二步:只对筛选后的邮件执行正则匹配,这样需要处理的邮件数量会大幅减少,效率自然就上去了。
如果你的邮件量特别大,还可以考虑用AdvancedSearch做异步搜索,它不会卡UI,而且支持更灵活的搜索条件,体验会更好。
内容的提问来源于stack exchange,提问作者Birger
相关产品推荐
相关产品推荐

