18.4. sendmail.cf 和 sendmail.mc 文件

m4 宏处理器程序生成sendmail.df文件,当它处理本地系统管理员提供的宏配置文件时。在本章的剩余部分,我们将把此配置文件称为sendmail.mc文件。

配置过程基本上是创建一个合适的sendmail.mc文件,其中包含描述您所需配置的宏。这些宏是 m4 宏处理器理解并扩展为复杂的sendmail.cf语法的表达式。宏表达式由宏名称(开头的大写字母文本,可以比作编程语言中的函数)和一些参数(括号内的文本)组成,这些参数用于扩展。参数可以按字面意思传递到sendmail.cf输出中,也可以用于控制宏处理的发生方式。

一个sendmail.mc文件的最小配置(UUCP 或 SMTP,所有非本地邮件都中继到直接连接的智能主机)可以短至 10 或 15 行,不包括注释。

18.4.1. 两个 sendmail.mc 文件示例

如果您是许多不同邮件主机的管理员,您可能不想将您的配置文件命名为sendmail.mc。相反,常见的做法是以主机名命名它——vstout.m4在我们的例子中。名称实际上并不重要,只要输出被称为sendmail.cf即可。为每个主机的配置文件提供唯一的名称,您可以将所有配置文件保存在同一个目录中,这只是一种管理上的便利。让我们看看两个示例宏配置文件,以便我们知道我们的方向。

今天大多数 sendmail 配置仅使用 SMTP。配置 sendmail 以用于 SMTP 非常简单。示例 18-1 期望 DNS 名称服务器可用以解析主机,并将尝试接受和传递所有仅使用 SMTP 的主机的邮件。

示例 18-1。示例配置文件 vstout.smtp.m4

divert(-1)
#
# Sample configuration file for vstout - smtp only
#
divert(0)
VERSIONID(`@(#)sendmail.mc	8.7 (Linux) 3/5/96')
OSTYPE(`linux')
#
# Include support for the local and smtp mail transport protocols.
MAILER(`local')
MAILER(`smtp')
#
FEATURE(rbl)
FEATURE(access_db)
# end

一个sendmail.mc文件,用于 Virtual Brewery 的 vstout,如 示例 18-2 所示。vstout 使用 SMTP 与 Brewery 的 LAN 上的所有主机通信,您将看到它与刚刚介绍的通用仅 SMTP 配置的共性。此外,vstout 配置将所有其他目的地的邮件通过 UUCP 发送到其 Internet 中继主机 moria

示例 18-2。示例配置文件 vstout.uucpsmtp.m4

divert(-1)
#
# Sample configuration file for vstout
#
divert(0)
VERSIONID(`@(#)sendmail.mc	8.7 (Linux) 3/5/96')
OSTYPE(`linux')
dnl
# moria is our smart host, using the "uucp-new" transport.
define(`SMART_HOST', `uucp-new:moria')
dnl
# Support the local, smtp and uucp mail transport protocols.
MAILER(`local')
MAILER(`smtp')
MAILER(`uucp')
LOCAL_NET_CONFIG
# This rule ensures that all local mail is delivered using the
# smtp transport, everything else will go via the smart host.
R$* < @ $* .$m. > $*	$#smtp $@ $2.$m. $: $1 < @ $2.$m. > $3
dnl
#
FEATURE(rbl)
FEATURE(access_db)
# end

如果您比较和对比这两个配置,您也许能够弄清楚每个配置参数的作用。我们将在下面详细解释它们。

18.4.2. 常用的 sendmail.mc 参数

sendmail.mc文件中的一些项目是始终需要的;如果您可以使用默认值,则可以忽略其他项目。在sendmail.mc中的定义的一般顺序如下

  1. VERSIONID

  2. OSTYPE

  3. DOMAIN

  4. FEATURE

  5. 本地宏定义

  6. MAILER

  7. LOCAL_* 规则集

在接下来的章节中,我们将依次讨论这些内容,并在适当时参考 示例 18-1示例 18-2 中的示例来解释它们。

18.4.2.1. 注释

sendmail.mc文件中以#字符开头的行不会被 m4 解析,默认情况下将直接输出到sendmail.cf文件中。如果您想在输入和输出文件中都注释您的配置正在做什么,这将很有用。

为了允许在您的sendmail.mc中添加 放入sendmail.cf的注释,您可以使用 m4 divertdnl 令牌。divert(-1) 将导致所有输出停止。divert(0) 将导致输出恢复为默认值。这些行之间生成的任何输出都将被丢弃。在我们的示例中,我们使用此机制提供仅出现在sendmail.mc文件中的注释。要为单行实现相同的结果,您可以使用 dnl 令牌,字面意思是“从下一行的开头开始,删除所有字符,直到并包括下一个换行符。” 我们也在我们的示例中使用了它。

这些是标准的 m4 功能,您可以从其手册页获得有关它们的更多信息。

18.4.2.2. VERSIONID 和 OSTYPE

VERSIONID(`@(#)sendmail.mc  8.9 (Linux) 01/10/98')
VERSIONID宏是可选的,但对于在sendmail.cf文件中记录 sendmail 配置的版本很有用。所以您经常会遇到它,我们推荐使用它。在任何情况下,请务必包含

OSTYPE(`linux')
这可能是最重要的定义。OSTYPEOSTYPE宏会导致包含一个定义文件,这些定义对于您的操作系统来说是很好的默认值。在 OSTYPEOSTYPE宏文件中,大多数定义都设置了各种配置文件、邮件程序路径和参数以及 sendmail 用于存储消息的目录的位置。标准 sendmail 源代码发布版本包含 Linux 的此类文件,之前的示例将包含该文件。一些 Linux 发行版,特别是 Debian 发行版,包含它们自己的定义文件,该文件完全符合 Linux-FHS 标准。当您的发行版执行此操作时,您应该可能使用其定义而不是 Linux 默认定义。

OSTYPE 定义应该是您的sendmail.mc文件中最早出现的定义之一,因为许多其他定义都依赖于它。

18.4.2.3. DOMAIN

当您希望以标准方式在同一网络上配置大量机器时,DOMAIN 宏很有用。如果您要配置少量主机,则可能不值得为此烦恼。您通常配置诸如邮件中继主机或网络上所有主机将使用的集线器的名称之类的项目。

标准安装包含一个 m4 宏模板目录,用于驱动配置过程。此目录通常命名为/usr/share/sendmail.cf或类似的名称。在这里,您将找到一个名为domain的子目录,其中包含特定于域的配置模板。要使用 DOMAIN 宏,您必须创建自己的宏文件,其中包含您站点所需的标准定义,并将其写入domain子目录。您通常只在此处包含特定于您的域的宏定义,例如智能主机定义或中继主机,但您不限于这些。

sendmail 源代码发行版附带了许多示例域宏文件,您可以使用它们来建模您自己的文件。

如果您将您的域宏文件另存为/usr/share/sendmail.cf/domain/vbrew.m4,您将在您的sendmail.mc中使用以下定义包含它
DOMAIN(`vbrew')

18.4.2.4. FEATURE

FEATURE 宏使您能够在您的配置中包含预定义的 sendmail 功能。这些 sendmail 功能使支持的配置非常易于使用。有很多功能,在本章中,我们将仅讨论一些更有用和更重要的功能。您可以在源代码包中包含的CF文件中找到可用功能的完整详细信息。

要使用列出的任何功能,您应该在您的sendmail.mc中包含一行,如下所示
FEATURE(name)
其中name被替换为功能名称。某些功能采用一个可选参数。如果您希望使用默认值以外的其他内容,则应使用如下所示的条目
FEATURE(name, param)
其中param是要提供的参数。

18.4.2.5. 本地宏定义

标准的 sendmail 宏配置文件提供了许多钩子和变量,您可以使用它们自定义您的配置。这些被称为本地宏定义。其中许多都列在 sendmail 源代码包的CF文件中。

本地宏定义通常通过提供宏的名称以及表示您希望分配给宏管理的变量的值的参数来调用。同样,我们将在本章后面介绍的示例中探讨一些更常见的本地宏定义。

18.4.2.6. 定义邮件传输协议

如果您希望 sendmail 以除本地传递之外的任何方式传输邮件,则必须告诉它要使用哪些传输协议。MAILER宏使这变得非常容易。当前版本的 sendmail 支持多种邮件传输协议;其中一些是实验性的,其他一些可能很少使用。

在我们的网络中,我们需要 SMTP 传输协议在本地网络上的主机之间发送和接收邮件,以及 UUCP 传输协议从我们的智能主机发送和接收邮件。为了实现这一点,我们只需包含smtpuucp邮件传输协议。默认情况下包含local邮件传输协议,但如果您愿意,可以为了清晰起见而定义它。如果您在配置中同时包含smtpuucp邮件程序,则必须始终确保首先定义smtpmailer。

以下列表描述了您可以使用 MAILER 宏获得的更常用的传输协议

local

此传输协议包括用于将邮件发送到此机器上的用户邮箱的本地传递代理,以及用于将消息发送到本地程序的 prog 邮件程序。默认情况下包含此传输协议。

smtp

此传输协议实现简单邮件传输协议 (SMTP),这是 Internet 上最常见的邮件传输方式。当您包含此传输协议时,将配置四个邮件程序smtp(基本 SMTP),esmtp(扩展 SMTP),smtp8(8 位二进制清除 SMTP), 和relay(专门为在主机之间进行网关消息而设计)。

uucp

uucp 传输协议提供对两个邮件程序的支持:uucp-old,这是传统的 UUCP,以及 uucp-new,它允许在一个传输中处理多个收件人。

usenet

此邮件程序允许您将邮件消息直接发送到 Usenet 风格的新闻网络。任何定向到 news.group.usenet 地址的本地消息都将被馈送到 news.group 新闻组的新闻网络中。

fax

如果您安装了 HylaFAX 软件,此邮件程序将允许您将电子邮件定向到它,以便您可以构建电子邮件-传真网关。此功能在撰写本文时是实验性的,更多信息可以从 http://www.vix.com/hylafax/ 获取。

还有其他一些,例如 popprocmailmail11phquerycyrus,它们很有用,但不太常见。如果您对此感到好奇,您可以在 sendmail 书籍或源代码包中提供的文档中阅读有关这些内容的信息。

18.4.2.7. 配置本地主机的邮件路由

Virtual Brewery 的配置可能比大多数站点需要的更复杂。如今,大多数站点将仅使用 SMTP 传输协议,而根本不必处理 UUCP。在我们的配置中,我们配置了一个“智能主机”,用于处理所有传出邮件。由于我们在本地网络上使用 SMTP 传输协议,因此我们必须告诉 sendmail 它不能通过智能主机发送本地邮件。LOCAL_NET_CONFIG宏允许您将 sendmail 规则直接插入到输出sendmail.cf中,以修改本地邮件的处理方式。我们稍后将详细讨论重写规则,但目前您应该接受我们在示例中提供的规则指定,任何发往 vbrew.com 域中主机的邮件都应使用 SMTP 邮件传输协议直接传递到目标主机。