`

教你索引邮件

阅读更多

就是教你怎样把邮件建立索引,再搜索出来。用MAPI把邮件读取到数据库里,用SharpICTCLAS做一个lucene的中文的语汇单元分析器,用lucene建立索引及查询索引。

把某目录邮件读取到数据库里的代码很简单

private static void getmails()
{
    _Application appOutlook 
= new Application();
    NameSpace outlookNS 
= appOutlook.GetNamespace("MAPI");
    outlookNS.Logon(
""nullnullnull);

    Console.WriteLine(outlookNS.Folders.Count);
    MAPIFolder inboxFolder 
= outlookNS.Folders[1].Folders["chat"];
    HandlerFolder(inboxFolder);
    outlookNS.Logoff();
}


private static void HandlerFolder(MAPIFolder inboxFolder)
{
    
foreach (object item in inboxFolder.Items)
    
{
        MailItem mi 
= item as MailItem;
        
if (mi != null)
        
{
            Console.WriteLine(
"ReceivedTime:{0}\r\nSubject:{1}", mi.ReceivedTime, mi.Subject);
            
try
            
{
                MailDAO.Add_Mail_SSH(mi.Subject, mi.Body, mi.ReceivedTime, mi.To,
                             mi.SenderName, mi.SenderEmailAddress, mi.CC 
?? "", mi.BCC ?? "");
            }

            
catch (Exception ex)
            
{
                Console.WriteLine(ex);
            }

        }

    }

}


 

为了方便测试,先弄一些假数据

class MailDAO
{
    
public static IList<Email> GetMails()
    
{
        List
<Email> ret = new List<Email>();
        Email mail 
= new Email();
        mail.Subject 
= "倡议:大家做一个.net开源的灾难管理系统";
        mail.Body 
= "倡议:大家做一个.net开源的灾难管理系统";
        mail.MailTo 
= "onlytiancai@sohu.com;onlytiancai@163.com;onlytiancai@msn.com;";
        mail.Cc 
= "onlytiancai@yahoo.com.cn;onlytiancai@126.com";
        mail.Bcc 
= "onlytiancai@qq.com;onlytiancai@sina.com;onlytiancai@gmail.com";
        mail.SenderEmailAddress 
= "onlytiancai@live.com";
        mail.SenderName 
= "蛙蛙王子";
        mail.ReceiveTime 
= DateTime.Parse("2008-05-18 12:19");
        ret.Add(mail);

        mail 
= new Email();
        mail.Subject 
= "[置顶]蛙蛙推荐:蛙蛙教你文本聚类";
        mail.Body 
= "[置顶]蛙蛙推荐:蛙蛙教你文本聚类";
        mail.MailTo 
= "onlytiancai@sohu.com;onlytiancai@163.com;onlytiancai@msn.com;";
        mail.Cc 
= "onlytiancai@yahoo.com.cn;onlytiancai@126.com";
        mail.Bcc 
= "onlytiancai@qq.com;onlytiancai@sina.com;onlytiancai@gmail.com";
        mail.SenderEmailAddress 
= "onlytiancai@live.com";
        mail.SenderName 
= "蛙蛙王子";
        mail.ReceiveTime 
= DateTime.Parse("2008-05-10 20:43");
        ret.Add(mail);

        mail 
= new Email();
        mail.Subject 
= "蛙蛙推荐:蛙蛙牌关键词提取算法";
        mail.Body 
= "蛙蛙推荐:蛙蛙牌关键词提取算法";
        mail.MailTo 
= "onlytiancai@sohu.com;onlytiancai@163.com;onlytiancai@msn.com;";
        mail.Cc 
= "onlytiancai@yahoo.com.cn;onlytiancai@126.com";
        mail.Bcc 
= "onlytiancai@qq.com;onlytiancai@sina.com;onlytiancai@gmail.com";
        mail.SenderEmailAddress 
= "onlytiancai@live.com";
        mail.SenderName 
= "蛙蛙王子";
        mail.ReceiveTime 
= DateTime.Parse("2008-05-11 23:34");
        ret.Add(mail);

        mail 
= new Email();
        mail.Subject 
= "蛙蛙推荐:蛙蛙牌软件注册码算法";
        mail.Body 
= "蛙蛙推荐:蛙蛙牌软件注册码算法";
        mail.MailTo 
= "onlytiancai@sohu.com;onlytiancai@163.com;onlytiancai@msn.com;";
        mail.Cc 
= "onlytiancai@yahoo.com.cn;onlytiancai@fetionmm.com";
        mail.Bcc 
= "onlytiancai@qq.com;onlytiancai@sina.com;onlytiancai@gmail.com";
        mail.SenderEmailAddress 
= "onlytiancai@live.com";
        mail.SenderName 
= "蛙蛙王子";
        mail.ReceiveTime 
= DateTime.Parse("2008-05-03 21:55");
        ret.Add(mail);

        
return ret;
    }

}


 

像收件人,抄送地址等用一个简单的语汇单元分析器就可以,代码如下,因为token的位置信息只在分析的时候有用,只有位置增量才会写到索引里,所以位置信息都写了-1

/**//// <summary>
/// 用于语汇单元化用简单分割字符隔开的字符串
/// </summary>

public class WawaSimpleTokenizer : Tokenizer
{
    
private readonly string _txt;
    
private List<string> _filter;
    
private int _current;
    
private bool _isStart = true;
    
private int _max;
    
public WawaSimpleTokenizer(TextReader reader)
    
{
        input 
= reader;
        _txt 
= input.ReadToEnd();
        _txt 
= _txt.ToLower().Replace("'""").Replace('"'' ');
    }


    
public override Token Next()
    
{
        
if (_isStart)
        
{
            Regex r 
= new Regex("([ \\t{}():;. \n])");
            String[] tokens 
= r.Split(_txt);
            _filter 
= new List<string>();
            
for (int i = 0; i < tokens.Length; i++)
            
{
                MatchCollection mc 
= r.Matches(tokens[i]);
                
if (mc.Count <= 0 && tokens[i].Trim().Length > 0)
                    _filter.Add(tokens[i]);
            }

            _max 
= _filter.Count-1;
            _current 
= 0;
            _isStart 
= false;
        }


        
if (_current > _max)
            
return null;

        
string word = _filter[_current];
        Token token 
= new Token(word, -1-1);
        _current
++;
        
return token;
    }

}


 

把lucene适配成lucene的分析器,有人做了,直接拿过来,链接如下
http://www.cnblogs.com/birdshover/archive/2008/03/26/1122305.html
建立索引的代码如下,写了些注释,不多说了就

public class MailIndexer
{
    
protected string _indexDirectory;
    
protected IndexWriter _writer = null;

    
protected virtual void setUp()
    
{
        
string dictPath = Path.Combine(Environment.CurrentDirectory, "Data"+ Path.DirectorySeparatorChar; //词库路径
        SharpICTCLASAnalyzer sharpICTCLASAnalyzer = new SharpICTCLASAnalyzer(dictPath); //中文分析器
        
//按域分析包装器,邮件标题、正文等用中文分析器分析
        PerFieldAnalyzerWrapper wrapper = new PerFieldAnalyzerWrapper(sharpICTCLASAnalyzer);
        WawaSimpleAnalyzer simpleAnalyzer 
= new WawaSimpleAnalyzer(); //按分隔符语汇单元化的分析器
        
//收件人,抄送和密送地址用简单解析器
        wrapper.AddAnalyzer("MailTo", simpleAnalyzer);
        wrapper.AddAnalyzer(
"Cc", simpleAnalyzer);
        wrapper.AddAnalyzer(
"Bcc", simpleAnalyzer);

        _indexDirectory 
= Path.Combine(Environment.CurrentDirectory, "mailindex"+ Path.DirectorySeparatorChar;
        ; 
//索引路径

        _writer 
= new IndexWriter(_indexDirectory, wrapper, true); //创建IndexWriter
        _writer.SetUseCompoundFile(true); //显式设置索引为复合索引
        _writer.SetMaxFieldLength(int.MaxValue); //设置域最大长度为最大值
        _writer.SetMergeFactor(100); //设置每100个段合并成一个大段
        _writer.SetMaxMergeDocs(10000); //设置一个段的最大文档数
        _writer.SetMaxBufferedDocs(1000); //设置在把索引写入磁盘前内存里文档的缓存个数
    }


    
public void ExeCute()
    
{
        
try
        
{
            setUp();
            IList
<Email> mails = MailDAO.GetMails();
            
foreach (Email mail in mails)
            
{
                
try
                
{
                    Console.WriteLine(
"正在索引:{0}", mail.Subject);
                    Document doc 
= new Document();
                    doc.Add(
new Field("Subject", mail.Subject ?? "",
                                      Field.Store.YES, Field.Index.TOKENIZED)); 
//邮件主题,分词、索引、存储——
                    doc.Add(new Field("Body", mail.Body ?? "",
                                      Field.Store.NO, Field.Index.TOKENIZED)); 
//邮件正文,分词、索引,不存储
                    doc.Add(new Field("ReceiveTime", mail.ReceiveTime.ToString("yyyyMMdd"),
                                      Field.Store.YES, Field.Index.UN_TOKENIZED)); 
//接受时间,不分词,不索引,保存
                    doc.Add(new Field("MailTo", mail.MailTo ?? "",
                                      Field.Store.YES, Field.Index.TOKENIZED)); 
//收件人,分词,索引,保存
                    doc.Add(new Field("SenderName", mail.SenderName ?? "",
                                      Field.Store.YES, Field.Index.UN_TOKENIZED)); 
//发送人姓名,不分词,索引,保存
                    doc.Add(new Field("SenderEmailAddress", mail.SenderEmailAddress ?? "",
                                      Field.Store.YES, Field.Index.UN_TOKENIZED)); 
//发送人邮件,不分词,索引,保存
                    doc.Add(new Field("Cc", mail.Cc ?? "",
                                      Field.Store.YES, Field.Index.NO)); 
//抄送,分词,索引,保存
                    doc.Add(new Field("Bcc", mail.Bcc ?? "
分享到:
评论

相关推荐

    Delphi邮件大拼盘之接收邮件

    - "’2J/属性值": 邮件索引,通常从%开始。 三、程序编制过程 1. 设计界面:在Delphi中创建新工程,添加所需的控件,如文本框、标签、按钮、列表框、多行文本框、状态栏和*12343-控件,并设置各控件属性。 2. 编制...

    关于lucene建立数据库索引的更新说明

    在本文中,我们将探讨如何使用Lucene建立数据库索引,并分享一些在实践过程中的经验和教训。Lucene是一个高性能、全文本搜索库,广泛用于构建搜索引擎。在创建索引时,需要注意以下关键点: 1. **资料的准确性**:...

    android 通讯录 (有索引)

    通常,我们使用`ContactsContract.Contacts`表来获取联系人基本信息,然后通过联系人的ID进一步查询其详细信息,如电话号码、电子邮件等。为了有索引,我们可以利用`ContactsContract.Contacts._ID`作为主键,通过`...

    C#通过POP3获取邮件

    4. **遍历并下载邮件**:使用`GetMessage()`方法获取指定索引的邮件,然后可以使用`MailMessage`类来解析邮件内容。 ```csharp for (int i = 0; i ; i++) { MailMessage message = client.GetMessage(i); ...

    IBM Lotus Domino 7 邮件服务器配置全程攻略

    《IBM Lotus Domino 7 邮件服务器配置全程攻略》是一部深入浅出的教程,针对IBM Lotus Domino 7这一版本的邮件...通过深入学习,你将能够熟练配置和管理这一强大的邮件系统,为组织提供稳定、安全、高效的邮件服务。

    POP3邮件接收.rar_CSharp pop3 _pop3_pop3接收邮件_邮件接收_閭欢鎺ユ敹

    - 查看邮件:使用Pop3类的GetMessage或GetMessages方法获取邮件列表,然后通过MessageNumber索引获取具体邮件内容。 - 修改邮件:由于POP3协议设计初衷是下载邮件,不支持在线编辑,一般不提供修改邮件功能。但...

    廖雪峰python3 完整带索引,图片 最新教程 pdf版

    SMTP发送邮件 POP3收取邮件 访问数据库 使用SQLite 使用MySQL 使用SQLAlchemy Web开发 HTTP协议简介 HTML简介 WSGI接口 使用Web框架 使用模板 异步IO 协程 asyncio async/await aiohttp 实战 file:///E|/Personal/...

    联系人列表,索引,分组

    本教程将深入探讨如何处理“联系人列表,索引,分组”这一主题,以帮助开发者更好地理解和实现相关功能。 首先,我们需要理解“联系人索引”。在Android中,联系人数据是存储在SQLite数据库中的,当联系人数量庞大...

    lucene.net 索引文件图形界面管理器

    Lucene.NET 广泛应用于各种需要全文检索功能的系统,如内容管理系统、知识库、搜索引擎、邮件系统等。通过图形界面管理器,开发者和管理员可以更直观地了解索引结构,优化搜索性能,以及进行索引维护。 **6. 扩展与...

    Python-Mailpile一个快速的电子邮件客户端

    除了加密外,Mailpile还提供了一些其他隐私保护措施,比如对搜索索引的本地存储,避免敏感信息泄露到第三方服务器。此外,用户还可以控制自己的数据,选择是否分享以及与谁分享。 6. **自托管邮件服务** Mailpile...

    C#邮件接收与发送程序

    同时,对于邮件的存储,可能需要对邮件进行一定的预处理,如压缩附件以减少数据库空间占用,或者提取关键信息(如附件名、邮件主题等)作为索引,以便快速检索。 总之,结合LumiSoft.Net和System.Net.Mail,开发者...

    Outlook专业搜索工具Lookeen

    软件类型: 办公软件,邮件搜索 运行环境:Windows 软件语言:英语,德语 授权方式:共享软件 软件大小:8.5MB 软件作者:Axonic 软件简介: Lookeen是微软Outlook插件,嵌入Outlook程序中帮助检索Outlook中的所有...

    Lucene教程

    在Lucene中,文档(Document)代表一个可被搜索的信息单元,如一篇网页或电子邮件。文档由多个字段(Field)组成,每个字段都有特定的名称和值,比如标题(Title)、内容(Content)和作者(Author)。 ### 2.2 ...

    lucene.net+完全入门教程

    10. **应用实例**: Lucene.Net常用于网站的搜索功能、大数据分析、日志分析、电子邮件搜索以及任何需要快速全文检索的场合。 通过学习这个“lucene.net+完全入门教程”,开发者可以了解如何在.NET环境中设置Lucene...

    数据库技术与应用实践教程SQL Server 2005

    报表服务(SSRS)是SQL Server 2005中的报告工具,它允许你创建交互式、多格式的报表,并能通过电子邮件或其他方式分发。学会设计和部署报表,有助于将数据库中的信息转化为有价值的信息。 最后,通过阅读《实践...

    apache下的lucene教程

    - **社区参与**:Lucene拥有活跃的开发者社区,用户可以通过邮件列表、论坛等方式获取帮助和支持。 - **官方文档与教程**:Lucene提供了丰富的官方文档和教程资源,帮助开发者快速上手。 - **书籍推荐**:《Lucene ...

    辛星笔记之Sphinx教程

    Sphinx是一个开源的全文搜索引擎,它能够为大量的数据提供索引,并提供搜索接口。由于其强大的性能和灵活性,Sphinx被广泛应用于各种...希望辛星笔记之Sphinx教程能够帮助到你,让你对Sphinx有一个全面而深入的理解。

    maildir-decrypt:用于将加密的电子邮件转换为明文电子邮件文件的脚本。 最好在使用不多的电子邮件索引软件时

    通过索引更改的内容来更新更多数据库 这“为我工作”。 这些脚本具有潜在的危险,可能会破坏/删除您的电子邮件。 这就是为什么我不在这里写下教程的原因。 阅读脚本,了解它们的作用,进行备份,以一种不会修改您的...

Global site tag (gtag.js) - Google Analytics