- C#编程大幅提高OUTLOOK的邮件搜索能力!

原文:[原创] - C#编程大幅提高OUTLOOK的邮件搜索能力!

使用OUTLOOK, 你有没有遇到过上图的问题? 多达18419封邮件! 太多了, 每次想找一个邮件都非常耗时, 想办法解决这个问题成了一件非常紧迫的事情. 利用MS Search当然可以, 但是它太heavy了, 而且不支持如逻辑搜索表达式等复杂查找功能, 怎么办? 幸运的是我有WEBUS2.0 SDK, 于是我决定自己开发一个名为Outlook Searcher (Outlook搜索精灵) 的小工具. 

Outlook搜索精灵主要包含两个功能:

1. 读取Outlook中的邮件信息并创建全文索引;

2. 提供搜索功能, 支持各种复杂的逻辑表达式.

先看看如何读取Outlook:

引用COM组件:

我这里引用的是9.4版本. 对应Outlook2010. 然后添加访问Outlook的代码:

using Outlook = Microsoft.Office.Interop.Outlook;

...

Outlook.Application OutlookApp;
Outlook.NameSpace OutlookNS;
Outlook.MAPIFolder Inbox;
Outlook.MAPIFolder Sentbox;

...

void InitOutlookApp()
{
    if (OutlookApp == null)
    {
        OutlookApp = new Outlook.Application();
        OutlookNS = OutlookApp.GetNamespace("MAPI");
        Inbox = OutlookNS.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox); //获取默认的收件箱
        Sentbox = OutlookNS.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail); //获取默认的已发邮件
    }
}

Outlook以Folder的方式来管理收件箱, 发件箱, 已发邮件等. 一般情况下, 我们接收的邮件都在"收件箱"中, 发出的邮件都在"已发邮件"中, 因此我们从这两个文件夹中获取邮件信息. 为了更加方便使用, 我创建了一个MailInfo类型来存放需要索引的邮件内容:

public class MailInfo
{
    public string EntryId { get; set; }
    public string Folder { get; set; }
    public string From { get; set; }
    public string Subject { get; set; }
    public string ConversationId { get; set; }
    public string Body { get; set; }
    public string To { get; set; }
    public Document ToDoc()
    {
        var doc = new Document();
        doc.Fields.Add(new Field("EntryId", this.EntryId, Webus.Documents.FieldAttributes.None));
        doc.Fields.Add(new Field("Folder", this.Folder, Webus.Documents.FieldAttributes.Index));
        doc.Fields.Add(new Field("From", this.From, Webus.Documents.FieldAttributes.Index));
        doc.Fields.Add(new Field("Subject", this.Subject, Webus.Documents.FieldAttributes.AnalyseIndex));
        doc.Fields.Add(new Field("ConversationId", this.ConversationId, Webus.Documents.FieldAttributes.Index));
        doc.Fields.Add(new Field("Body", this.Body, Webus.Documents.FieldAttributes.AnalyseIndex));
        doc.Fields.Add(new Field("To", this.To, Webus.Documents.FieldAttributes.Index));
        return doc;
    }
    public MailInfo()
    {

    }
    public MailInfo(Document doc)
    {
        this.EntryId = doc.GetField("EntryId").Value.ToString();
        this.Folder = doc.GetField("Folder").Value.ToString();
        this.From = doc.GetField("From").Value.ToString();
        this.Subject = doc.GetField("Subject").Value.ToString();
        this.ConversationId = doc.GetField("ConversationId").Value.ToString();
        this.Body = doc.GetField("Body").Value.ToString();
        this.To = doc.GetField("To").Value.ToString();
    }
}

它还兼具了Mapping的功能, 能够在MailInfo和Webus.Document之间进行转换. 并且为每个字段都设定了索引选项. 现在一切就绪, 只欠东风了. 废话少说, 直接上代码:

先创建索引对象:

IIndexer IndexAccessor = null;
...
private void frmOutlookSearcher_Load(object sender, EventArgs e)
{
    ...
    this.IndexAccessor = new IndexManager(new MailAnalyzer()); //用MailAnalyzer作为分析器
    this.IndexAccessor.MaxIndexSize = int.MaxValue; //索引大小无限制
    this.IndexAccessor.MinIndexSize = int.MaxValue; //索引大小无限制
    this.IndexAccessor.MergeFactor = int.MaxValue; //不做merge
    ...
}
...
private void IndexProc()
{
    IndexAccessor.OpenOrNew(AppDomain.CurrentDomain.BaseDirectory + @"Index"); //索引数据放在运行目录的"Index"文件夹里面
    ...
    //读取outlook, 添加文档到索引
    ...
}

再循环读取邮件并添加索引文档:

while(...)
{
    //先读取inbox
    for (; InboxIndx <= Inbox.Items.Count; InboxIndx++)
    {
        ...
        this.InitOutlookApp();
        var item = Inbox.Items[InboxIndx];
        if (item is Outlook.MailItem) //注意, 并非每个inbox的item都是mailItem, 因此要做个类型检查, 否则程序会挂起, 死在那儿.
        {
            Outlook.MailItem mailItem = item as Outlook.MailItem;
            var mailInfo = new MailInfo()
            {
                EntryId = string.IsNullOrEmpty(mailItem.EntryID) ? string.Empty : mailItem.EntryID,
                From = string.IsNullOrEmpty(mailItem.SenderEmailAddress) ? string.Empty : mailItem.SenderEmailAddress,
                ConversationId = string.IsNullOrEmpty(mailItem.ConversationID) ? string.Empty : mailItem.ConversationID,
                Subject = string.IsNullOrEmpty(mailItem.Subject) ? string.Empty : mailItem.Subject,
                Body = string.IsNullOrEmpty(mailItem.HTMLBody) ? string.Empty : mailItem.HTMLBody,
                Folder = string.IsNullOrEmpty(Inbox.Name) ? string.Empty : Inbox.Name,
                To = string.IsNullOrEmpty(mailItem.To) ? string.Empty : mailItem.To
            };
            IndexAccessor.Add(mailInfo.ToDoc()); //添加文档到索引
        }
        ...
    }
    ...
    //再读取sentbox
    for (; SentboxIndex <= Sentbox.Items.Count; SentboxIndex++)
    { ... }
}

最后将IndexProc放到后台线程中运行来提高用户体验:

private void frmOutlookSearcher_Load(object sender, EventArgs e)
{
    ...
    this.IndexAccessor = new IndexManager(new MailAnalyzer()); //用MailAnalyzer作为分析器
    this.IndexAccessor.MaxIndexSize = int.MaxValue; //索引大小无限制
    this.IndexAccessor.MinIndexSize = int.MaxValue; //索引大小无限制
    this.IndexAccessor.MergeFactor = int.MaxValue; //不做merge
    ...
    IndexingTask = Task.Factory.StartNew(this.IndexProc); //在后台线程编制索引
}

OK, 大功告成! Outlook搜索精灵支持如下搜索字段:

字段 类型 描述
Subject string 邮件标题
Body string 邮件正文, HTML格式
Folder string 邮件所属目录, 比如"收件箱", "已发邮件"等
From string 发件人
To string 收件人
ConversationId string 会话ID

 

 

 

 

 

 

 

默认情况下, Outlook搜索精灵会使用

Subject="{0}" OR Body="{0}"

进行搜索, {0}会被自动替换成输入的关键词. 但是如果我们输入的本身就是一个搜索表达式, 那么Outlook搜索精灵会自动切换成高级搜索模式, 用用户输入的表达式进行搜索.

列举几个高级搜索的例子:

//1. 搜索标题含有"张三"并且正文含有"朋友聚餐"的邮件:
Subject="张三" & Body="朋友聚餐"
//2. 在已发邮件中搜索标题中含有"张三"的邮件:
Folder="[已发邮件]" AND Subject="张三"
//3. 搜索标题包含"Hotfix"的邮件: (hotfix和hotfixing都会被搜索到)
Subject WILDCARD "hotfix"

这只是部分例子, 有了WEBUS2.0 SDK的支持, Outlook搜索精灵可以轻松实现7种不同类型的搜索, 并且支持复杂的逻辑搜索表达式, 具体请看 WEBUS2.0 In Action - 搜索操作指南 - (2).

为了让Outlook搜索精灵根据体贴好用, 我还设计了一些小功能, 比如Outlook连接中断自动重连, 最小化到托盘等. enjoy吧!

下载程序 | 下载源代码

 相关信息及WEBUS2.0 SDK下载:继续我的代码,分享我的快乐 - WEBUS2.0

时间: 2024-12-25 09:53:34

- C#编程大幅提高OUTLOOK的邮件搜索能力!的相关文章

利用C#大幅提高OUTLOOK的邮件搜索能力

使用OUTLOOK, 你有没有遇到过上图的问题? 多达18419封邮件! 太多了, 每次想找一个邮件都非常 耗时, 想办法解决这个问题成了一件非常紧迫的事情. 利用MS Search当然可以, 但是它太heavy了, 而 且不支持如逻辑搜索表达式等复杂查找功能, 怎么办? 幸运的是我有WEBUS2.0 SDK, 于是我决定自己开 发一个名为Outlook Searcher (Outlook搜索精灵) 的小工具. Outlook搜索精灵主要包含两个功能: 1. 读取Outlook中的邮件信息并创建

Outlook 2010邮件搜索功能怎么使用?

1.如图所示我们点击搜索工具下面的一个"搜索框"之后再找到下面的"搜索"在里面有不少的选项,下面我们一个个来简单的介绍1: 2.我们可以利用"发件人.主题.有附件及分类状况"来找指定的内容了,如图2: 3.同样我们还可以在"搜索"-"高级查找"设置更多更详细的一些细节操作了,如图3: 4.如在此界面我们还可以利用"收件人.发件人的状况",时间等,如图4: 5.同样在"其他选择&

Outlook Express邮件丢失怎么办

  Office作为一款常用的办公软件,内含的组件也被大家常用,比如Outlook Express,那么大家知道Outlook Express邮件丢失的原因,下面小编就来介绍一下Outlook Express邮件丢失的原因,希望对大家有所帮助. 一.Outlook Express邮件丢失的原因解释 Outlook Express简称OE邮件是win2000/xp自带的官方邮件收发软件.由于程序BUG,官方发布补丁通知,并建议升级为其他邮件系统,vista系统后已弃之不用.Outlook Expr

outlook发送邮件:PHP 发送 outlook 约会邮件

<?php  $to = "other@xxxx.net";  $from = "me@xxxx.net";  $subj = "my test subject";  $msg = "this is the email body";  $header = "From: " . $from . "\r\n" .  "MIME-Version: 1.0\r\n" .

Outlook打印邮件时发生错误

症状:outlook打印邮件时收到错误信息:cannot print unless an item is selected 展开帮助后得到如下信息: This error may due to a missing or corrupt Outlprnt file.? To correct this problem, restart Outlook. If the problem persists and the file is present, it is probably corrupt an

谷歌调整Gmail界面 改善邮件搜索功能

新浪科技讯 北京时间11月2日早间消息,据知情人士今天透露,谷歌正计划在接下来 几天内推出一款全 新的Gmail界面设计,该设计将为用户提供更多的空白空间.减少页面的杂乱感.提供更多线性互动交流.全新的主题以及更方便的邮件搜索功能.Gmail会话界面全新设计,更加突出社交元素在新的界面里,新消息不会像以前那样堆积在一起,阅读不便.而谷歌为了增强社交元素,会在每条消息旁边配上发送者的资料图片,同时资料标签页的弹出也将更加迅速.文字的疏密程度将取决于用户的屏幕大小以及分辨率的高低,让用户阅读起来更加

PHP编程开发怎么提高编程效率 提高PHP编程技术_php实例

用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量,单引号则 不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的"函数"(译注:PHP手册中说echo是语言结构,不是真正的函数,故把函数加 上了双引号). 1.如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍. 2.$row['id'] 的速度是$row[id]的7倍. 3.echo 比 print 快,并且使用echo的多重参数(译注:指用

有人做过java httpclient 模拟登陆outlook 获取邮件的吗

问题描述 有人做过java httpclient 模拟登陆outlook 获取邮件的吗 有人做过java httpclient 模拟登陆outlook 获取邮件的吗 解决方案 其实现在很多可以做模拟登录的httpClient,JSOUP,htmlUnit,我做过用Jsoup做模拟登录,要做两次模拟,第一次是获得Cookie,第二次带入cookie就行了,大致思想就是这样. 解决方案二: 这种程序没有意义,因为网页是不断变化的,你应该用mapi从本地outlook获取,或者用pop协议从邮箱服务器

二维数组-C#中如何大幅提高写excel文件的速度?

问题描述 C#中如何大幅提高写excel文件的速度? 输入文件:input.txt包含以[:]号或者[t]制表符分隔的多行(实际在100万行以上)数据,每行数据个数不定. a;b;c 1;2; 1;2;3;4;5 输出文件;output.xlsx a b c 1 2 1 2 3 4 5 问题:写了个小程序处理2000行在10s以内,百万行速度就太慢,无法忍受了.求教一些能显著提高写Excel速度的方法.网上查的先变成二维数组之类的方法,效果不大.百万行在20min以内就好. 解决方案 你完全没有