使用 Bogofilter、Procmail 和 Mutt 拦截垃圾邮件

作者:Nick Moffitt

编者注:请参阅Nick 于 2004 年 3 月 8 日发表的更新文章,了解处理 bogofilter 用于标记垃圾邮件的反向命令行开关的新配置。

Eric S. Raymond 的 bogofilter 是一个快速的贝叶斯垃圾邮件过滤器,它实现了 Paul Graham 的 A Plan For Spam 中描述的算法。为了方便我服务器上的所有 mutt 用户使用它,我将以下宏放入了系统范围的 mutt 配置文件 /etc/Muttrc 中

s(保存)绑定到在保存之前运行 bogofilter -Nrgl(单独回复、群组回复和列表回复)绑定到在回复之前运行 bogofilter -nX 绑定到在删除之前运行 bogofilter -S

macro index s "<enter-command>unset wait_key\n<pipe-entry>bogofilter -N\n<enter-command>set wait_key\n<save-entry>"
macro pager s "<enter-command>unset wait_key\n<pipe-entry>bogofilter -N\n<enter-command>set wait_key\n<save-entry>"
macro index r "<enter-command>unset wait_key\n<pipe-entry>bogofilter -n\n<enter-command>set wait_key\n<reply>"
macro pager r "<enter-command>unset wait_key\n<pipe-entry>bogofilter -n\n<enter-command>set wait_key\n<reply>"
macro index g "<enter-command>unset wait_key\n<pipe-entry>bogofilter -n\n<enter-command>set wait_key\n<group-reply>"
macro pager g "<enter-command>unset wait_key\n<pipe-entry>bogofilter -n\n<enter-command>set wait_key\n<group-reply>"
macro index l "<enter-command>unset wait_key\n<pipe-entry>bogofilter -n\n<enter-command>set wait_key\n<list-reply>"
macro pager l "<enter-command>unset wait_key\n<pipe-entry>bogofilter -n\n<enter-command>set wait_key\n<list-reply>"
macro index X "<enter-command>unset wait_key\n<pipe-entry>bogofilter -S\n<enter-command>set wait_key\n<delete-message>"
macro pager X "<enter-command>unset wait_key\n<pipe-entry>bogofilter -S\n<enter-command>set wait_key\n<delete-message>"

您也可以将这些宏放在您的个人 .muttrc 文件中。此设置的逻辑如下:如果您要保存消息,这意味着它对您来说是有价值的。因此,我们运行 bogofilter -N,它将消息中的单词添加到好词列表并从坏词列表中减去它们。

如果您以任何方式回复消息,它也不是垃圾邮件。您显然不会回复垃圾邮件,因为这只会产生更多的垃圾邮件!所以我们只需将其添加到好词列表。

然后是新的键 X。请注意,这是 shift-X,而不是小写 x。这是一个特殊的“删除为垃圾邮件”键。我使用 bogofilter -S,它将单词添加到垃圾邮件列表并从好词列表中减去它们,因为假设您标记的是 bogofilter 错过的垃圾邮件。

以下是我如何使用这些键。首先,我将以下三个节放入我的 .procmailrc 文件中,以对所有传入邮件运行 bogofilter

:0fw
| bogofilter -u -e -p
:0e
{ EXITCODE=75 HOST }
# file the mail to spam-bogofilter if it's spam.
:0:
* ^X-Bogosity: Yes, tests=bogofilter
inboxes/zztrash

这意味着所有邮件都通过 bogofilter 过滤,并且它会自我加强。所有垃圾邮件都会添加到垃圾邮件列表中,所有好消息都会添加到好词列表中,因此如果垃圾邮件发展,它会随着时间的推移而捕获它。

现在我已将所有捕获的垃圾邮件放入 inboxes/zztrash 中,这是我读取的最后一个邮箱。我阅读我的正常收件箱,使用常规的 d 键删除不感兴趣但合法的邮件,但使用 X 删除垃圾邮件。请记住,如果某个东西在正常的邮箱中,那么 bogofilter 必须将其标记为好邮件,因此使用 -S 从好词列表中减去并添加到垃圾邮件列表中。

我回复的每封邮件都会在好词列表中获得额外的加强。它被添加一次是因为它没有被捕获为垃圾邮件,但它会再次被添加,因为它引起了我的注意,足以保证回复。

一旦我进入 zztrash 文件夹,我会检查是否有任何邮件被错误地分类为垃圾邮件。我只需将它们保存到它们应该去的文件夹中!这会通过 bogofilter -N 运行它们,这会将它们从垃圾邮件列表中删除并将它们放在好词列表中。

我发现仅仅几天后,该系统似乎真的开始捕捉垃圾邮件中的模式。我发现我越来越少地纠正系统,因为它在自我加强方面变得更好。

该设置的注意事项是,宏执行的注册是在从 .procmailrc 调用时 bogofilter 所做的工作之外完成的。例如,保存识别出的非垃圾邮件意味着发生了三件事

  1. 邮件中的所有单词在处理时都已添加到非垃圾邮件列表中。

  2. 这些单词随后从垃圾邮件单词列表中删除,即使邮件从未添加到那里。

  3. 该邮件再次添加到非垃圾邮件列表中。

这实际上是我眼中期望的,或者至少是可以接受的结果。如果我保存一封邮件,那就是 真的 值得我做的事情。然后,使用双保险方法将其标记为非垃圾邮件对我来说很好。

当然,您始终可以更改 .procmailrc 以运行 bogofilter 而不带 -u 以删除反馈循环效果。这使得 mutt 键绑定成为注册获得的唯一命令。在这种情况下,-N 和 -S 开关应分别设置为 -n 和 -s。

有关 bogofilter 选项的完整列表,请参阅 bogofilter 手册页。我鼓励大家玩 bogofilter!

电子邮件:nick@zork.net

加载 Disqus 评论