摆脱垃圾邮件

作者:Brandon M. Browning

如果您定期收到大量邮件(例如,您订阅了多个邮件列表)或者是不请自来的批量电子邮件 (UBE) 的目标,那么邮件过滤可能已经进入您的考虑范围。procmail 是一个灵活的工具,允许您处理收到的电子邮件并执行用户自定义的操作,例如过滤、优先级排序或通知您新邮件。procmail 是一个更大的工具集的一部分,该工具集还包括 formail,一个可以处理诸如识别重复消息、摘要分解、标头提取/添加以及生成自动回复等任务的程序。

设置它

如果您的系统上尚未安装 procmail,您可以从 ftp://ftp.informatik.rwth-aachen.de/pub/packages/procmail/procmail.tar.gz 获取最新副本。截至本文撰写时,当前版本为 3.11pre7。(不要被“pre”吓到;此版本非常稳定。)该软件包可以开箱即用地为 Linux 编译,但您可能需要更改一些编译参数(例如安装到 /usr/local 而不是 /usr)。阅读存档中包含的 INSTALL 文件以获取完整的安装过程。

一旦您编译并安装了 procmail,您就可以开始使用它了。由于它被设计为处理收到的邮件,您需要修改您的 ~/.forward 文件(或者如果您没有该文件则创建一个)以包含以下行,这将自动调用 procmail

"|IFS=' '&&/usr/local/bin/procmail -f-||exit 75 #

包括所有引号,并更改 YOUR_LOGIN_NAME。FAQ 中描述了这样做的原因,该 FAQ 与存档捆绑在一起。接下来,您需要创建一个 配方文件,procmail 将使用该文件来过滤您的邮件。

procmail 用法

执行时,procmail 执行的操作之一是在您的主目录中查找名为 .procmailrc 的文件。此文件包含所有命令,称为配方,这些命令告诉 procmail 如何处理收到的邮件。一个配方有三个部分:开始(:0,后跟可选标志和本地锁定文件)、可选条件以及在条件评估为真时要采取的动作。配方的每个部分都在单独的行上。

标志告诉 procmail 查看消息的哪个部分(标头、正文或两者),以及配方是传递(终止)配方还是非传递配方。本地锁定文件确保并发运行的 procmail 进程在写入邮箱时不会相互干扰,并且应仅用于传递配方。可选条件以 * (星号)开头。可以有多个条件,也可以根据您的需要没有条件。* 之前的所有内容都传递给内部正则表达式 (regex) 引擎,该引擎与 egrep 兼容。所有条件在逻辑上都是 AND 关系。如果您选择不设置条件,procmail 默认为 true 结果(这正是您所期望的)。动作行告诉 procmail 如果所有条件都匹配,则采取什么动作。动作行可以以 ! (转发消息)、| (将消息传递给程序)或 { (启动嵌套块)开头。任何其他内容都被视为邮箱名称。

这是一个配方的示例,该配方将过滤来自白宫的所有邮件到同名的邮箱中

:0:
  * ^From: .*whitehouse\.gov
  whitehouse

让我们逐行分析一下。第一行告诉 procmail 我们已经启动了一个配方(:0),并且我们希望 procmail 确定本地锁定文件(第二个 :)。下一行是 procmail 必须匹配的条件,此配方才能为真。默认情况下,procmail 仅扫描标头,这正是我们想要的。最后一行是动作,它告诉 procmail 将消息写入名为 whitehouse 的文件。

为了对比,这是一个非传递配方

:0 f
  * ^X-Face:
  | formail "I X-Face"

此配方使用 formail 来剥离不需要的 X-Face 标头。请注意缺少本地锁定文件。由于这是一个过滤器,因此不需要锁定文件。procmail 如果您在那里放置一个锁定文件,它仍然可以工作,但会报错。

不请自来的邮件

在本文的开头,我提到 procmail 可用于过滤不需要的邮件。UBE(或更常见的垃圾邮件)已成为一种令人讨厌的趋势和滋扰。据信,垃圾邮件的量在 Usenet 上已大幅增加,人们在 Usenet 上过度地将相同的消息发布到各种新闻组。Usenet 垃圾邮件被认为是“可取消的”,这意味着版主可以在消息被太多人阅读之前将其删除。为了绕过这种类型的取消,有人想到直接将消息发送给您,而不是将其发布到 Usenet,在那里它可能会在您阅读之前被删除。因此,UBE 开始渗透到用户的收件箱中。这种营销形式的先驱者很快发现,许多用户不喜欢任何形式的垃圾邮件,并且经常发现自己的邮箱里充满了谩骂。他们开始模糊标头,使其难以找出消息的真实来源。

为什么垃圾邮件被认为是整个互联网的祸根?与您在家中邮政信箱中收到的垃圾邮件不同,垃圾邮件发送者很少支付与收件人接收垃圾邮件一样多的费用来发送垃圾邮件。他们支付的费用低于您支付的费用这一事实称为“成本转移”。这种转移的另一种形式是垃圾邮件发送者未经许可使用第三方计算机资源来发送其批量电子邮件。这样做,垃圾邮件发送者正在花费无辜公司的时间和金钱来清理垃圾邮件发送者造成的后果。另一种广泛使用的策略是以某种方式篡改标头,使未受过教育的收件人可能会浪费与垃圾邮件无关的无辜第三方的宝贵时间。这种欺骗行为也可以被认为是成本转移,并且在美国法院已被裁定为非法。

成本转移不是反对垃圾邮件的唯一理由。没有单一的删除点,因为每个垃圾邮件发送者通常运行自己的列表。为此,他们不需要遵守删除列表。随着越来越多的人发送垃圾邮件,您将永远无法从每个列表中删除您的地址。如果您一开始就没有要求它,为什么您必须这样做呢?最后,大量的垃圾邮件是或可能被认为是违法的,例如金字塔计划、多层次营销计划和彩票。

处理 UBE

与其让所有垃圾堵塞您的收件箱并使其无法用于实际工作,您现在可以使用 procmail 将其过滤掉。早些时候我提到垃圾邮件发送者试图模糊标头以使其难以追踪。通过这样做,他们有时会给出无意的“签名”,您可以告诉 procmail 根据这些签名进行过滤。例如,一种流行的批量电子邮件发送器 Stealth Mailer 会插入虚假的 Received: 行来阻止谩骂。然而,这两个版本都生成错误的时区。掌握了这些知识,您现在可以过滤掉大量的垃圾邮件。我还没有看到过误报的情况。

# Filter spam that used the Stealth Mailer Classic
  :0
  * ^Received:.*id GAA.*-0600 \(EST\)$
  spam

另一个出色的垃圾邮件过滤器查找“Comments: Authenticated sender is”标头。不幸的是,仅凭这一点进行过滤并不能奏效,因为 Pegasus Mail(Windows 操作系统的流行邮件客户端)合法地使用了此标头。幸运的是,Pegasus 除了 Comments: 标头之外还添加了一个 X-Mailer: 标头。如果 Comments: 和 X-Mailer: 都存在,则 Pegasus Mail 用户发送了消息(并且可能是合法的);否则,它是一个批量邮件发送器。以下配方将过滤这种情况。(请注意,方括号之间有一个空格和一个制表符。不幸的是,procmail 没有像 Perl 那样的空白转义序列。)

# Only Pegasus Mail for the WinOS generates a
# valid "Comments: Authenticated sender is ..."
# header. If this is present and the X-Mailer is
# not; then the message in the question is almost
# certainly spam.
:0
* ^Comments:[   ]*Authenticated sender
* !^X-Mailer: Pegasus Mail
spam
仅这两个配方就过滤掉了我的大部分垃圾邮件。您可以很快看到,将这些配方列表串在一起将是有益的。这正是几个免费软件包所做的。我个人的选择是 Alcor 的过滤器 (http://alcor.concordia.ca/topics/email/auto/procmail/spam),我发现这些过滤器是非侵入式的、易于理解且非常灵活。Alcor 的过滤器通过将超过 1300 个过滤器应用于消息来工作。如果匹配到过滤器,则消息会被标记为特殊标头。然后,您只需对这些带有特殊标头的消息采取任何您认为适当的措施(例如,删除、写入发送者等)。我个人避免“回复”,因为我不喜欢使用自动回复器,并且“删除”,因为我相信检查误报(您不可避免地会得到一些误报)。

我建议下载所有标签配方(在浏览器上使用“另存为源文件”[而非文本] 功能)。我将过滤器放在一个名为 ~/.procmail 的新目录中,这个目录名很巧妙。您很可能需要编辑文件 tag-radical 以注释掉(使用行首的 #)或更改三个未注释的 INCLUDERC 行。否则,每次处理消息时,您都会在 $LOGFILE 中看到烦人的“Couldn't read xxxx”错误。完成此操作后,在您希望检查收到的消息是否为垃圾邮件的 ~/.procmailrc 中的位置添加以下配方。我在最顶部检查我的邮件,然后再进行任何类型的过滤,并且发现这效果很好。

# This enables Alcor's tagging filters
INCDIR=$HOME/.procmail
INCLUDERC=$INCDIR/tag
INCLUDERC=$INCDIR/tag-agis
INCLUDERC=$INCDIR/tag-aol
INCLUDERC=$INCDIR/tag-contents
INCLUDERC=$INCDIR/tag-jdfalk-cyberpromo
INCLUDERC=$INCDIR/tag-jdfalk-llv
INCLUDERC=$INCDIR/tag-jdfalk-nancynet
INCLUDERC=$INCDIR/tag-panix
INCLUDERC=$INCDIR/tag-radical
  :0:
  * $ ^$special_header
  spam

就这样。如果一切顺利,您应该会注意到,您的大部分(如果不是全部)垃圾邮件现在都进入了名为 spam 的邮箱。您可以通过向自己发送一条包含这些过滤器会捕获的内容的消息来对其进行测试(尝试向自己发送一条消息,其中正文中的某个位置包含 -- Headers -- )。

我已经过滤了。接下来呢?

Alcor 的标记系统可能会捕获合法邮件,因此我不建议在查看之前删除任何内容。一旦您验证它是垃圾邮件,您有两个选择:投诉或删除。如果您想打击垃圾邮件,我建议您阅读 SPAM-L FAQ (http://www.ot.com/~dmuth/spam-l/) 并可能加入邮件列表。有关如何操作的说明在 FAQ 中。

结论

本文只是使用 procmail 及其随附程序的冰山一角。如果您对继续使用 procmail 过滤您的电子邮件感兴趣,我建议您加入 procmail 邮件列表。那里的常客知识渊博,乐于助人。您可能还想搜索其他 procmail 解决方案。为了对这些过滤器进行压力测试并帮助进一步开发它们,我订阅了一个特殊的邮件列表,该列表只发送通过它转发的垃圾邮件,该列表特别注意尝试过滤重复项。在撰写本文时,我从该列表收到的邮件中有 83% 已被正确过滤。

资源

致谢

Brandon M. Browning 是 NorthWestNet, Inc. 的软件工程师,NorthWestNet, Inc. 是一家位于华盛顿州贝尔维尤的 ISP。当他不编写 Perl 或对抗垃圾邮件时,他经常可以找到追求他的其他爱好:The Tick、Babylon 5、Star Wars,偶尔也会睡觉。您可以通过电子邮件 brandon@powertie.org 与他联系。

加载 Disqus 评论