使用 Bogofilter、Procmail 和 Mutt 拦截垃圾邮件
编者注:请参阅Nick 于 2004 年 3 月 8 日发表的更新文章,了解处理 bogofilter 用于标记垃圾邮件的反向命令行开关的新配置。
Eric S. Raymond 的 bogofilter 是一个快速的贝叶斯垃圾邮件过滤器,它实现了 Paul Graham 的 A Plan For Spam 中描述的算法。为了方便我服务器上的所有 mutt 用户使用它,我将以下宏放入了系统范围的 mutt 配置文件 /etc/Muttrc 中
s(保存)绑定到在保存之前运行 bogofilter -Nr、g 和 l(单独回复、群组回复和列表回复)绑定到在回复之前运行 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 所做的工作之外完成的。例如,保存识别出的非垃圾邮件意味着发生了三件事
邮件中的所有单词在处理时都已添加到非垃圾邮件列表中。
这些单词随后从垃圾邮件单词列表中删除,即使邮件从未添加到那里。
该邮件再次添加到非垃圾邮件列表中。
这实际上是我眼中期望的,或者至少是可以接受的结果。如果我保存一封邮件,那就是 真的 值得我做的事情。然后,使用双保险方法将其标记为非垃圾邮件对我来说很好。
当然,您始终可以更改 .procmailrc 以运行 bogofilter 而不带 -u 以删除反馈循环效果。这使得 mutt 键绑定成为注册获得的唯一命令。在这种情况下,-N 和 -S 开关应分别设置为 -n 和 -s。
有关 bogofilter 选项的完整列表,请参阅 bogofilter 手册页。我鼓励大家玩 bogofilter!
电子邮件:nick@zork.net