午餐前阅读 950 封电子邮件的方法

作者:Jay D. Allen

我听说有人说,电子邮件是人们最初上网的最大原因,而 Usenet 新闻组是他们留下来的原因。我的问题是,人们离开互联网的最大单一原因是什么?答案是垃圾邮件!好吧,也许他们还没有离开。只是看起来是这样,因为他们从不回复电子邮件。在一个跨越全球并包含数千万成员的公共论坛中,人们可能会收到超出他们阅读能力的邮件,这很容易理解。

有成千上万的机会订阅邮件列表,互联网用户可以很快使他们的盘子超载。我知道,我曾经这样做过。在本文中,我将讨论一套强大的工具,这些工具使您能够控制您的收件箱,并减少因启动邮件阅读器而引起心脏病的可能性。这些工具被称为“电子邮件过滤器”。电子邮件过滤器是根据您的指示对邮件进行排序的程序。例如;来自我兄弟的所有邮件都应从我的收件箱邮件文件夹移动到标记为“Frank”的文件夹。过滤器的工作原理是在系统将邮件传递给您之后,但在您实际阅读邮件之前处理邮件。

这是什么意思?

电子邮件事务如何运作

让我们从邮件传递给您的那一刻开始。当邮件通过互联网传递到您的计算机时,它通过使用简单邮件传输协议 (SMTP) 的邮件系统到达。尽管一年中的每周都可能有一个不同的电子邮件守护进程,但 sendmail 是迄今为止最受欢迎的。在本文的其余部分中,当我提到“邮件系统”时,我将其称为 sendmail,尽管我所说的大部分内容都适用于 smail、MMDF 和其他系统。为了本文的目的,您可以忽略这些差异。

因此,继续说,“sendmail”接收电子邮件,然后决定电子邮件是否需要直接发送到另一个系统或本地传递。如果 sendmail 决定邮件应本地传递,它将执行一系列简短的操作。首先,它会查看用户的主目录中是否存在 .forward 文件。如果没有 .forward 文件,sendmail 会将邮件写入用户的系统范围邮件文件。

如果用户确实有 .forward 文件,sendmail 会读取该文件。如果该文件包含电子邮件地址,sendmail 会将消息转发到该地址。如果 forward 文件包含管道 | 字符,sendmail 会运行指定的程序,将邮件消息发送给它,让程序传递邮件。最后一种情况是电子邮件过滤器的工作方式。 sendmail 守护进程将邮件“传递”到您的过滤器,过滤器按照您的一组规则将其传递(或不传递,如果您愿意)到文件夹。

"| /usr/local/bin/filter"

sendmail 会将您的所有邮件传递到名为 filter 的程序。

如果 filter 不存在或以其他方式损坏会发生什么? 我们可以通过为 sendmail 提供替代方案来防止失败。

"| /usr/local/bin/filter || exit 75 "

在此示例中,如果过滤器失败,则传递到用户的 .forward 文件的操作将以错误代码 75 退出。这会强制 sendmail 退回 .forward 文件,稍后重试。 || exit 75 仅防止灾难,而不是错误的选择。如果您未正确配置过滤器,它可能会丢失邮件,但从 sendmail 的角度来看不会“失败”。 exit 75 无助于您找回邮件。

exit 75 可以帮助您的最常见情况是您的主目录空间不足时。大多数过滤器都会优雅地失败,从而允许您的邮件传递到系统邮箱。这在对主目录有磁盘配额的系统上特别有用,因为邮件池通常没有用户配额。

选择邮件过滤器

至少有四种流行的邮件过滤器可用:ProcmailElm-filterMailagent 和 MH 的 slocal。 Procmail 是一款强大的通用邮件过滤器。从设计上来说,它体积小、易于安装且可靠。 Elm 是一款用于阅读和发送电子邮件的用户邮件程序。 Elm-filter 是 Elm 包附带的单独程序,可以与 Elm 包的其余部分一起使用,也可以不一起使用。 Slocal 是 Rand 公司邮件处理程序 (MH) 附带的邮件代理。如果您安装 MH 只是为了使用 slocal,那么您可能是在为点烟器购买凯迪拉克。不幸的是,Slocal 不支持正则表达式(有关可能的解决方案,请参阅msort 侧边栏)。与 Slocal 相比,名为“Mailagent”的邮件过滤包支持非常丰富的正则表达式语法。与其他用 C 语言编写的过滤器不同,mailagent 主要用 Perl 编写,并使用 Perl 强大的正则表达式。

Procmail 可以将邮件写入“mbox”样式的邮件文件,以及 MH 样式的邮件目录。 Slocal 可以写入“mbox”样式的邮件文件,以及其原生的 MH 样式“文件夹”(目录)。一般来说,邮件代理可以与许多不同的电子邮件阅读器互换使用。

我使用 procmail 过滤我的邮件,MH 作为我的邮件包,以及“Exmh”作为 MH 的基于 X 的前端。(Exmh 是用 Tcl/Tk 编写的,可能是处理电子邮件的最佳方式。[我同意!---编辑])

如果您幸运的话,您系统上可能已经安装了此处描述的一个或多个电子邮件过滤器。

过滤器安装

如果您不那么幸运,您可能需要安装电子邮件过滤器。这些过滤器程序的安装难易程度各不相同。它们都可以无需 root 权限即可安装,但为了避免麻烦,请让您的系统管理员安装它以供通用使用。如果您擅长使用编译器,请主动提供帮助。如果您必须自己完成,则需要获取源代码、编译它们并创建任何需要的配置文件。有关获取和安装常用电子邮件过滤器的更多信息,请参阅侧边栏“在哪里获取邮件过滤器”。

花一些时间弄清楚您对邮件文件锁定的需求。锁定用于保证 sendmail 不会尝试在您执行操作的同时写入文件。每个软件包的文档都提到了这个主题,所以请注意。我痛苦地发现我的邮件阅读器使用一种类型的锁,而我的过滤器使用另一种类型的锁(请为我所有丢失的邮件默哀片刻)。

在您安装邮件过滤器(或找到它,如果已安装)之后,您将需要开始通过它推送您的邮件。如上面的示例所示,大多数电子邮件过滤器可以使用 .forward 文件调用。如果您的系统不支持此功能,您仍然可以使用电子邮件过滤器,但您可能需要定期使用脚本调用过滤器。您可以每次登录时运行脚本,或者每次阅读邮件时运行脚本,或者使用 cron 定期运行脚本。

过滤器如何工作

现在我们有了一种将电子邮件泵入过滤器的方法,接下来让我们讨论会发生什么。过滤器如何处理您的邮件?首先,“电子邮件过滤器”可能更适合标记为“电子邮件分类器”。我们厨房里都有“过滤器”:面粉筛用于按大小过滤,滤网让液体通过但不让意大利面通过,咖啡过滤器让好东西通过,留下棕色的污泥。

大多数人不满足于根据大小、颜色或流体状态过滤电子邮件。他们更喜欢根据以下内容对邮件进行排序:邮件来自哪里邮件来自谁以及邮件关于什么。在电子邮件术语中,这可以通过查看 From:Subject: 行来完成。与其说是“过滤器”,不如说是“代理”、“秘书”、“处理器”,甚至“电子邮件狗”。我们可以向“代理”发出指示,但不能向咖啡壶发出指示。

考虑到这一点,我们可以为我们的“过滤器”创建一组规则来遵循。如果电子邮件消息与规则匹配,则会采取操作。 Procmail 和 Slocal 每个规则只能有一个操作,尽管有一些方法可以绕过此限制。除非另有指示,否则过滤会在匹配后停止,并且操作完成,这使得规则的顺序很重要。将最具体的规则放在顶部(最前面),并将默认情况(如果没有规则匹配会发生什么)放在底部。让我们看几个例子

使用 procmail 程序,我们可以在我们的主目录中创建一个名为 .procmailrc 的文件。 Procmail 称其过滤指示为“配方”。简单的配方如下所示

:0
* ^From.*jay@fork.com
forkmail
:0
* ^From.*cory
* ^Subject.*Elvis
/dev/null

第一个配方告诉 procmail 查找包含以单词 From 开头的行并包含字符串 jay@fork.com 的邮件。如果 procmail 找到与此描述匹配的内容,它会将电子邮件消息存储在 forkmail 文件中。第二个配方匹配两个标准;来自 cory 的电子邮件,主题包含单词 Elvis,将被删除。匹配基于 egrep 的正则表达式语法。

使用 Elm 的过滤器 ($HOME/.elm/filter-rules) 的等效项如下所示

if (from contains "jay@fork.com")  ?
        save "~/mail/forkmail"
if (from contains "cory" and subject = "Elvis") then
        delete

Elm 的过滤器将这些节称为“规则”。匹配是“类似 egrep 的”,但不如使用 procmail 可以获得的匹配功能齐全。

在 slocal 的 .maildelivery 文件中,我们的规则如下所示

# header pattern action result string
# lines starting with a " are ignored,
# as are blank lines
>From jay@fork.com ^ "/pkgs/mh/lib/rcvstore +inbox"
>From cory         file R /dev/null
Subject Elvis     destroy N -
过滤器的通用策略

在构建过滤器规则时,请谨慎行事。首先尝试构建一些简单的规则。通过向自己发送邮件来测试规则,并通过将过滤器保留几天来进一步测试。如果一切正常,您可以开始添加更复杂的规则。确保您已设置过滤器的“默认”行为。了解如何打开调试,然后再关闭调试。试用日志记录功能。使用 procmail 的“mailstat”,您可以获得 procmail 已采取的操作的摘要。通过花一些时间弄清楚如何使您的过滤器工作,您将在以后节省数倍的时间。

在您学习如何使用过滤器时,您可能希望保留备份邮件文件。您可能需要两行,而不是在 .forward 文件中使用一行来调用过滤器

\username
"| /path/to/filter"

其中 username 是您的登录名。这样,您的邮件将全部传递到您的标准系统邮箱以及通过您的邮件过滤器传递。如果您错误配置了邮件过滤器,您将有一个备份来从中检索您的邮件。还有其他几种方法可以做到这一点。

我发现人们在构建邮件过滤器时倾向于两种方案。第一种技术主要是根据邮件的发送者对邮件进行分类。第二种技术是根据内容或功能进行过滤。来自我经理的邮件可以放在名为 boss 的文件夹中,但我收到很多来自他的邮件,这些邮件并不特别重要,不是因为它来自,而是因为它是关于什么。例如,来自我经理的邮件,主题为“明年的硬件预算”,最好放在我的“预算”文件夹中,而不是我的“老板”文件夹中。

如果您不特别担心磁盘空间,为什么不尝试两者都做呢?根据邮件的发送者 以及 其他因素(如主题行或其他标头中的关键字)过滤所有电子邮件。在我的情况下,我的过滤器可以将我从老板那里收到的所有邮件的副本保存在名为“boss”的文件夹中,并将主题行中包含单词“budget”的所有电子邮件存储在名为“budgets”的文件夹中。

使用过滤器的副作用是您将获得出色的电子邮件跟踪。通过使用 Mailagent、Elm-filter 和 Procmail 附带的日志记录和报告,您将了解很多关于您的电子邮件的信息。您从“Elvis-lifestyles”邮件列表中收到多少邮件?它占邮件的百分比是多少?与您从兄弟那里收到的邮件量相比如何?我使用 mailstat 程序来衡量我在支持不同部门的计算机上花费了多少时间。

更高级的规则

PGP 密钥处理有特殊需求。使用 Phil Zimmerman 的 PGP 程序发送加密电子邮件的人员需要交换“公钥”才能安全通信。一个常见的约定是将 PGP 密钥的公共部分放在 .plan 文件中。任何想要密钥的人都可以直接 finger 您。这很棒,除非您的系统不支持 finger,或者您的帐户位于防火墙后面。下一个最好的方法可能是某种自动邮件回复。使用 procmail,您可以过滤主题行中的特殊短语,如下所示

:0 h c
* !^FROM_DAEMON
* ^Subject.*SEND-PGP-KEY
| (formail -r -A"Precedence: junk";\
   cat ~/.plan ) | $SENDMAIL -t

此 procmail 配方首先检查邮件是否来自邮件守护进程,以防止电子邮件循环或“响铃”。然后,如果主题包含特殊短语 SEND-PGP-KEY,procmail 会调用 formail,后者会自动构建对发件人的回复。发回的电子邮件包含 .plan 文件的内容。如果您将 PGP 公钥保存在此文件中,则任何人都可以请求您的密钥副本,即使他们无法 finger 您。使用 Elm-filter 的等效项如下所示

if ( subject contains "SEND-PGP-KEY" ) then
  execute "cat ~/.plan | mail -s \"RE: %s\" %r"

Elm 的过滤器使用宏 %s 来表示消息的原始主题,使用 %r 来表示返回地址。

如果您有特殊的电子邮件需求,邮件代理真的非常棒。我携带一个字母数字寻呼机。我使用 procmail 监视主题行中包含魔法词 PAGEJAY 的邮件。如果 procmail 看到魔法词,则会发生两件事。首先,电子邮件的副本被转发到我的电子邮件->寻呼机网关 page-jay@pager.fork.com。当转发的消息通过网关时,它将被广播到我的寻呼机。(我办公室的人称之为“腰带邮件”,或者如果寻呼机设置为振动,则称为电子邮件按摩。)其次,电子邮件的副本存储在名为“pages”的本地文件夹中。以下是 procmail 配方的样子

:0 c
* ^Subject.*PAGEJAY
! page-jay@pager.fork.com
:0
* ^Subject.*PAGEJAY
pages/.

第一个配方使用 c 标志。这告诉 procmail,即使存在匹配项,匹配也应 continue 继续。在下一个配方中,腰带邮件将被归档,并且此电子邮件的匹配将结束。 Elm 的过滤器规则中的等效项将是

if ( subject contains "PAGEJAY") then
      forward "page-jay@pager.fork.com"
      save "~Mail/pages"
endif

电子邮件过滤器/代理是强大的工具,使收到大量电子邮件的人能够有效地沟通。从对电子邮件进行排序的平凡但重要的任务,到自动响应电子邮件请求的复杂任务,过滤器都可以胜任。每个参与者都从过滤器的使用中受益。您喜欢它是因为您的邮件始终以相同的方式排序(把 CERT 咨询放在哪里了?)。向您发送电子邮件的人喜欢它,因为您开始通过电子邮件比通过加拿大“头等舱”更快地回复。唯一不喜欢它的人是直接营销垃圾邮件发送者,他们不断尝试向您发送“投资机会”广告。如果他们生气也没关系,因为自从您安装过滤器后,您永远不会看到他们的邮件。

任何花在学习如何配置和使用过滤器的时间,都将在以后的时间节省中成倍地赢回。

有关电子邮件过滤器的更多信息,请参阅侧边栏

Jay Allen (jay@fork.com) 于 1991 年在波特兰州立大学获得化学学士学位。他目前是俄勒冈州蓝十字/蓝盾的首席 Unix 系统工程师。 除此之外,他对在互联网上使用密码学进行商业活动以及安全的专用网络很感兴趣。

加载 Disqus 评论