使用SpamAssassin停止垃圾邮件

我收到了大量的垃圾邮件;简直是堆积如山。这个月的前三天,我收到了100多封垃圾邮件。我收到的垃圾邮件实在太多了,以至于 Hormel Foods派车来运走。我相信情况正在变得越来越糟。现在我们比以往任何时候都更多地受到垃圾邮件的轰炸。

好吧,几天前,我达到了极限,决定现在所使用的简单邮件过滤方式已经不足以应对这个问题。是时候请来刺客了。

SpamAssassin

SpamAssassin 是一款基于规则的垃圾邮件识别工具。它用Perl编写,有多种使用方法:你可以调用客户端程序 spamassassin,让它判断给定邮件是否可能是垃圾邮件;你也可以采取客户端/服务器方式,这样你的客户端不必每次收到邮件时都加载和解析规则;最后,你还可以使用Perl模块接口从Perl程序中过滤垃圾邮件。

SpamAssassin 非常可配置;你可以选择使用哪些规则,改变规则对邮件“垃圾邮件分数”的贡献方式,并添加自己的规则。我们将在文章后面讨论这些特性。首先,我们来看看如何安装SpamAssassin并开始使用它?

如果你使用的是Debian Linux或BSD之一,那么这很简单:只需使用 apt 或各自的ports tree安装相应的软件包。(BSD端口名为 p5-Mail-SpamAssassin

那些不太幸运的人将不得不下载 SpamAssassin的最新版本,并自行安装。

Vipul的剃刀

SpamAssassin使用各种方式来测试一封电子邮件是否是垃圾邮件,包括对标题或正文进行简单的文本检查、检测缺失或误导性的标题,以及基于网络的检查,如中继黑洞列表和有趣的分布式系统Vipul的剃刀

Vipul的剃刀利用了垃圾邮件本质上是大量分散分布的事实。因此,你看到的很多垃圾邮件,我将来也会看到。如果有一个大型的清算所,你可以报告垃圾邮件,而我可以看到我的收件箱中的邮件是否与你的报告相匹配,那么我就可以有一个确定的方式来判断给定的邮件是否是垃圾邮件。Vipul的剃刀就是这样的清算所。

为什么叫剃刀?因为它是一个协作系统,其力量直接来自其数据库的质量,而这又回到了我们这样的用户是如何使用它的。如果终端用户报告了大量真正的垃圾邮件,剃刀就会变得更好;如果数据库被大量虚假或误导性的报告“中毒”,则整个系统的效率就会下降。

就像任何其他垃圾邮件检测机制一样,剃刀并不完美。有两个特别值得注意的点。首先,尽管它通过要求报告垃圾邮件来尽可能地避免误报(即错误地说某事物是垃圾邮件),但它对误报(即错误地说某事物不是垃圾邮件)不采取任何行动,因为它只知道其数据库中的邮件。

其次,垃圾邮件发送者就像所有其他原始生物一样,正在不断进化。Vipul的剃刀只能处理未经修改的大量发送的垃圾邮件。通过添加随机空格、字母或收件人姓名“个性化”的垃圾邮件将产生不同的签名,这些签名不会与剃刀数据库中类似的垃圾邮件消息相匹配。

尽管如此,Razor 是垃圾邮件过滤器武器库中的一个优秀补充,因为当它将某件内容标记为垃圾邮件时,你可以几乎肯定它是正确的。而且就像 SpamAssassin 一样,它完全是纯 Perl 编写的。长期以来,Mail::Audit 都支持 Razor 插件,但现在我们可以将其作为基于 SpamAssassin 和 Mail::Audit 的更全面邮件过滤系统的一部分来调用。

安装 Vipul 的 Razor 类似于安装 SpamAssassin。Debian 和 BSD 用户分别有名为 “razor” 和 “razor-clients” 的软件包;其余世界可以从 主页 下载并安装。SpamAssassin 会检测 Razor 是否可用,并且默认情况下,如果可用则使用它。

使用 Mail::Audit 杀死垃圾邮件:简单的方法

这就是你们所有人一直在等待的部分。我们如何使用这些工具来捕捉垃圾邮件呢?对于那些不熟悉 Mail::Audit 的人来说,想法很简单:就像 procmail 一样,你编写一些规则来决定你的邮件如何处理。然而,在 Mail::Audit 的案例中,你使用 Perl 来指定规则。例如,以下是将所有发送到 [email protected] 的邮件移动到另一个文件夹的规则。

    use Mail::Audit;
    my $mail = Mail::Audit->new();
    if ($mail->from =~ /perl5-porters\@perl.org/) {
        $mail->accept("p5p");
    }
    $mail->accept();

有关如何使用 Mail::Audit 构建邮件过滤器的更多详细信息,请参阅我的之前的文章。将 SpamAssassin 集成到你的过滤器中非常简单。首先,你需要最新版本的 Mail::Audit。任何早于 2.1 的版本都不行!现在编写一个如下所示的过滤器:

    use Mail::Audit;
    use Mail::SpamAssassin;
    my $mail = Mail::Audit->new();

    ... the rest of your rules here ...

    my $spamtest = Mail::SpamAssassin->new();
    my $status = $spamtest->check($mail);

    if ($status->is_spam ()) {
        $status->rewrite_mail() };
        $mail->accept("spam");
    }
    $mail->accept();

如你所猜,这里的关键是调用 checkis_spamcheck 生成一个“状态对象”,我们可以查询并使用它来操作电子邮件。而 is_spam 告诉我们邮件是否超过了标记为垃圾邮件所需的“垃圾邮件分数”。rewrite_mail 方法添加一些标题并重写主题行,包括独特的字符串“*****SPAM******”。附加的标题解释了为什么电子邮件被标记为垃圾邮件。例如:

X-Spam-Status: Yes, hits=6.1 required=5.0
tests=SUBJ_HAS_Q_MARK,REPLY_TO_EMPTY,SUBJ_ENDS_IN_Q_MARK version=2.1

这封邮件的主题中有一个问号,一个空的回复地址,以及以问号结尾。这实际上并不是垃圾邮件,但这证明了这项技术并不完美。尽管如此,自从安装了垃圾邮件过滤器以来,我只看到了大约 10 个误报,以及零个漏报。我对这个解决方案很满意。然而,有一点需要记住的是,在你的过滤过程中应该在什么位置调用 SpamAssassin 的检查。例如,你希望在邮件列表过滤之后这样做,因为发送到邮件列表的邮件可能有被篡改的标题,这可能会让 SpamAssassin 产生混淆。然而,这也意味着发送到邮件列表的垃圾邮件可能会逃脱。进行实验,找到最适合你电子邮件模式的最佳解决方案。

不使用 Mail::Audit 杀死垃圾邮件

当然,有时可能不适宜使用 Mail::Audit,或者你可能不想使用。由于 SpamAssassin 既可以作为命令行工具,也可以作为一组 Perl 模块提供,因此很容易将其集成到您使用的任何邮件过滤解决方案中。

例如,以下是一个调用 spamassassin 过滤垃圾邮件的 procmail 规则。

:0fw
| spamassassin -P

:0:
* ^X-Spam-Status: Yes
spambox

对于关注速度的人来说,你可以运行 spamd 守护进程,并用 spamc 替换对 spamassassin 的调用;请注意,这是一个可能需要防火墙隔离的 TCP/IP 守护进程。另一种方法是调用邮件传输代理中的 spamassassin,这意味着垃圾邮件在尝试发送到您之前就已经被过滤掉了。有一个 Sendmail milter 库可供使用,以及为 Exim 和其他 MTA 提供类似技巧的方法。

使用 Mail::Audit 杀死垃圾邮件:更复杂的操作

Mail::SpamAssassin 模块有许多其他你可以用来操作电子邮件的方法。例如,如果你已经确定某件事肯定是垃圾邮件,那么你可以使用

    $spamtest->report_as_spam($mail);

向Vipul的Razor报告它。(请注意:如我们上面提到的,Razor数据库的高效性来自于其中的电子邮件都经过人类确认是垃圾邮件。向数据库添加误报会降低其对所有人的有用性。请只提交您亲自确认的邮件。)如果您发现邮件检查耗时过长,因为SpamAssassin必须联系各种基于网络的黑名单和数据库,那么您可以指示它只执行“本地”检查。

    $spamtest = Mail::SpamAssassin->new({local_tests_only => 1});

还有许多其他选项可用。请参阅Mail::SpamAssassin文档以获取更多详细信息,祝您快乐地执行垃圾邮件清理!

标签

反馈

这篇文章有问题吗?请在GitHub上打开一个问题或拉取请求来帮助我们。