Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

15.4. 邮件发送代理

红帽企业 Linux 包括 Procmail 作为主 MDA。两个应用程序都被视为 LDA,并将电子邮件从 MTA 的假脱机文件移动到用户的邮箱。但是,Procmail 提供强大的过滤系统。

本节仅详细介绍 Procmail。有关 mail 命令的信息,请查阅其 man page(man mail)。

Procmail 在放置在 localhost 的邮件假脱机文件中时发送和过滤电子邮件。它非常强大,系统资源很强大,使用广泛。Procmail 在发送电子邮件以供电子邮件客户端应用读取方面可起到关键作用。

Procmail 可以通过多种不同的方式调用:每当 MTA 将电子邮件放置到邮件池文件时,Procmail 将启动。然后,Procmail 过滤并记录 MUA 的电子邮件并退出。或者,可以将 MUA 配置为在收到邮件时执行 Procmail,以便邮件移至其正确的邮箱。默认情况下,当 MTA 收到新邮件时,用户的主目录中存在 /etc/ procmailrc 或 ~/.proc mailrc 文件(也称为 arc 文件)会调用 Procmail。

默认情况下,/etc 目录中不存在系统范围的 rc 文件,任何用户的主目录中都不存在 no .procmailrc 文件。因此,要使用 Procmail,每个用户都必须使用特定的环境变量和规则构造 a .procmailrc 文件。

Procmail 是否对电子邮件消息作用取决于消息是否与 rc 文件中的一组指定条件或 配方 匹配。如果消息与方法匹配,则电子邮件将放置在指定的文件中,将被删除或处理。

当 Procmail 启动时,它会读取电子邮件并将正文与标题信息分隔开。接下来,Procmail 在 /etc/procmailrc s/ 目录中查找 / etc/procmailrc 文件和rc 文件,用于默认、系统范围、Procmail 环境变量和配方。然后,Procmail 搜索用户主目录中的 a .procmailrc 文件。许多用户还会为 Procmail 创建额外的 rc 文件,该文件在主目录中的 .procmailrc 文件中引用。

15.4.1. Procmail 配置

Procmail 配置文件包含重要的环境变量。这些变量指定了要排序的消息,以及如何处理与任何方法不匹配的消息。

这些环境变量通常以以下格式显示在 ~/.procmailrc 文件的开头:

env-variable="value"

在本例中,env-variable 是变量的名称, 定义 变量。

大多数 Procmail 用户未使用许多环境变量,而且许多更重要的环境变量都已使用默认值定义。大多数情况下,使用以下变量:

  • DEFAULT - 设置默认邮箱,其中放置与任何方法不匹配的消息。

    default DEFAULT 值与 $ORGMAIL 相同。

  • INCLUDERC - 指定包含要对其检查消息的更多方法的额外 rc 文件。这会将 Procmail 方法列表分解为履行不同角色的单独文件,例如阻止垃圾邮件和管理电子邮件列表,然后关闭这些文件或使用用户的 ~/.procmailrc 文件中的注释字符。

    例如,用户的 ~/.procmailrc 文件中的行可能类似如下:

    MAILDIR=$HOME/Msgs
    INCLUDERC=$MAILDIR/lists.rc
    INCLUDERC=$MAILDIR/spam.rc

    要关闭电子邮件列表的 Procmail 过滤但保留垃圾邮件控制,请使用哈希符号(#)注释掉第一个 INCLUDERC 行。请注意,它使用相对于当前目录的路径。

  • LOCKSLEEP - 设置 Procmail 尝试使用特定锁定文件之间的时间间隔(以秒为单位)。默认值为 8 秒。
  • LOCKTIMEOUT - 设置在最后修改锁定文件后必须经过的时间(以秒为单位),然后 Procmail 假定 lockfile 旧且可以删除。默认值为 1024 秒。
  • LOGFILE - 将任何 Procmail 信息或错误消息写入的文件。
  • MAILDIR - 为 Procmail 设置当前工作目录.如果设置,所有其他 Procmail 路径均相对于此目录。
  • ORGMAIL - 指定原始邮箱或其他位置,以便在邮件无法放置在默认或必需位置时放置邮件。

    默认情况下,使用 /var/spool/mail/$LOGNAME 的值。

  • SUSPEND - 设置 Procmail 在必要的资源(如交换空间)不可用时暂停的时间(以秒为单位)。
  • SWITCHRC - 允许用户指定包含其他 Procmail 配方的外部文件(类似于 INCLUDERC 选项),但实际停止了引用配置文件的引用配置文件,仅使用 SWITCHRC-specified 文件上的配方。
  • VERBOSE - 导致 Procmail 记录更多信息。此选项对于调试非常有用。

其他重要环境变量从 shell 中拉取,如 LOGNAME、登录名称、HOME、主目录的位置;以及 SHELL (默认 shell)。

procmailrc man page 中提供了所有环境变量及其默认值的全面说明。

15.4.2. Procmail Recipes

新用户通常发现构建配方的方法是使用 Procmail 时最难学习的部分。这种困难通常导致了使用用于指定字符串匹配条件的正则表达式来配方匹配消息。但是,正则表达式在阅读时并不难以构造,甚至更难以理解。此外,Procmail 配方的编写方式的一致性,无论正则表达式如何,都让您能够轻松通过示例学习。要查看 Procmail 方法示例,请参阅 第 15.4.2.5 节 “配方示例”

Procmail 方法采用以下形式:

:0 flags : lockfile-name
* condition_1_special-condition-character condition_1_regular_expression
* condition_2_special-condition-character condition-2_regular_expression
* condition_N_special-condition-character condition-N_regular_expression
    special-action-character
    action-to-perform

Procmail 方法中的前两个字符是冒号和一个零。可以在零的后面放置各种标志,以控制 Procmail 如何处理该方法。flags 部分后有一个冒号指定为此消息创建一个 lockfile。如果创建了 lockfile,可以通过替换 lockfile-name 来指定名称。

配方可以包含与消息匹配的多个条件。如果没有条件,则每个消息都与配方匹配。正则表达式在某些条件中放置,以便于消息匹配。如果使用多个条件,它们必须全部匹配才能执行该操作。根据配方第一行中设置的标志检查条件。在星号字符(*)后面放置的可选特殊字符可进一步控制条件。

action-to-perform 参数指定消息与其中一个条件匹配时执行的操作。每个方法只能有一个操作。许多情况下,此处使用邮箱名称将匹配的邮件定向到该文件中,从而有效地对电子邮件进行排序。也可以在指定操作之前使用特殊操作字符。如需更多信息,请参阅 第 15.4.2.4 节 “特殊条件和操作”

15.4.2.1. 交付与.非交付 Recipes

如果方法与某一特定消息匹配,则使用的操作决定了它是否被视为传送方式还是非传送方法 。传输方法包含将消息写入文件、将消息发送到另一个程序的操作,或者将消息转发到另一个电子邮件地址。非传送方法涵盖任何其他操作,如嵌套块。嵌套块是一组操作,包含在大括号 {} 中,在与方法条件匹配的消息上执行。嵌套块可以互相嵌套,为识别和执行消息的操作提供更好的控制。

当消息与传输方法匹配时,Procmail 执行指定的操作,并停止将消息与任何其他方法进行比较。与非传送配方匹配的消息继续与其他配方进行比较。

15.4.2.2. 标记

标志对于确定方法或是否将方法与消息进行比较至关重要。The egrep 实用程序在内部用于匹配条件。常用的标记如下:

  • a - 指定仅在之前没有 A 或标志的配方匹配这个消息时使用此方法。
  • a - 指定仅在之前与 A标志 匹配的方法 并且 成功完成时,才会使用此方法。
  • b - 解析邮件正文并查找匹配条件。
  • b - 使用任何结果操作中的正文,例如将消息写入文件或将其转发。这是默认的行为。
  • c - 生成电子邮件的碳副本。这可用于传输方法,因为可以对消息执行必要的操作,并且可以在 rc 文件中继续处理消息的副本。
  • D - 使 egrep 比较区分大小写.默认情况下,比较过程不区分大小写。
  • e - 虽然与 A 标志类似,但方法中的条件仅与消息相比,当前方的配方没有 E 标志不匹配时。这等同于 其他操作
  • e - 只有在立即前面的配方中指定的操作失败时,才会将方法与消息进行比较。
  • f - 将管道用作过滤器。
  • h - 解析邮件的标题并查找匹配条件。这是默认的行为。
  • h - 在生成的操作中使用标头。这是默认的行为。
  • w - Tells Procmail 等待指定过滤器或程序完成,并报告在考虑过滤后邮件是否成功。
  • w - 除"程序失败"消息被抑制外,与 w 相同。

有关其他标志的详细列表,请参阅 procmailrc man page。

15.4.2.3. 指定本地锁定文件

Procmail 提供 Lockfiles 非常有用,可确保多个进程不会尝试同时更改邮件。通过在方法的第一行上的任何标志后面加上冒号(:)来指定本地锁定文件。这会基于目标文件名加上 LOCKEXT 全局环境变量中设置的任何内容创建一个本地锁定文件。

或者,指定冒号后要用于此方法的本地锁定文件名称。

15.4.2.4. 特殊条件和操作

Procmail 方法条件和操作会改变它们的解释方式。

以下字符可在方法行开头的星号字符(*)后面使用:

  • ! - 在条件行中,这个字符会颠倒该条件,只有在条件与邮件不匹配时才会导致匹配。
  • < - 检查消息是否在指定数量的字节下。
  • > - 检查消息是否超过指定数量的字节。

以下字符用于执行特殊操作:

  • ! - 在操作行中,此字符告知 Procmail 将邮件转发至指定的电子邮件地址。
  • $ - 引用之前在 rc 文件中设置的变量。这通常用于设置由不同方法引用的通用邮箱。
  • | - 启动指定程序来处理消息.
  • {} - 构造一个嵌套块,用于包含应用到匹配消息的额外方法。

如果在操作行开头没有使用特殊字符,Procmail 假定操作行正在指定要在其中写入邮件的邮箱。

15.4.2.5. 配方示例

Procmail 是一个极其灵活的程序,但由于这种灵活性,新用户很难从头开始制作 Procmail 配方。

培养构建 Procmail 配方条件的技能的最佳方式源自对正则表达式的深入了解,以及查看他人构建的许多示例。正则表达式的详尽说明不在本节的范围之内。Procmail 配方和有用示例 Procmail 配方和有用示例 Procmail 配方可在 Internet 上的不同位置找到。要查看这些方法示例,可以生成对正则表达式的正确使用和改编。此外,可以在 grep(1) man page 中找到有关基本正则表达式规则的介绍信息。

以下简单示例演示了 Procmail 配方的基本结构,并且可为更加复杂的结构提供基础。

基本方法可能甚至不包含条件,如下例所示:

:0:
new-mail.spool

第一行指定将创建本地锁定文件,但不指定名称,因此 Procmail 使用目标文件名并附加 LOCKEXT 环境变量中指定的值。未指定任何条件,因此每个邮件均与此方法匹配,并放置在 MAILDIR 环境变量指定的目录中,名为 new-mail.spool 文件。然后 MUA 可以在该文件中查看消息。

这样的基本方法可以放在 all rc 文件的末尾,以将消息定向到默认位置。

以下示例匹配来自特定电子邮件地址的消息并将其丢弃。

:0
* ^From: spammer@domain.com
/dev/null

在这个示例中,spammer@domain.com 发送的所有信息都会发送到 / dev/null 设备,删除它们。

警告

请确保规则正在按预期运行,然后发送消息到 /dev/null 以永久删除。如果意外捕获意想不到的消息,并且这些消息消失,那么对规则进行故障排除就会变得困难。

更好的解决方案是将配方的操作指向一个特殊的邮箱,可以不时检查该邮箱查找假的正状态。旦发现没有意外匹配任何消息,请删除邮箱并指示操作将消息发送到 /dev/null

以下配方抓取从特定邮件列表中发送的电子邮件并将其放置在指定的文件夹中:

:0:
* ^(From|Cc|To).*tux-lug
tuxlug

tux-lug@domain.com 邮件列表发送的所有消息都自动放在 MUA 的 tuxlug 邮箱中。请注意,如果此示例中的条件在 FromCcTo 行上有邮件列表的电子邮件地址,则此示例中的条件与邮件相匹配。

如需更详细、功能强大的配方,请参阅 第 15.7 节 “其它资源” 中的许多 Procmail 在线资源。

15.4.2.6. 垃圾邮件过滤器

由于接收新电子邮件后 Sendmail、Postfix 和 Fetchmail 调用它,Procmail 可用作防御垃圾邮件的强大工具。

当 Procmail 与 SpamAssassin 结合使用时,这一点尤为重要。当一起使用时,这两个应用可以快速识别垃圾邮件电子邮件,并对其进行排序或销毁。

SpamAssassin 使用标题分析、文本分析、黑名单、垃圾邮件跟踪数据库和自学 Bayesian 垃圾邮件分析来快速准确地识别和标记垃圾邮件。

注意

要使用 SpamAssassin,请首先确保以 root 用户身份在您的系统中安装 spamassassin 软件包:

~]# yum install spamassassin

有关使用 Yum 安装软件包的详情请参考 第 9.2.4 节 “安装软件包”

本地用户使用 SpamAssassin 的最简单方法是将以下行放在 ~/.procmailrc 文件顶部附近:

INCLUDERC=/etc/mail/spamassassin/spamassassin-default.rc

/etc/mail/spamassassin/spamassassin-default.rc 包含一个简单的 Procmail 规则,用于激活所有传入电子邮件的 SpamAssassin。如果确定电子邮件为垃圾邮件,则在标题中将其标记,标题前面带有以下模式:

SPAM

电子邮件的正文也会紧随其后,确定是什么元素导致该邮件被诊断为垃圾邮件。

要提交标记为垃圾邮件的电子邮件,可以使用类似如下的规则:

      :0 Hw
      * ^X-Spam-Status: Yes
      spam

该规则会将标题中标记的所有电子邮件作为垃圾邮件文件到名为垃圾邮件的邮箱中

由于 SpamAssassin 是 Perl 脚本,因此在繁忙的服务器中可能需要使用二进制 SpamAssassin 守护进程(垃圾邮件)和客户端应用程序(spamc)。然而,以这种方式配置 SpamAssassin 需要对该主机的 root 访问权限。

要启动 spamd 守护进程,请输入以下命令:

~]# systemctl start spamassassin

要在系统引导时启动 SpamAssassin 守护进程,请运行:

systemctl enable spamassassin.service

有关启动和停止服务的更多信息,请参阅 第 10 章 使用 systemd 管理服务

要将 Procmail 配置为使用 SpamAssassin 客户端应用程序而不是 Perl 脚本,请在 ~/.procmailrc 文件顶部附近放置下面这一行:对于系统范围的配置,将其放在 /etc/procmailrc 中

INCLUDERC=/etc/mail/spamassassin/spamassassin-spamc.rc