Sendmail 使用高度复杂的规则系统进行配置。虽然你可以用这些东西做很多巧妙的技巧,但从头开始编写 sendmail.cf
文件是非常不寻常且耗时的。如果你有兴趣这样做,你应该立即停止阅读本文档,转而阅读 O'Reilly 的 "蝙蝠书"(Bat Book)。
与手工制作这些规则不同,我们将依靠 m4
宏处理器从随 sendmail 一起分发的现成部分组装我们的配置文件。
让我们看看 sendmail.mc
文件的第一行
include(/usr/lib/sendmail.cf/m4/cf.m4) VERSIONID(`sendmail.mc - roessler@guug.de') OSTYPE(debian) define(`ALIAS_FILE',`/etc/mail/aliases')
在开始时,包含了 cf.m4
。这个 m4 宏文件包含了文件中其余部分的大量宏定义。请确保你在此处给出的路径是正确的 - 我们在示例中表示的路径对于 Debian GNU/Linux 是典型的。OSTYPE
宏用于为某些配置值提供一些有用的默认值。如果你没有使用 Debian 系统,你应该在此处将 "debian" 替换为 "linux"。ALIAS_FILE
告诉 sendmail 在哪里查找别名列表。
以下行告诉 sendmail 使用 genericstable
功能,以及在哪里找到使用它所需的配置文件
FEATURE(masquerade_envelope) FEATURE(genericstable, `hash -o /etc/mail/genericstable') GENERICS_DOMAIN_FILE(`/etc/mail/genericsdomain')
masquerade_envelope
功能告诉 sendmail 将标头重写应用于消息的信封发件人。这是外部邮件传递子系统将 направлять 其传递失败报告和警告消息的邮件地址。generics*
文件将在下面解释。
现在,我们必须定义一个所谓的智能主机,即一台将处理你的系统外发邮件的机器。请注意,这台机器可能与你的 ISP 的 POP 和 IMAP 服务器不同。如有疑问,请联系热线。主配置文件中的代码
define(`SMART_HOST',`mail-out.your.provider')
最后两行包含 sendmail 需要的 "mailer" 定义,以了解如何处理各种类型的邮件
MAILER(local) MAILER(smtp)
要从 sendmail.mc
文件生成 sendmail.cf
文件,请键入以下命令(以 root 身份)
# m4 sendmail.mc > _sendmail.cf # mv -f _sendmail.cf sendmail.cf
m4
的输出写入临时文件,然后将其移动到正确位置的技术。这有助于我们防止 sendmail 读取部分写入的配置文件。
首先,我们必须告诉 sendmail 哪些地址应被视为本地地址(因此应进行重写)。这非常简单:只需将你的机器的完全限定主机名放入文件 /etc/mail/genericsdomain
中。要获取你的主机的完全限定名称,请键入以下命令
$ hostname -f
现在,让我们来讨论真正的重写表:/etc/mail/genericstable
。此文件由两个空格分隔的列组成。第一列包含本地地址,第二列包含应替代使用的电子邮件地址。该文件可能如下所示
harry harryx@your.isp maude maudey@her.isp root fredx@your.isp news fredx@your.isp
请注意,本地计算机上的每个帐户都应该有一个条目,以便从本地系统泄漏出来的自动生成的邮件带有正确的标头信息。
出于性能原因,sendmail 不会直接使用此文本文件,而是依赖于 "哈希" 版本。要生成它,请键入以下命令
# makemap -r hash genericstable.db < genericstable
请注意,来自 genericstable
的重写规则将不适用于本地邮件或你从外部收到的消息 - 此映射仅在消息离开你的本地系统发往你的 ISP 的智能主机时使用。
别名文件包含仅对本地消息有效的其他本地名称。这对于诸如 root
之类的管理帐户非常有用,这些帐户会收到来自你的系统的自动生成的消息。
/etc/mail/aliases
的合理开头可能如下文件所示
root: fred news: root postmaster: root mail: root www: root nobody: /dev/null MAILER-DAEMON: nobody
此示例将把 root
、news
、postmaster
、mail
和 www
用户的本地邮件转发给 fred
,而 nobody
和 MAILER-DAEMON
的邮件将重定向到 /dev/null
。
就像 genericstable
一样,aliases
可能包含大量条目。因此,对于 sendmail 来说,使用我们刚刚描述的文本文件再次是低效的。与 genericstable
相同的机制用于 aliases
:生成哈希数据库。你可以这次输入命令 newaliases
,而不是直接使用 makemap
。它将自动处理所有需要的操作。