sendmail address rewriting mini-HOWTO 作者: Thomas Roessler [1]roessler@guug.de 译者: 苏江文 [2]softsprite@yeah.net v0.0, 6 May 1998 翻译日期: 16 Dec 1999 _________________________________________________________________ 本文介绍家庭用户拨号访问如何配置 sendmail 。 _________________________________________________________________ 1. 导言 2. 文件路径映射 3. 配置 sendmail * 3.1 主要的配置文件 * 3.2 地址重写 * 3.3 别名 4. 进阶阅读 _________________________________________________________________ 1. 导言 我们假设你现在已经能够进行类似通常在大学中的互联网访问及在线服务:你在 串口联接通过PPP拨号进入你的联接供应商的网络。 你接收的邮件是放在供应商 的POP或IMAP服务器中,发出的邮件则通过SMTP送出。你没有一个属于你的域名, 因此一切都必须使用一个地址。 我们假设你已经安装了Eric Allman的sendmail的最新版本(本文写作时最新版本 是8.8.8,这个版本能很好地工作)。(译者:当前最新稳定版本是8.9.3) 本文部分说明专指Debian GNU/Linux系统,使用其它发行版本的用户应引起注意 。 确认你手头掌握了以下信息: * 你的ISP的邮件服务器。 * 你的互联网邮件地址。 我们计划中的配置包括两个主要目标: 1. 能在两个不同的本地用户之间发送邮件。 2. 外部世界接收邮件时看到的是本地用户的ISP的邮件地址,而不是本地邮件地 址。 为了达到这个目的,我们将使用sendmail的 genericstable 特点。 2. 文件路径映射 我们将把所有sendmail的配置文件放在以下不同的目录中: /etc: /etc/mail 。 通常,sendmail将期待这些文件存放在 /etc 。 为了避免这个问题,将 /etc/sendmail.cf 符号链接到 /etc/mail/sendmail.cf 。 以下文件存放在 /etc/mail: * =20 * aliases - 包含附加的本地地址 * genericsdomain - 包含本地主机配置的一些信息 * genericstable - 包含重写规则 * sendmail.cf - sendmail的配置文件 * sendmail.mc - sendmail.cf 的配置源代码。 以上部分文件都附带著 .db 文件。它们包含能被sendmail直接使用的哈希数据库 。 我们假设sendmail配置源代码树的 cf 部分存放在目录 /usr/lib/sendmail.cf 中。 在 Debian GNU/Linux 系统中就是这样存放的。其它发行版本可能存放在不 同的地方。详情请参考你的发行版本的文档。 3. 配置 sendmail 3.1 主要的配置文件 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 到哪里去找到 aliases 文件。 以下几行告诉 sendmail 使用 genericstable 特点和到哪里去找到使用该特点的 配置文件: _________________________________________________________________ FEATURE(masquerade_envelope) FEATURE(genericstable, `hash -o /etc/mail/genericstable') GENERICS_DOMAIN_FILE(`/etc/mail/genericsdomain') _________________________________________________________________ masquerade_envelope 特点告诉 sendmail 去实现邮头重写到邮件的信封 传送者 。 这是一个外部邮件投递系统将用来直接投递失败报告和警告邮件的邮件地址 。generics* 文件将在下面解释。 现在,我们必须定义一个所谓 smart 主机,就是将要负责为你的系统传送外部邮 件的主机。 注意:这台主机有可能不是你的ISP的POP和IMAP服务器。 如果对此 不太清楚,联系你的ISP供应商。 主配置文件的代码如下: _________________________________________________________________ define(`SMART_HOST',`mail-out.your.provider') _________________________________________________________________ 请替换 mail-out.your.provider 成你的ISP的主机地址。 最后两行包含 "mailer" 定义,sendmail 根据这些定义才能知道如何处理不同类 型的邮件: _________________________________________________________________ MAILER(local) MAILER(smtp) _________________________________________________________________ 为了从这个 sendmail.mc 生成 sendmail.cf 文件,输入以下命令 (作为 root 用户): _________________________________________________________________ # m4 sendmail.mc > _sendmail.cf # mv -f _sendmail.cf sendmail.cf _________________________________________________________________ 注意我们使用的技术:将 m4 的输出写入一个临时文件,再转移到合适的地方。 这将帮助我们避免sendmail读入只写了一部分的配置文件。 3.2 地址重写 首先,我们必须告诉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主机发往外部的邮件。 3.3 别名 别名文件包含只对你本地邮件有效的附加本地名字。这对管理员账号象 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直接使用文本文件将效率低下。 aliases 采用和 genericstable 同 样的机制:生成一个哈希数据库。 取代直接使用 makemap ,这次你可以输入命 令 newaliases 。它将自动处理所需的一切。 4. 进阶阅读 sendmail源代码发行版中包含了许多文档。阅读它们,特别是文件 cf/README 。 如果你想深入了解sendmail的配置选项,你可以从以下地址取得“Bat Book”: O'Reilly: Bryan Costales, Eric Allman, and Neil Rickert: "sendmail". O'Reilly, 1993. References 1. mailto:roessler@guug.de 2. mailto:softsprite@yeah.net