28.3. Sendmail配置文件

Contributed by Christopher Shumway.

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

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

/etc/mail/access

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

可以在FreeBSD示例配置/etc/mail/access.sample中找到对IPv4IPv6地址使用这些选项的示例:

# $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的邮件被扩展到三个本地邮箱joeericpaul。远程邮箱可以指定为user@example.com。第三条显示了如何将邮件写入一个文件,在本例中,/dev/null。最后一条演示了如何通过UNIX®管道发送邮件到一个程序,/usr/local/bin/procmail。参考aliases(5)了解更多关于该文件格式的信息。

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

/etc/mail/sendmail.cf

这是Sendmail的主配置文件。它控制着Sendmail,例如从重写邮件地址到打印拒收邮件到远程邮件服务器的。相应地,这个配置文件相当复杂。幸运的是,对于标准的邮件服务器来说,这个文件很少需要修改。

Sendmail配置文件可以从m4(1)宏中建立,这些宏定义了Sendmail的特性和行为。请参考/usr/src/contrib/sendmail/cf/README了解具体细节。

每当对此文件进行更改时,都需要重新启动Sendmail才能使更改生效。

/etc/mail/virtusertable

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

FreeBSD 提供了一个示例配置文件,位于/etc/mail/virtusertable.sample,以进一步说明格式。以下示例演示如何使用该格式创建自定义条目:

root@example.com                root
postmaster@example.com          postmaster@noc.example.net
@example.com                    joe

这个文件是按照第一匹配的顺序处理的。当一个电子邮件地址与左边的地址匹配时,它将被映射到右边的本地邮箱。本例中第一个条目的格式是将特定的电子邮件地址映射到本地邮箱,而第二个条目的格式是将特定的电子邮件地址映射到远程邮箱。最后,任何来自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消息。

嘴直接的方式是将 ISPFQDN 写入 /etc/mail/relay-domains 中。如果有多个地址,一行写一个地址:

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

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

现在这个列表中的任何主机通过系统发送的任何邮件,只要用户在系统上有账户,都会成功。这样,用户就可以从系统中远程发送邮件,而不需要打开系统来转发来自互联网的SPAM

本文档和其它文档可从这里下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读 文档,如不能解决再联系 <questions@FreeBSD.org>.

关于本文档的问题请发信联系 <doc@FreeBSD.org>.