sendmail address rewriting mini-HOWTO <author> 作者: Thomas Roessler <tt><htmlurl url="mailto:roessler@guug.de" name="roessler@guug.de"></tt><newline> 译者: 苏江文 <tt><htmlurl url="mailto:softsprite@yeah.net" name="softsprite@yeah.net"></tt> <date>v0.0, 6 May 1998 翻译日期: 16 Dec 1999 <abstract> 本文介绍家庭用户拨号访问如何配置 sendmail 。 </abstract> <sect>导言 <p>我们假设你现在已经能够进行类似通常在大学中的互联网访问及在线服务:你在串口联接通过PPP拨号进入你的联接供应商的网络。 你接收的邮件是放在供应商的POP或IMAP服务器中,发出的邮件则通过SMTP送出。你没有一个属于你的域名,因此一切都必须使用<em/一个/地址。 <p>我们假设你已经安装了Eric Allman的sendmail的最新版本(本文写作时最新版本是8.8.8,这个版本能很好地工作)。(译者:当前最新稳定版本是8.9.3) <p>本文部分说明专指Debian GNU/Linux系统,使用其它发行版本的用户应引起注意。 <p>确认你手头掌握了以下信息: <itemize> <item>你的ISP的邮件服务器。 <item>你的互联网邮件地址。 </itemize> <p>我们计划中的配置包括两个主要目标: <enum> <item>能在两个不同的本地用户之间发送邮件。 <item>外部世界接收邮件时看到的是本地用户的ISP的邮件地址,而不是本地邮件地址。 </enum> <p>为了达到这个目的,我们将使用sendmail的 <tt/genericstable/ 特点。 <sect>文件路径映射 <p>我们将把所有sendmail的配置文件放在以下不同的目录中: <tt//etc/: <tt//etc/mail/ 。通常,sendmail将期待这些文件存放在 <tt//etc/ 。 为了避免这个问题,将 <tt//etc/sendmail.cf/ 符号链接到 <tt//etc/mail/sendmail.cf/ 。 <p>以下文件存放在 <tt//etc/mail/: <itemize>=20 <item><tt/aliases/ - 包含附加的本地地址 <item><tt/genericsdomain/ - 包含本地主机配置的一些信息 <item><tt/genericstable/ - 包含重写规则 <item><tt/sendmail.cf/ - sendmail的配置文件 <item><tt/sendmail.mc/ - <tt/sendmail.cf/ 的配置源代码。 </itemize> 以上部分文件都附带著 <tt/.db/ 文件。它们包含能被sendmail直接使用的哈希数据库。 <p>我们假设sendmail配置源代码树的 <tt/cf/ 部分存放在目录 <tt//usr/lib/sendmail.cf/ 中。 在 Debian GNU/Linux 系统中就是这样存放的。其它发行版本可能存放在不同的地方。详情请参考你的发行版本的文档。 <sect>配置 sendmail <sect1>主要的配置文件 <p>sendmail 在它的配置中使用相当复杂的规则系统。在你掌握许多配置窍门之前,通过手工写一个 <tt/sendmail.cf/ 文件很不常见并且耗费大量时间。如果你对此感兴趣,你可以停止阅读本文而去看 O'Reilly 的 "Bat Book" 。 <p>取代使用手工配置的方法,我们使用 <tt/m4/ 宏处理器将预定义好的文件生成你的配置文件,这些预定义文件随 sendmail 的发行版本一并提供。 <p>请看文件 <tt/sendmail.mc/ 的第一行: <code> include(/usr/lib/sendmail.cf/m4/cf.m4) VERSIONID(`sendmail.mc - roessler@guug.de') OSTYPE(debian) define(`ALIAS_FILE',`/etc/mail/aliases') </code> 在第一行, <tt/cf.m4/ 被包含进来。这个 m4 宏文件包含了其它部分将用到的许多宏定义。 确定你提供的路径是正确的 - 在我们这个例子中提供的这个路径是Debian GNU/Linux的典型路径。 <tt/OSTYPE/ 宏被用来给出一些非常有用的当前配置的缺省值。 如果你不是使用Debian系统,你可以将这里的 "debian" 换成 "linux" 。 <tt/ALIAS_FILE/ 告诉 sendmail 到哪里去找到 aliases 文件。 <p>以下几行告诉 sendmail 使用 <tt/genericstable/ 特点和到哪里去找到使用该特点的配置文件: <code> FEATURE(masquerade_envelope) FEATURE(genericstable, `hash -o /etc/mail/genericstable') GENERICS_DOMAIN_FILE(`/etc/mail/genericsdomain') </code> <tt/masquerade_envelope/ 特点告诉 sendmail 去实现邮头重写到邮件的<em/信封/ 传送者。 这是一个外部邮件投递系统将用来直接投递失败报告和警告邮件的邮件地址。<tt/generics*/ 文件将在下面解释。 <p>现在,我们必须定义一个所谓 smart 主机,就是将要负责为你的系统传送外部邮件的主机。 注意:这台主机有可能不是你的ISP的POP和IMAP服务器。 如果对此不太清楚,联系你的ISP供应商。 主配置文件的代码如下: <code> define(`SMART_HOST',`mail-out.your.provider') </code> 请替换 <em/mail-out.your.provider/ 成你的ISP的主机地址。 <p>最后两行包含 "mailer" 定义,sendmail 根据这些定义才能知道如何处理不同类型的邮件: <code> MAILER(local) MAILER(smtp) </code> <p>为了从这个 <tt/sendmail.mc/ 生成 <tt/sendmail.cf/ 文件,输入以下命令 (作为 root 用户): <code> # m4 sendmail.mc > _sendmail.cf # mv -f _sendmail.cf sendmail.cf </code> 注意我们使用的技术:将 <tt/m4/ 的输出写入一个临时文件,再转移到合适的地方。这将帮助我们避免sendmail读入只写了一部分的配置文件。 <sect1>地址重写 <p>首先,我们必须告诉sendmail哪些地址将被认为是本地地址(然后将被重写)。这很简单:只要将你的机器的完整主机名放入文件 <tt//etc/mail/genericsdomain/。 为了取得你的机器的完整主机名,输入以下命令: <code> $ hostname -f </code> <p>现在,让我们看一下重写表: <tt//etc/mail/genericstable/ 。这个文件由被空格分开的两列组成。第一列包含本地地址,第二列包含替换后的邮件地址。 文件看起来如下: <code> harry harryx@your.isp maude maudey@her.isp root fredx@your.isp news fredx@your.isp </code> 注意<em/每一个/本地机器上的账号都要有一行,这样自动生成的外发邮件能带上正确的头信息。 <p>为了性能的考虑, sendmail 并不直接使用这个文本文件,而是用“哈希”版本替代。为了生成这个版本,输入以下命令: <code> # makemap -r hash genericstable.db < genericstable </code> <p>注意: <tt/genericstable/ 指定的重写规则将<em/不/ 作用在本地邮件或你从外部接收到的邮件 - 这种转换只使用在从你本地机器通过你的ISP主机发往外部的邮件。 <sect1>别名 <p>别名文件包含只对你本地邮件有效的附加本地名字。这对管理员账号象 <tt/root/ 非常有用,从你的系统接收自动转换来的邮件。 <p><tt//etc/mail/aliases/ 可能如下所示: <code> root: fred news: root postmaster: root mail: root www: root nobody: /dev/null MAILER-DAEMON: nobody </code> 这个例子将路由送往 <tt/root/, <tt/news/, <tt/postmaster/, <tt/mail/, 和 <tt/www/ 用户的本地邮件到 <tt/fred/ , 而送往 <tt/nobody/ 和 <tt/MAILER-DAEMON/ 的邮件将重定向到 <tt//dev/null/ 。 <p>就象 <tt/genericstable/, <tt/aliases/ 可能包含<em/许多/ 项。因此,就象我们上面所说的,sendmail直接使用文本文件将效率低下。 <tt/aliases/ 采用和 <tt/genericstable/ 同样的机制:生成一个哈希数据库。 取代直接使用 <tt/makemap/ ,这次你可以输入命令 <tt/newaliases/ 。它将自动处理所需的一切。 <sect>进阶阅读 <p>sendmail源代码发行版中包含了许多文档。阅读它们,特别是文件 <tt/cf/README/ 。 <p>如果你想深入了解sendmail的配置选项,你可以从以下地址取得“Bat Book”: O'Reilly: Bryan Costales, Eric Allman, and Neil Rickert: "sendmail". O'Reilly, 1993. </article></linuxdoc>