使用Perl处理电子邮件的方法的演化

}
你也可以打开其他检查的选项,比如确定它的域名拥有一个合法的 MX 记录,修正常见的 AOL 和 Compuserve
 的邮件地址的一些错误,如下: 
    if (not Email::Valid->address(-address => 'test@example.com',
                                  -mxcheck => 1)) {
        die "Not a valid address"
    }
邮件数据转换
我们有了自己的信件,接下来会对它们做些什么呢?我发现大多是对邮件进行文本化分析,这里有三个模块可以
协助我们: 
首先是 Text::Quoted ,它获取邮件体的文本,实际上可以是任何其他文本,然后尝试找出某些引用其他邮件
的文本部分,然后将之分离并保存到嵌套的数据结构中。例如,如果我们有 
    $message = < foo
    > # Bar
    > baz

    quux
    EOF
然后运行 extract($message) 就会返回如下的数据结构: 
    [
      [
        { text => 'foo', quoter => '>', raw => '> foo' },
        [ 
            { text => 'Bar', quoter => '> #', raw => '> # Bar' } 
        ],
        { text => 'baz', quoter => '>', raw => '> baz' }
      ],

      { empty => 1 },
      { text => 'quux', quoter => '', raw => 'quux' }
    ];
当你显示邮件消息的内容时,准备用不同的颜色来区分不同的引用文本,那么这个模块就帮到你大忙了。
类似概念的还有 Text::Original 模块,用于搜寻以原始文件内容开头,没有被引用的部分。它知道如何
识别各种类型的属性行,所以有: 
    $message = < Why are there so many different mail modules?

    There's more than one way to do it! Different modules have different
    focuses, and operate at different levels; some lower, some higher.
    EOF
那么 first_sentence($message) 将返回 There's more than one way to do it!。Mariachi 
邮件列表存档程序就使用了这项技术,为一个线索中的邮件给出它的提白。 
说到邮件的线索化,Mail::Thread 模块实现了 Jamie Zawinski 的邮件线索化算法,该算法先是被 
Mozilla 所用,继而许多其他邮件客户端也开始使用这种技术。当然 Mariachi 也使用了这项技术,
最近它还作了更新,使用 Email::Abstract 来处理各种你扔过去的邮件表达对象: 
    my $threader = Mail::Thread->new(@mails);
    $threader->thread; # 计算线索
    for ($threader->rootset) { # 在一个线索内的原始邮件
        dump_thread($_);
    }
邮件过滤
经典的 Perl 的邮件过滤工具莫不就是 Mail::Audit 了,我还在这里写过关于如何使用 Mail::Audit 
模块的文章(Perl.com/pub/a/2001/07/17/mailfiltering.html">http://www.Perl.com/pub/a/2001/07/17/mailfiltering.html),以及如何与 
Mail::SpamAssassin (http://www.Perl.com/pub/a/2002/03/06/spam.html)模块相结合使用。 
我们已经提到过 Mail::ListDetector 模块好几次了。我把它和 Mail::Audit 结合在一起使用,帮助
自己做了大量的自动邮件过滤工作。Mail::Audit::List 的插件使用 ListDetector 来查找信件中的邮
件列表头信息,诸如 List-Id,X-Mailman-Version 等等类似的东西,这些头信息可以帮助判别该邮件是否来
自于邮件列表。这意味着我有能力过滤所有来自邮件列表的信件到各自的文件夹中,就像这样: 
    my $list = Mail::ListDetector->new($obj);
    if ($list) {
        my $name = $list->listname;
        $item->accept("mail/$name.-$date");
    }然而,Mail::Audit 本身还有很长一段路要走,所以如果你新架设的系统的话,我们鼓励您使用电子邮件项目
Email::Filter 模块作为替代,它们的大部分操作界面是一致的,尽管功能并不完全相同。为了追求简洁和速度,
它使用了新式的 Email::Simple 作为邮件表达对象模块。 

邮件信息挖掘

最后,我所做的比较高级的事情就是开发一个自动分类,组织,并索引邮件到数据库的应用框架,并尝试从中分
析并提取有价值的信息。 
我的第一个完成这个预期目标的模块是 Mail::Miner ,它由三个主要部分组成。第一个部分获取一封邮件后,
去除各种附件,并分别存储到数据库。第二部分纵览这封邮件并运行一系列的识别(Recogniser)模块,
如此搜寻邮件地址,电话号码,一些关键字和短语等等,并把它们存储到另一个独立的数据库表中。第三部分
为命令行工具,用来查询数据库中的邮件以及相关的信息。 
举个例子,如果我需要找 Tim O'Reilly 的邮政地址,我就会使用查询工具 mm ,从他发来的信中找出该地址: 
 % mm --from "Tim O" --address              
 Address found in message 1835 from "Tim O'Reilly" :
 Tim O'Reilly @ O'Reilly & Associates, Inc.
 1005 Gravenstein Highway North, Sebastopol, CA 95472
如果要获取完整的邮件,我可以说 
 % mm --id 1835
如果它原本包含一个附件,那么我们可能会看到类似下面的部分: 
 [ text/xml attachment something.xml detached - use
   mm --detach 208
   to recover ]
我粘贴中间的那一行 mm --detach 208 到 shell 中,然后很快的,something.xml 写到了磁盘上。 
现在 Mail::Miner 已经非常不错了,不过它把三种思想紧紧地捆绑在一个包中 -- 邮件的归档,邮件的数据
挖掘以及查询数据库的命令行界面 -- 这使得很难单独开发或者扩展每块的功能。当然,它使用了老式的 
Mail:: 名字空间。 
这引领我们走到这次邮件模块旅程的最后一站,最新发布的:Email::Store 模块。这是个基于 Class::DBI 
的应用框架,用来存储邮件到数据库并以各种方式索引: 
   use Email::Store 'dbi:SQLite:mail.db';

								
共4页 首页 上一页 [1] [2] [3] [4下一页 尾页>
上一篇: LWP 与 WEB 的基本使用
下一篇:
字母检索 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z