29.3. Sendmail 配置文件

Sendmail 是 FreeBSD 默认安装的 MTA。它接受来自 MUA 的邮件,并根据其配置定义将其送到相应的邮件主机。Sendmail 也可以接受网络连接,并将邮件发送到本地邮箱或其他程序。

Sendmail 的配置文件位于 /etc/mail 中。本节将详细介绍这些文件。

/etc/mail/access

这个访问数据库文件定义了哪些主机或 IP 地址可以访问本地邮件服务器,以及它们有什么样的访问权限。列为 OK 的主机,也就是默认选项,允许向该主机发送邮件,只要邮件的最终目的地是本地机器。列为 REJECT 的主机会拒绝所有的邮件连接。被列为 RELAY 的主机被允许使用该邮件服务器向任何目的地发送邮件。被列为 ERROR 的主机将使他们的邮件以指定的邮件错误返回。如果一个主机被列为 SKIP,Sendmail 将放弃当前对这个条目的搜索而不接受或拒绝邮件。被列为 QUARANTINE 的主机将被保留其邮件,并将收到指定的文字作为保留的原因。

对 IPv4 和 IPv6 地址使用这些选项的例子可以在 FreeBSD 样本配置中找到,/etc/mail/access.sample

# $FreeBSD$
#
# Mail relay access control list.  Default is to reject mail unless the
# destination is local, or listed in /etc/mail/local-host-names
#
## Examples (commented out for safety)
#From:cyberspammer.com          ERROR:"550 We don't accept mail from spammers"
#From:okay.cyberspammer.com     OK
#Connect:sendmail.org           RELAY
#To:sendmail.org                RELAY
#Connect:128.32                 RELAY
#Connect:128.32.2               SKIP
#Connect:IPv6:1:2:3:4:5:6:7     RELAY
#Connect:suspicious.example.com QUARANTINE:Mail from suspicious host
#Connect:[127.0.0.3]            OK
#Connect:[IPv6:1:2:3:4:5:6:7:8] OK

要配置访问数据库,请使用样本中所示的格式在 /etc/mail/access 中建立条目,但不要在条目前面加上注释符号(#)。为每个需要配置访问权限的主机或网络创建一个条目。匹配表格左边的邮件发送者会受到表格右边的行动影响。

每当这个文件被更新时,要更新它的数据库并重新启动 Sendmail:

# makemap hash /etc/mail/access < /etc/mail/access
# service sendmail restart

/etc/mail/aliases

这个数据库文件包含一个虚拟邮箱的列表,这些虚拟邮箱被扩展到用户、文件、程序或其他别名。下面是几个条目来说明文件的格式:

root: localuser
ftp-bugs: joe,eric,paul
bit.bucket:  /dev/null
procmail: "|/usr/local/bin/procmail"

冒号左边的邮箱名称被扩展到右边的目标。第一个条目将 root 邮箱扩展到 localuser 邮箱,然后在 /etc/mail/aliases 数据库中进行查找。如果没有找到匹配的,邮件就会被投递到 localuser。第二个条目显示了一个邮件列表。给 ftp-bugs 的邮件被扩展到三个本地邮箱 joe, ericpaul。一个远程邮箱可以被指定为 [email protected]。第三个条目显示了如何将邮件写入一个文件,在这个例子中是 /dev/null。最后一条演示了如何通过UNIX®管道将邮件发送到一个程序,/usr/local/bin/procmail。关于这个文件的格式,请参考 aliases(5)open in new window 的更多信息。

每当这个文件被更新时,运行 newaliases来更新和初始化别名数据库。

/etc/mail/sendmail.cf

这是 Sendmail 的主配置文件。它控制 Sendmail 的整体行为,包括从重写电子邮件地址到打印拒绝信息到远程邮件服务器的一切。因此,这个配置文件是相当复杂的。幸运的是,对于标准的邮件服务器来说,这个文件很少需要被修改。

主 Sendmail 配置文件可以由定义 Sendmail 功能和行为的 m4(1)open in new window 宏构建。参考 /usr/src/contrib/sendmail/cf/README 以了解其中的一些细节。

每当对这个文件进行修改时,需要重新启动 Sendmail 以使修改生效。

/etc/mail/virtusertable

这个数据库文件将虚拟域和用户的邮件地址映射到真实的邮箱中。这些邮箱可以是本地的、远程的、在 /etc/mail/aliases 中定义的别名,或文件。这允许在一台机器上托管多个虚拟域。

FreeBSD在 /etc/mail/virtusertable.sample 中提供了一个配置文件样本来进一步演示其格式。下面的例子演示了如何使用该格式创建自定义条目:

这个文件是以第一匹配顺序处理的。当一个电子邮件地址与左边的地址相匹配时,它就被映射到右边列出的本地邮箱中。本例中第一个条目的格式是将一个特定的电子邮件地址映射到本地邮箱,而第二个条目的格式是将一个特定的电子邮件地址映射到远程邮箱。最后,来自 example.com 的任何电子邮件地址,如果没有与前面的任何条目相匹配,将与最后一个映射相匹配,并被发送到本地邮箱 joe。当创建自定义条目时,使用这种格式并将其添加到 /etc/mail/virtusertable。每当这个文件被编辑时,要更新它的数据库并重新启动 Sendmail:

# makemap hash /etc/mail/virtusertable < /etc/mail/virtusertable
# service sendmail restart

/etc/mail/relay-domains

在默认的 FreeBSD 安装中,Sendmail 被配置为只从它所运行的主机上发送邮件。例如,如果有一个 POP 服务器,用户将能够从远程位置检查邮件,但他们将不能从外部位置发送邮件。通常情况下,在尝试后的片刻,将从 MAILER-DAEMON 发送一封带有 5.7 Relaying Denied 信息的电子邮件。

最直接的解决办法是将 ISP 的 FQDN 添加到 /etc/mail/relay-domains。如果需要多个地址,可以每行添加一个:

your.isp.example.com
other.isp.example.net
users-isp.example.org
www.example.org

在创建或编辑这个文件后,用 service sendmail restart 重新启动 Sendmail。

现在,这个列表中的任何主机通过系统发送的任何邮件,只要用户在系统上有一个账户,都会成功。这使得用户可以从系统中远程发送邮件,而不至于让系统从互联网上转发垃圾邮件。