使用 Dotfile Generator 配置 procmail

作者:Jesper Pedersen

在本文中,我将介绍如何使用 Dotfile Generator (简称 TDG) 配置 procmail。 这将包括:

  • 如何对来自不同邮件列表的邮件进行排序

  • 如何在度假时设置自动回复过滤器

  • 如何更改信件的某些部分,例如,删除签名

  • 如何避免邮件丢失

如果您还没有下载该程序,现在是时候下载了。TDG 的主页位于 http://www.imada.uo.dk/~blackie/dotfile/,提供了镜像站点列表。 之前的一篇文章,详细介绍了该程序以及 TDG 的安装,发表在 Linux Journal 1997 年 10 月刊,第 42 期。

启动 TDG

要使用 procmail 模块启动 TDG,请键入 dotfile<\!s>procmail,将出现如图 1 所示的窗口。 正如您所看到的,该模块分为三个页面。 前两个非常简单,所以让我们从名为“常规设置”的页面开始。 此页面如图 2 所示。

Configuring procmail with The Dotfile Generator

图 1. TDG procmail 窗口

Configuring procmail with The Dotfile Generator

图 2. 常规设置页面

在此页面上有四个项目需要配置:

  1. 用作所有文件操作前缀的目录。 这只是为了方便起见,因为可以使用文件的完整前缀给出所有文件操作。

  2. 您的电子邮件地址,用于防止循环。

  3. 日志文件的配置。 当您希望调查邮件目的地时,这些文件非常有用。 如果您打开 抽象日志记录,您可能会发现程序 mailstat 非常有用。(参见下面的日志文件。)

  4. 搜索路径,procmail 可以在其中找到它需要的程序。 请注意,这只是您在过滤器等中指定的程序。

避免邮件丢失

由于 procmail 处理您的传入邮件,因此安全性对于此模块非常重要。 您可以通过三种不同的方式备份您的传入邮件。 要做到这一点,请转到图 3 所示的“备份”页面。

Configuring procmail with The Dotfile Generator

图 3. 备份页面

第一个备份类别是“备份所有传入邮件”。 procmailrc 文件所需的代码在第一个字段中输入。 这样做是为了避免生成的 procmail 文件中出现任何可能导致您的任何邮件被丢弃的错误。 只有在您第一次开始使用生成的 procmail 文件时,这种备份才是一个好主意。 主要缺点是所有传入邮件都保存在一个文件中,因此该文件可能会很快变得非常大。

第二种方法是备份由 procmail 传送的所有传入邮件。 此方法使验证邮件是否已排序到正确位置变得容易。

第三种方法是备份所有到达您传入邮箱的邮件。 此邮件通常是个人邮件; 也就是说,它不是来自邮件列表,也不是垃圾邮件。

在第一种方法中,必须指定完整的文件名。 这是因为这种方法必须 100% 安全。 在其他两种方法中,您可以根据当前的日期和时间构建文件名。 这使得可以将此类邮件保存到当前年份/月份/周的文件夹中,例如,一个名为 backup-delivered-1997-July 的文件夹。 作为一个附加功能,您可以将文件压缩为 gzipped 文件。

可以为每个单独的配方或一次为所有配方指定已传送邮件的备份。(参见图 4,复选框 9。)配置保存文件的 FillOut 元素在前一篇文章中讨论过。

设置配方

在 procmail 中,一个中心概念是配方,它是一组条件和一组操作。 如果满足所有条件,则执行所有操作。 下面是一些条件的例子:

  • 信件来自 president@white.house.com。

  • 主题是 subscribe。

  • 信件的大小大于 1MB。

  • 信件包含文本。

操作列表包括:

  • 回复发件人说您正在度假。

  • 将信件转发给另一个人。

  • 将信件保存到文件。

  • 更改信件的某些部分(例如,添加新的标题字段或向其中添加一些文本)。

procmail 配置是一系列配方。 当一封信到达时,将检查每个配方以查看是否满足其所有条件。 如果是,则执行配方的操作。

当匹配到一个配方时,Procmail 将完成对配方的测试,除非设置了一个标志来告诉它这个配方不应该停止传递(参见图 4 中的复选框 8)。 这意味着配方的顺序很重要,因为只有第一个匹配的配方才会处理该信件。

如果没有满足任何配方,或者如果满足的配方设置了图 4 中的复选框 8,则该信件将被传递到传入邮箱,就像 procmail 过滤器不存在一样。

您在名为“配方”的页面上配置配方。 此页面如图 4 所示。

Configuring procmail with The Dotfile Generator

图 4. 配方页面

您在这里看到的是一个 ExtEntry。 ExtEntry 是一个 widget,它会重复其元素多次(就像列表框重复标签一样)。 此页面上的所有内容都是一个单独的配方。 要查看新的配方,您必须滚动外部滚动条 (1)。 要添加新的配方,您必须按下滚动条下方的“添加”按钮。

如上所述,配方是一组条件。 此集合也用 ExtEntry (2) 表示。 要滚动到配方中的另一个条件,您必须使用滚动条 (2),要添加新条件,您必须使用滚动条 (2) 下方的按钮。

每个配方都可以被赋予一个唯一的名称,以便更容易找到给定的配方。 此名称也被写入到配方传递的邮件文件中(上述方法 2),以便您可以看到哪个配方匹配了实际的信件。 要给配方命名,请使用条目 (3)。 标记为 Idx 的按钮位于条目的右侧。 这是一个指向外部 ExtEntry(即配方)的快速索引。 如果您按下此按钮,将弹出一个列表框,您可以从中按名称选择其中一个配方。

配方的条件

要设置的最常见的条件是将标题字段与给定的正则表达式匹配,或者将信件的正文与给定的正则表达式匹配。 典型的标题如 列表 1 所示。

标题的第一行是特殊的,由发送信件的程序(通常是 sendmail)编写。 对于给定的邮件列表,此标题字段始终相同,因此要对来自邮件列表的邮件进行排序,最好使用普通的文件阅读器查看信件(邮件阅读器很少显示此行)。 将此信息复制到模式字段(图 4,标签 (6))。 作为要匹配的元素,您必须在条目 (5) 中选择 "Sendmail from"

procmail 中存在三个特殊的宏。 这些宏可以在匹配标题字段时使用:

  1. TO:此宏匹配每个目标规范。

  2. FROM_DAEMON:当信件来自守护进程(包括邮件列表)时,应匹配此宏。 避免与某些邮件列表创建邮件循环非常有用。

  3. FROM_MAILER:另一个正则表达式,当信件来自邮件守护进程时,应生成匹配。

要查看这些宏代表什么,请参阅 procmailrc 手册页。

下拉菜单 (5) 中有很多标题字段可供选择,但是如果您希望选择的字段不在其中,您可以自己输入。

复选框 (4) 可用于否定条件,即,如果模式不匹配,则满足条件。

正则表达式

到目前为止,我提到您可以在框 (6) 中键入正则表达式。 在大多数情况下,可能没有必要了解有关正则表达式的任何信息,因为 procmail 模块会为您处理大部分内容。 有一件事可能值得知道,那就是您可以使用 ".*" 匹配“任何内容”。 这意味着 abc.*def 将匹配以 abc 开头并以 def 结尾的任何内容,例如,abcdefabcXXXXdef。 要阅读 procmail 使用的正则表达式集的更详细描述,请按标记为 Description 的按钮。

一个常见的陷阱是忘记匹配行首的所有内容。 如果您想为上面的 From: 字段设置一个正则表达式,则给出模式是不够的:rick@helix.nih.gov,因为它不在行首。 相反,要告诉 procmail 要处理包含文本 rick@helix.nih.gov 的每封邮件,请在电子邮件地址前面插入 .*

外部程序

设置条件的最后一种方法是使用外部程序来验证某些条件。 这是通过按下按钮 (7) 来完成的,该按钮会弹出一个带有 FillOut 字段的窗口,如图 3 所示。 但是,这次条目已被文本框替换。 在此文本框中,您可以键入一些命令来读取标准输入上的标题或正文。 这些命令可以引用信件中的任何标题字段。 这些行(用换行符分隔)用分隔分号连接在一起,使每一行都成为一个单独的命令。

仅当程序的退出代码为 0 时,Procmail 才会认为满足该条件。 可以使用图 4 中的复选按钮 (4) 更改此行为。

操作

本模块可以处理的操作分为六个部分。下面将详细介绍这些部分。要激活一个操作,您首先必须选中它旁边的复选框,以便清楚地了解针对特定配方启用了哪些操作。

1. 预设过滤器

要设置过滤器,请按窗口中标记为预设过滤器的按钮。此过滤器可以更改标头字段、添加新的标头字段和/或删除现有的标头字段。

在此页面上,您将找到一个自定义过滤器:移除签名。使用此过滤器,您可以为每个电子邮件地址指定一个签名。如果您指定的文本被发现(完全匹配),它将从信件中删除。我的意图是,随着用户向我发送他们的想法和过滤器,添加更多自定义过滤器。

2. 手动过滤器

如果您希望创建自己的过滤器,您必须转到手动过滤器页面。在此页面上,您可以通过命令发送信件的标头和/或正文。

例如,您可以使用以下命令删除标头:

cat ->> /dev/null

或者,使用以下命令向邮件正文添加消息:

echo This letter has been resent to you, by my\
procmail filter!; cat -
如果仅选择了过滤器操作,则过滤器将永久更改信件,即这些更改将影响后续配方(即使在已发送的信件上,如果没有配方匹配)。如果您使用的邮件阅读器不支持 MIME,并且您有一个将 MIME 编码的文本转换为 7 位 ASCII 的过滤器,这可能很有用。但是,如果还启用了其他操作之一,则更改仅影响此配方。
3. 回复操作

使用回复操作,您可以设置回复机制,该机制会向发件人发回一封包含您指定消息的信件。此机制的一个特点是,您可以指定发送回复的频率。您有以下选择:

  • 回复每封信件。

  • 只回复一次。

  • 只有距离上次回复的时间超过给定的天数时才回复。

如果您要休假,并希望发送一条消息说明您不会立即阅读您的信件,则此操作很有用。

只有当信件不是来自守护进程时才会发送回复,以避免向邮件列表上的每条消息发送回复。

4. 转发操作

使用转发操作,您可以将信件转发到其他电子邮件帐户。

5. 保存到文件操作

使用此操作,您可以将信件保存到文件。文件名使用 FillOut 小部件指定,就像您为备份指定文件名一样。但是,这一次,您有两个附加功能:您可以使用标头字段的内容,或者可以使用命令的输出。在图 5 中,您可以看到如何选择要提取作为文件名一部分的标头字段。

Configuring procmail with The Dotfile Generator

图 5. 标头字段选择

电子邮件地址可以通过三种方式指定:

  • 真实姓名(电子邮件)

  • 电子邮件(真实姓名)

  • 电子邮件

如果您指定该字段是电子邮件地址,您还可以指定是否希望提取包含或不包含域名(domain name)的用户名。

最后,您可以通过指定的命令管道传输标头字段。此命令可以读取标准输入上的标头字段的值,并写入标准输出。

6. 管道操作

使用管道操作,您可以指定一个命令来处理信件。此命令可以在标准输入上读取信件,但不能写入任何内容(它将被忽略)。

日志文件

从 TDG 生成的 procmail 文件包含大量注释,以便您轻松找到特定的配方。

如果出现问题,您可以打开扩展诊断选项。这会将额外的行写入日志文件,以向您显示它的作用。对于调试,您必须同时阅读日志文件和 procmail 文件。

如果您使用日志摘要选项,您会发现程序 mailstat 非常有用。它会告诉您有多少信件被传递到哪里。mailstat 程序的输出中有一行是假的:/bin/false--可以安全地忽略它。当您希望以一种可以明确看到它已被删除的方式删除一封信件时,您应该将其传递到名为 /dev/null 的文件中。请注意,只有在关闭扩展诊断选项后才能使用 mailstat 程序。

结束

在 procmail 开始过滤所有传入邮件之前,您必须将以下行(即,没有中断)添加到名为 ~/.forward 的文件中:

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

使用 procmail 的正确路径名,并将 username 替换为您的电子邮件地址。

资源

鸣谢

Configuring procmail with The Dotfile Generator
Jesper Pedersen 居住在丹麦的欧登塞,自 1990 年以来一直在欧登塞大学学习计算机科学。他是该大学的系统管理员,也教授计算机科学。在他的空闲时间,他练习柔术,听音乐,喝啤酒,并与他的女朋友一起玩乐。他的主页可以在 http://www.imada.ou.dk/~blackie/ 找到,您可以通过电子邮件 blackie@imada.ou.dk 联系到他。
加载 Disqus 评论