Bill Lloyd Original work by Jim Mock Rewritten by 电子邮件 概述 email 电子邮件 电子邮件,或通常所说的 email,是现今使用最广泛的通信方式之一。 本章将对如何在 &os; 上运行邮件服务,以及如何使用 &os; 来收发电子邮件作基本的介绍; 然而,它并不是一份完整的参考手册,实际上,许多需要考虑的重要事项都没有提及。 我们推荐读者阅读 中的参考书籍,以获得对于这部分的全面认识。 读完这章,您将了解: 那些软件与收发电子邮件有关。 &os; 下的基本 sendmail 配置文件在哪里。 本地和远程邮箱之间的区别。 如何阻止垃圾邮件制造者非法地使用您的邮件服务器作为转发中继。 如何安装和配置用于替代 sendmail 的其他邮件传输代理。 如何处理常见的邮件服务器问题。 如何使用 SMTP 和 UUCP。 如何设置系统使其只能发送邮件。 如何在拨号连接时使用邮件。 如何配置 SMTP 验证以增加安全性。 如何安装并使用用户邮件代理,如 mutt 来收发邮件。 如何从远程的 POPIMAP 服务器上下载邮件。 如何在进入的邮件上自动地应用过滤器和规则。 阅读本章之前,您需要: 正确地配置您的网络连接 (). 正确地为您的邮件服务器配置 DNS 信息 ()。 知道如何安装第三方软件 (). 使用电子邮件 POP IMAP DNS 邮件交换可以分为 5 部分。它们是: 用户端程序、服务端守护进程、DNS、远程或本地的邮箱、 当然,还有邮件主机自己。 用户端程序 这包括一些基于命令行的程序,例如 muttpineelmmail,以及类似 balsaxfmail 这样的 GUI 程序。 此外,还有我们更熟悉的WWW 浏览器这样的程序。 这些程序简单地通过调用服务守护进程把邮件事务交给本地的 邮件主机,或者通过 TCP 把邮件发出去。 邮件主机上使用的服务程序 邮件服务程序 sendmail 邮件服务程序 postfix 邮件服务程序 qmail 邮件服务程序 exim &os; 默认情况下采用 sendmail, 但它也支持为数众多的其它邮件服务程序, 这其中包括: exim; postfix; qmail. 邮件服务器后台守护程序通常有两个功能 — 接收外面发来的邮件和把邮件传送出去。 但它 负责使用类似 POPIMAP 这样的协议来帮您阅读邮件, 也不负责连接到本地的 mbox 或 Maildir 信箱。 您可能需要其它的 服务程序 来完成这些任务。 较早版本的 sendmail 有一些严重的安全问题, 他们可能导致攻击者从本地和/或远程操作您的电脑。 您应该确认自己使用的是最新版本以避免这些问题。 另外, 也可以从 &os; Ports Collection 来安装其它的 MTA Email 和 DNS 域名系统 (DNS) 及其服务程序 named 在email的投递过程当中扮演着很重要的角色。 为了能够从您的站点向其它的站点传递邮件, 服务程序需要通过 DNS 查找接收邮件的远程站点的位置。 类似地, 在远程站点向您的主机投递邮件时也会发生这样的查找。 MX 记录 DNS 负责将主机名映射为 IP 地址, 同时, 也需要保存递送邮件时所需要的信息, 这些信息称作 MX 记录。 MX (Mail eXchanger,邮件交换) 记录指定了哪个, 或哪些主机能够接收特定域下的邮件。 如果您没有为主机名或域名设置 MX 记录, 则邮件将被直接递交给主机名对应 IP 所在的主机。 您可以通过 &man.host.1; 命令来查找任何域或主机名对应的 MX 记录, 如下面的例子所示: &prompt.user; host -t mx FreeBSD.org FreeBSD.org mail is handled (pri=10) by mx1.FreeBSD.org 接收邮件 电子邮件 接收 为您的域接收邮件是通过邮件服务器来完成的。 它收集发送给您的域的那些邮件,并保存到 mbox (存储邮件默认的方法) 或 Maildir 格式, 这取决于您采用的配置。 一旦邮件被保存下来, 就可以在本地通过类似 &man.mail.1; 或 mutt 这样的程序, 或在远程通过 POPIMAP 这样的协议来读取了。 简单地说, 如果您只在本地阅读邮件,那就没有必要安装 POPIMAP 服务。 通过 <acronym>POP</acronym> 和 <acronym>IMAP</acronym> 访问远程的邮件 POP IMAP 如果希望在远程访问邮箱, 就需要访问 POPIMAP 服务器。 这些协议允许用户从远程方便地访问他们的信箱。 尽管 POPIMAP 都允许用户从远程访问信箱, 但 IMAP 有很多优点, 这包括: IMAP 既可以从远程服务器上抓取邮件, 也可以把邮件放上去。 IMAP 支持并发更新。 IMAP 对于使用低速网络的用户尤为有用, 因为它能够让这些用户把邮件的结构下载下去, 而无需立即下载整个邮件。 它还可以在服务器端执行类似查找这样的操作, 以减少客户机和服务器之间的通讯量。 您可以按照下面的步骤来安装和配置 POPIMAP 服务器: 选择一个最符合需要的 IMAPPOP 服务器。 下列 POPIMAP 服务器是最著名的, 而且都有很多成功案例: qpopper; teapop; imap-uw; courier-imap; 通过 ports collection 安装 POPIMAP 服务。 根据需要修改 /etc/inetd.conf 来加载 POPIMAP 服务。 此外还应注意的是 POPIMAP 传递的信息, 包括用户名和口令等等, 通常都是明文的。 这意味着如果您希望加密传输过程中的信息, 可能需要考虑使用 &man.ssh.1; 隧道。 关于如何实施隧道在 中进行了详细阐述。 操作本地的信箱 信箱可以在邮件服务器本地直接用 MUA 来进行操作。 这通常是通过 mutt 或 &man.mail.1; 这样的用用程序实现的。 邮件服务器 邮件服务器 邮件服务器是通过服务器给的一个名字,这也正是它能在您的主机和网络上发送和接收邮件的原因. Christopher Shumway 作者: <application>sendmail</application> 配置 sendmail &man.sendmail.8; 是 &os; 中的默认邮件传输代理 (MTA)。 sendmail 的任务是从邮件用户代理 (MUA) 接收邮件然后根据配置文件的定义把它们送给配置好的的寄送程序。 sendmail 也能接受网络连接, 并且发送邮件到本地邮箱或者发送它到其它程序。 sendmail 使用下列配置文件: /etc/mail/access /etc/mail/aliases /etc/mail/local-host-names /etc/mail/mailer.conf /etc/mail/mailertable /etc/mail/sendmail.cf /etc/mail/virtusertable 文件名 功能 /etc/mail/access sendmail 访问数据库文件 /etc/mail/aliases 邮箱别名 /etc/mail/local-host-names sendmail 接收邮件主机列表 /etc/mail/mailer.conf 邮寄配置程序 /etc/mail/mailertable 邮件分发列表 /etc/mail/sendmail.cf sendmail的主配置文件 /etc/mail/virtusertable 虚拟用户和域列表 <filename>/etc/mail/access</filename> 访问数据库定义了什么主机或者 IP 地址可以访问本地邮件服务器和它们是哪种类型的访问。 主机可能会列出 或者简单的通过 sendmail 的出错处理程序检测一个给定的邮件错误。 主机默认列出 ,允许传送邮件到主机, 只要邮件的最后目的地是本地主机。列出 将拒绝所有的邮件连接。如果带有 选项的主机将被允许通过这个邮件服务器发送邮件到任何地方。 配置<application>sendmail</application> 访问数据库 cyberspammer.com 550 We don't accept mail from spammers FREE.STEALTH.MAILER@ 550 We don't accept mail from spammers another.source.of.spam REJECT okay.cyberspammer.com OK 128.32 RELAY 在上面的例子中我们有 5 条记录。 与左边列表匹配的发件人受到右边列表动作的影响。 前边的两个例子给出了 sendmail 的出错处理程序检测到的错误代码。 当一个邮件与左边列表相匹配时,这个信息会被打印到远程主机上。 下一条记录拒绝来自 Internet 上的一个特别主机的邮件 another.source.of.spam。接下来的记录允许来自 okay.cyberspammer.com 的邮件连接, 这条记录比上面那行 cyberspammer.com 更准确。更多的准确匹配使不准确的匹配无效。最后一行允许电子邮件从主机和 128.32 开头的 IP 地址转发。 这些主机将被允许通过这台邮件服务器前往其它邮件服务器发送邮件。 当这个文件被升级的时候,您必须在 /etc/mail/ 运行 make 升级数据库。 <filename>/etc/mail/aliases</filename> 别名数据库包含一个扩展到用户,程序或者其它别名的虚拟邮箱列表。 下面是一些在 /etc/mail/aliases 中使用的例子: 邮件别名 root: localuser ftp-bugs: joe,eric,paul bit.bucket: /dev/null procmail: "|/usr/local/bin/procmail" 文件格式比较简单:邮箱名在冒号左边,右边是扩展的目标。 第一个例子简单的扩展邮箱 root 到邮箱 localuser,它可以在别名数据库中被找到。 如果没有找到匹配的,那么这个信息会被发送给本地用户 localuser。接下来的例子显示了一个邮件列表。 发送到 ftp-bugs 邮箱的邮件会被扩展为三个本地邮箱 joeericpaul。注意 一个远程邮箱可以用 user@example.com 的形式指定。 下个例子显示将邮件写到 /dev/null 文件。 最后一个例子向您展示了传送邮件到一个程序,在这个例子里邮件通过 &unix; 管道被写到 /usr/local/bin/procmail 标准输入里。 当这个文件被升级时, 您必须在/etc/mail/运行 make来升级数据库. <filename>/etc/mail/local-host-names</filename> 这是一个 &man.sendmail.8; 被接受为一个本地主机名的主机名列表。 可以放入任何 sendmail 将从那里收发邮件的域名或主机。例如,如果这个邮件服务器从域 example.com 和主机 mail.example.com 接收邮件,它的 local-host-names 文件,可以看起来象如下这样: example.com mail.example.com 当这个文件被升级,&man.sendmail.8; 必须重新启动,以便更新设置。 <filename>/etc/mail/sendmail.cf</filename> sendmail的主配置文件 sendmail.cf 控制着 sendmail 的所有行为, 包括从重写邮件地址到打印拒绝远程邮件服务器信息等所有事。 当然,作为一个不同的角色,这个配置文件是相当复杂的, 它的细节部分已经超出了本节的范围。幸运的是, 这个文件对于标准的邮件服务器来说很少需要被改动。 sendmail 主配置文件可以用 &man.m4.1; 宏定义 sendmail 的特性和行为。它的细节请看 /usr/src/contrib/sendmail/cf/README 当这个文件被修改时, sendmail 必须重新启动以便对新修改生效。 <filename>/etc/mail/virtusertable</filename> virtusertable 映射虚拟域名和邮箱到真实的邮箱。 这些邮箱可以是本地的、远程的、/etc/mail/aliases 中定义的别名或一个文件。 虚拟域邮件映射的例子 root@example.com root postmaster@example.com postmaster@noc.example.net @example.com joe 在上面这个例子里,我们映射了一个域 example.com。 这个文件用一个最初匹配的文件处理。第一项映射 root@example.com 到本地邮箱 root。下一项映射 postmaster@example.comnoc.example.net 主机的 postmaster 邮箱。最后,如果域 example.com 没有被什么匹配,它将与最后一个映射匹配,在 example.com 域,每个其它邮件信息地址到某一个主机被匹配。 在这里被映射到本地邮箱 joe Andrew Boothman Written by Gregory Neil Shapiro Information taken from e-mails written by 改变您的邮件传输代理程序 邮件 改变mta 先前已经提到,FreeBSD 中的 sendmail 已经安装了您的 MTA (邮件传输代理程序)。因此它它负责着您的收发邮件的工作。 然而,基于不同的理由,一些系统管理员想要改变他们系统的 MTA。这些理由从简单的想要尝试另一个 MTA,到需要一个特殊的特性或者 package 依赖某个邮寄程序等等。幸运的是,不管是什么理由,FreeBSD 都能容易的改变它。 安装一个新的 MTA 对于可用的 MTA 您有很多的选择。一个好的出发点是 FreeBSD Ports Collection,在那里您能找到很多。 当然您可以从任何位置不受任何限制的使用 MTA,只要您能让它运行在 FreeBSD 下。 开始安装您的新 MTA。一旦它被安装, 它可以让您有机会决定它是否能满足您的需要和在接管 sendmail 之前让您有机会配置您的新软件。 当完成这些之后,您应该确信安装的新软件不会尝试更改系统的二进制文件例如象 /usr/bin/sendmail。除此以外, 您的新邮件软件启用之前要已经配置好它。 具体配置请参考您所选择的 MTA 软件的配置文档或其它相关资料。 停用 <application>sendmail</application> 值得注意的是启动 sendmail 在 4.5-RELEASE 版本和 4.6-RELEASE 版本之间有些不同。因此,停用它的过程也稍有不同。 FreeBSD 4.5-STABLE 版本 2002/4/4 之前和更早前版本 (包括 4.5-RELEASE 及更早版本) 输入: sendmail_enable="NO" /etc/rc.conf 文件。它将停用 sendmail 接收邮件服务, 但是如果 /etc/mail/mailer.conf 文件(见下文) 没有被改变,sendmail 将仍然可以发送邮件。 FreeBSD 4.5-STABLE 版本 2002/4/4 之后和以后的版本 (包括 4.6-RELEASE 及后续版本) 为了完全的停用 sendmail,您必须在 /etc/rc.conf 文件里使用 sendmail_enable="NONE" 如果用这个方法停止 sendmail 的发送邮件服务,那么就必须有一个能够完全正常地工作的邮件发送系统。 如果不这样做的话,类似 &man.periodic.8; 这样的系统功能将无法正确地通过电子邮件将它们的执行结果送到通常希望的地方去。 系统中的很多部分都要求有和 sendmail 在功能上兼容的系统。 如果应用程序在您禁用之后仍然继续使用 sendmail 的执行文件来发送文件, 则这些邮件可能会进入睡眠的 sendmail 队列,并永远无法到达目的地。 如果只是想要停止 sendmail 的接收邮件服务, 您应该在 /etc/rc.conf 文件中设置 sendmail_enable="NO" 更多的有关 sendmail 可用的启动选项,参看 &man.rc.sendmail.8; 联机手册. 机器引导时运行您的新 MTA 您也许有两种方法在机器引导时运行您的新 MTA,这个也倚赖您所运行的 FreeBSD 版本。 FreeBSD 4.5-STABLE 版本 2002/4/11 以前 (包括 4.5-RELEASE 及更早版本) /usr/local/etc/rc.d/ 中添加一个以 .sh 为后缀的脚本文件, 并可以用 root 身份运行。这个脚本应该接受 startstop 参数。用如下命令启动这个脚本 /usr/local/etc/rc.d/supermailer.sh start 您也可以手工启动这个服务。如果想要停止它, 系统脚本将使用 stop 选项,运行如下命令 /usr/local/etc/rc.d/supermailer.sh stop 您也可以手工停止正在系统运行的服务。 FreeBSD 4.5-STABLE 版本 2002/4/11 以后 (包括 4.6-RELEASE 及后续版本) 在 FreeBSD 较后来的版本, 您可以使用上面的方法或者在 /etc/rc.conf 文件做如下设置 mta_start_script="filename" filename 是您想要在引导时执行的 MTA 脚本文件的名字。 替换系统默认的邮寄程序 <application>sendmail</application> 因为 sendmail 程序是一个在 &unix; 系统下普遍存在的一个标准的软件,一些软件就假定它已经被安装并且配置好。 基于这个原因,许多其它的 MTA 提供者都提供了兼容 sendmail 的命令行界面来执行。 这使它们象混入sendmail 一样变的很容易掌握。 因此,如果您使用其它的邮寄程序, 您必须确定这个软件是去尝试运行标准的 sendmail 二进制,就象 /usr/bin/sendmail,还是运行您自己选择的替换邮寄程序。 幸运的是,FreeBSD 提供了一个系统调用 &man.mailwrapper.8;,它能为您做这件工作。 sendmail 安装后被运行,您可以在 /etc/mail/mailer.conf 中找到如下行: sendmail /usr/libexec/sendmail/sendmail send-mail /usr/libexec/sendmail/sendmail mailq /usr/libexec/sendmail/sendmail newaliases /usr/libexec/sendmail/sendmail hoststat /usr/libexec/sendmail/sendmail purgestat /usr/libexec/sendmail/sendmail 这个的意思就是当这些公共命令 (例如 sendmail 它本身) 运行时, 系统实际上调用了一个 sendmail 指定的 mailwrapper 的副本,它检查 mailer.conf 并且运行 /usr/libexec/sendmail/sendmail 做为替代。当默认的 sendmail 功能被调用, 系统将很容易的改变实际上运行的二进制文件。 因此如果您想要 /usr/local/supermailer/bin/sendmail-compat 替换 sendmail 被运行,您应该改变 /etc/mail/mailer.conf 文件为: sendmail /usr/local/supermailer/bin/sendmail-compat send-mail /usr/local/supermailer/bin/sendmail-compat mailq /usr/local/supermailer/bin/mailq-compat newaliases /usr/local/supermailer/bin/newaliases-compat hoststat /usr/local/supermailer/bin/hoststat-compat purgestat /usr/local/supermailer/bin/purgestat-compat 最后 一旦做完您想要配置的每件事,您应该杀掉 sendmail 进程并且启动属于您的新软件的进程, 或者简单的重启。重启也将给您机会保证您正确的配置您的系统, 在引导的时候自动的运行您新的 MTA。 疑难解答 邮件 疑难解答 为什么必须在我的站点的主机上使用 FQDN? 您可能会发现主机实际上是在另外一个域里面, 例如,如果您是在 foo.bar.edu 里,而您要找一台叫 mumble 的主机,它在 bar.edu 域里,您就必须用完整的域名 mumble.bar.edu,而不是用 mumble BIND 传统上,这在 BSD BIND resolvers 中是可行的。 然而目前随 FreeBSD 附带的 BIND 已不为同一域外提供缩写服务。所以,这个不完整的主机名 mumble 必须以 mumble.foo.bar.edu 这种形式才能被找到, 或者将在根域中搜索它。 这跟以前的处理是不同的,以前版本将会继续寻找 mumble.bar.edumumble.edu。 如果您想要了解这种方式是否是好,或者它有什么安全方面的漏洞, 请参阅 RFC 1535 文档。 如果您想要一个好的工作环境,您可以使用如下行: search foo.bar.edu bar.edu 替换先前旧的版本: domain foo.bar.edu 把这行放在您的 /etc/resolv.conf 文件中。然而,请一定要确定这样的搜寻顺序不会造成 RFC 1535 里提到的boundary between local and public administration 问题。 MX record sendmail 提示信息 mail loops back to myself 下面是 sendmail FAQ 中的回答: 我得到了如下的信息: 553 MX list for domain.net points back to relay.domain.net 554 <user@domain.net>... Local configuration error 我如何解决这个问题? 您已经通过 MX 记录指定把发送给特定的域 (例如,domain.net) 的邮件被转寄到指定的主机 (在这个例子中,relay.domain.net), 而这台机器并不认为它自己是 domain.net。请把 domain.net 添加到 /etc/mail/local-host-names 文件中 [在 8.10 版之前是 /etc/sendmail.cw] (如果您使用 FEATURE(use_cw_file) 的话) 或者在 /etc/mail/sendmail.cf 中添加Cw domain.net sendmail 的 FAQ 可以在 找到, 如果您想要对您的邮件做任何的调整, 则推荐首先看一看它。 PPP 我如何在一个拨号主机上运行一个邮件服务? 您想要把局域网上的 FreeBSD 主机连接到互连网上,而这台 FreeBSD 主机将会成为这个局域网的邮件网关, 这个拨号连接不必一直保持在连接状态。 UUCP MX record 最少有两种方法可以满足您的要求。一种方法就是使用 UUCP。 另一种方法是找到一个专职的服务器来为您的域提供副 MX 主机服务。 例如,如果您公司的域名是 example.com,您的互连网服务提供者把 example.net 作为您域的副 MX 服务: example.com. MX 10 example.com. MX 20 example.net. 只有一台主机被指定当做您的最终收信主机 (在 example.com 主机的 /etc/mail/sendmail.cf 文件中添加 Cw example.com)。 sendmail 试图分发邮件的时候, 它会尝试通过 modem 连接到您 (example.com)。 因为您并不在线,所以总是会得到一个超时的错误。 sendmail 将会把邮件发送到副 MX 主机,也就是说,您的互连网服务提供者 (example.net)。副 MX 主机将周期性的尝试连接并发送邮件到您的主机 (example.com)。 您也许想要使用下面的这个登录脚本: #!/bin/sh # Put me in /usr/local/bin/pppmyisp ( sleep 60 ; /usr/sbin/sendmail -q ) & /usr/sbin/ppp -direct pppmyisp 如果您想要为一个用户建立一个分开登录的脚本, 您可以使用 sendmail -qRexample.com 替换上面的脚本。这样将使所有的邮件按照您的 example.com 队列立即被处理。 更深入的方法可以参考下面这段: 这段信息是从 &a.isp; 拿来的。 > 我们为用户提供副 MX 主机服务。用户每天都会上线好几次 > 并且自动把信件取回主 MX 主机 > (当有他们的邮件时我们并没有通知他们)。 > 我们的 mailqueue 程序每 30 分钟清一次邮件队列。那段时间他们 > 就必须上线 30 分钟以确保他们的信件送达他们的主 MX 主机。 > > 有任何指令可以用 sendmail 寄出所有邮件么? > 普通用户在我们的机器上当然没有 root 权限。 在 sendmail.cf 的privacy flags部分,有这样的设定 Opgoaway,restrictqrun 移除 restrictqrun 可以让非 root 用户启动队列处理的程序。 您可能也要重新安排您的 MX 设定。我们是用户的 MX 主机, 而且我们还设定了这个: # If we are the best MX for a host, try directly instead of generating # local config error. OwTrue 这样的话远程机器会直接把信送给您,而不会尝试连接您的用户的机器。 然后您就可以把邮件发送到您的用户。这个设定只对 主机有效,所以您必须要让您的用户在 DNS 中把他们的邮件主机设置为 customer.com或者 hostname.customer.com。只要为customer.com在 DNS 里添加一个 A 记录就可以了。 为什么当我发送邮件到其它主机总是有 Relaying Denied 出错信息? 默认的 FreeBSD 安装中, sendmail 会配置为只发送来自它所在主机上的邮件。 例如,如果有可用的 POP 服务器,则用户将可以从学校、 公司或其他什么别的地方检查邮件,但他们仍然无法从远程直接发送邮件。 通常,在几次尝试之后, MAILER-DAEMON 将发出一封包含 5.7 Relaying Denied 错误信息的邮件。 有很多方法可以避免这种现象。 最直截了当的方法是把您的 ISP 的地址放到 /etc/mail/relay-domains 文件中。 完成这项工作的简单的方法是: &prompt.root; echo "your.isp.example.com" > /etc/mail/relay-domains 建立或编辑这个文件以后您必须重新启动 sendmail。 如果您是一个管理员并且不希望在本地发送邮件, 或者想要在其它的机器甚至其它的 ISP 上使用一个客户端系统, 这个方法是很方便的。如果您仅有一到两个邮件帐户它也非常的有用。 如果有大量的地址需要添加, 您可以很简单的使用您喜欢的文本编辑器打开这个文件添加域名, 每行一个: your.isp.example.com other.isp.example.net users-isp.example.org www.example.org 现在邮件可以通过您的系统传送, 这个列表中存在的主机 (前提是用户在您的系统上已经有一个帐户) 将可以成功的发送。这是一个允许正常的远程用户从您的系统发送邮件, 并且阻止其它非法用户通过您系统发送垃圾邮件的好方法。 高级主题 下面这节将介绍邮件配置和为整个域安装邮件。 基本配置 邮件 配置 在邮箱外,只要您设置 /etc/resolv.conf 或者运行您自己的名字服务器,您就可以发送邮件到外部的主机。 如果您想要您的邮件发送给某个特定的 MTA(例如, sendmail) 在您的 FreeBSD 主机上,有两个方法: 运行您自己的域名服务器和您自己的域。例如, FreeBSD.org 获得直接分发给您主机的邮件。您可以直接使用您当前的 DNS 名称。例如,example.FreeBSD.org SMTP 不管您选择上面那种方法,为了直接在您的主机上发送邮件, 必须有一个静态的 IP 地址(不是象 PPP 拨号一样的动态地址)。 如果您在防火墙后面,它必须让 SMTP 协议通过。 如果您想要在您的主机上直接的收取邮件, 您必须确定两件事: MX 记录 确定在您 DNS 中的 MX 记录(最小编号的)指向您的 IP 地址。 确定在您 DNS 中的 MX 记录没有禁止您的主机。 上面的每条记录都允许您在您的主机直接接收邮件。 试试这个: &prompt.root; hostname example.FreeBSD.org &prompt.root; host example.FreeBSD.org example.FreeBSD.org has address 204.216.27.XX 如果您看到这些,直接使用 yourlogin@example.FreeBSD.org 应该没有问题 (假定 sendmail 已经 正确的运行在 example.FreeBSD.org)。 如果您看到这些: &prompt.root; host example.FreeBSD.org example.FreeBSD.org has address 204.216.27.XX example.FreeBSD.org mail is handled (pri=10) by hub.FreeBSD.org 所有发送到主机 (example.FreeBSD.org) 的邮件在相同的用户名下将会被 hub 终止的收集,而不是直接发送到您的主机。 上面的信息是通过您的 DNS 服务器来处理的。支持邮件路由信息的 DNS 记录是 邮件 交换 记录。如果 MX 记录不存在,邮件将通过它自己的 IP 地址被直接的发送到主机。 freefall.FreeBSD.org的MX记录如下所示: freefall MX 30 mail.crl.net freefall MX 40 agora.rdrop.com freefall MX 10 freefall.FreeBSD.org freefall MX 20 who.cdrom.com 正如您说看到的,freefall 有很多 MX 记录。 最小编号的 MX 记录是直接接收邮件的主机。如果因为一些原因它不可用,其它 (有时会访问backup MXes)接收信息将会暂时接替并做临时的排列。 为了有效的使用交换式 MX 站点,应当从您的机器上分离一些 Internet 连接。您的 ISP 或者其它友好的站点可以没有任何问题的为您提供这个服务。 Mail for Your Domain 为了设置一个邮件主机(又称邮件服务器) 您必须要把许多邮件发送到与它相连的几个工作站中。 基本上,您想要要求在您域的每个主机的所有邮件 (在这个例子里是 *.FreeBSD.org) 转向到您的邮件服务器,从而使您的用户可以在主邮件服务器里接收他们的邮件。 DNS 要使工作最简单,带有同样 用户名 的帐户应该同时存在于两台机器上。使用 &man.adduser.8; 来这样做。 您将使用的邮件主机必须为每个工作站指定一个邮件交换。您可以在 DNS 中这样配置: example.FreeBSD.org A 204.216.27.XX ; Workstation MX 10 hub.FreeBSD.org ; Mailhost 无论 A 记录指向哪,这将为工作站重新定位到邮件主机。邮件将被发送到 MX 主机。 您不能自己这样做除非您运行着一个 DNS 服务器。 如果不是这样,或者不能运行您自己的 DNS 服务器,告诉您的 ISP 或者给您提供 DNS 服务的人。 如果您正在使用虚拟邮件主机,下面的信息将会对您有用。 在这个例子里,我们假定您有一个客户并且他有自己的域, 这个例子中是 customer1.org,您要把 customer1.org 所有的邮件发送到您的邮件主机 mail.myhost.com。 您的 DNS 记录应该是这样: customer1.org MX 10 mail.myhost.com 需要有个 A 记录, 如果您只为域 customer1.org 处理邮件。 必须清楚 customer1.org 将不能工作,除非存在一个 A 记录。 最后一件您必须要做的事是告诉 sendmail 接受邮件的是什么域和(或)主机名。 这里有好几种方法。下面方法可以任选一种: 添加您的主机到 /etc/mail/local-host-names 文件中,如果您使用的是 FEATURE(use_cw_file)。如果您使用 sendmail 8.10 或者更高版本,文件是 /etc/sendmail.cw 添加一行 Cwyour.host.com 到您的 /etc/sendmail.cf/etc/mail/sendmail.cf 文件,如果您使用 sendmail 8.10 或者更高版本。 SMTP 与 UUCP sendmail 的配置,在 FreeBSD 中已经配置好为您的站点直接的连接 Internet。 如果站点希望他们的邮件通过 UUCP 交换,则必须安装其它的 sendmail 配置文件。 手工的配置 /etc/mail/sendmail.cf 是一个高级主题。sendmail 8 版本通过 &man.m4.1; 预处理生成一个配置文件,实际上这个配置发生在一个比较高的抽象层。 &man.m4.1; 配置文件可以在 /usr/src/usr.sbin/sendmail/cf 下找到。 如果您没有在系统上安装全部源码,则可以从单独的压缩文件中提取 sendmail 配置文件。假定您的 FreeBSD 源码 CDROM 已经被 mount: &prompt.root; cd /cdrom/src &prompt.root; cat scontrib.?? | tar xzf - -C /usr/src/contrib/sendmail 这个提取只有几百 K 字节。cf 目录中的 README 文件能够为您提供一个到 &man.m4.1; 配置的基本的介绍。 最好的支持 UUCP 传送的方法是使用 mailertable 的特点。建立一个资料库让 sendmail 可以使用它自己的路由决策。 首先,您必须建立您自己的 .mc 文件。 /usr/src/usr.sbin/sendmail/cf/cf 目录包含一些例子。 假定您已经命名自己的文件叫做 foo.mc, 您要做的只是把它转换成一个有效的 sendmail.cf &prompt.root; cd /usr/src/usr.sbin/sendmail/cf/cf &prompt.root; make foo.cf &prompt.root; cp foo.cf /etc/mail/sendmail.cf 一个典型的 .mc 文件看起来可能象这样: VERSIONID(`Your version number') OSTYPE(bsd4.4) FEATURE(accept_unresolvable_domains) FEATURE(nocanonify) FEATURE(mailertable, `hash -o /etc/mail/mailertable') define(`UUCP_RELAY', your.uucp.relay) define(`UUCP_MAX_SIZE', 200000) define(`confDONT_PROBE_INTERFACES') MAILER(local) MAILER(smtp) MAILER(uucp) Cw your.alias.host.name Cw youruucpnodename.UUCP accept_unresolvable_domainsnocanonifyconfDONT_PROBE_INTERFACES 特性将避免在传送邮件时使用DNS的机会。UUCP_RELAY 项是支持 UUCP 传送所必须的。简单的放入一个 Internet 上可以处理 UUCP 虚拟域地址的主机名。通常,您在这里填入您 ISP 邮件的回复处。 一旦您做完这些,您还需要这个 /etc/mail/mailertable 文件。 如果您只有一个用来传递所有邮件的对外通道的话, 以下的文件就足够了: # # makemap hash /etc/mail/mailertable.db < /etc/mail/mailertable . uucp-dom:your.uucp.relay 一个更复杂点的例子象这样: # # makemap hash /etc/mail/mailertable.db < /etc/mail/mailertable # horus.interface-business.de uucp-dom:horus .interface-business.de uucp-dom:if-bus interface-business.de uucp-dom:if-bus .heep.sax.de smtp8:%1 horus.UUCP uucp-dom:horus if-bus.UUCP uucp-dom:if-bus . uucp-dom: 头三行处理域地址邮件,不应该被传送出默认的路由, 而由某些 UUCP 邻居取代的特殊情况,这是为了走捷径。 下一行处理本地网的邮件让它可以使用 SMTP 来传送。 最后,UUCP 邻居提起。UUCP 虚拟域的记载, 允许一个 uucp-neighbor !recipient 推翻默认规则。最后一行则以一个单独的句点最为结束, 以 UUCP 传送到提供您所有的邮件网关的 UUCP 邻居。 所有在 uucp-dom: 关键字里的节点名称必须是有效的 UUCP 邻居,您可以用 uuname 去确认。 提醒您这个文件在使用前必须被转换成 DBM 数据库文件。最好在 mailertable 最上面用注解写出命令行来完成这个工作。 当您每次更换您的 mailertable 后您总是需要执行这个命令。 最后提示:如果您不确定某个特定的路径可用, 记得把 选项加到 sendmail。这会将 sendmail 启动在 地址检测模式。只要按下 3,0,接着输入您希望测试的邮件路径位置。 最后一行告诉您使用邮件代理程序, 代理程序会通知目的主机以及 (可能转换) 地址。 要离开此模式请按 CtrlD &prompt.user; sendmail -bt ADDRESS TEST MODE (ruleset 3 NOT automatically invoked) Enter <ruleset> <address> > 3,0 foo@example.com canonify input: foo @ example . com ... parse returns: $# uucp-dom $@ your.uucp.relay $: foo < @ example . com . > > ^D Bill Moran Contributed by Setting Up to Send Only ** 翻译进行中 ** 拨号连接时使用邮件传送 如果您有静态的 IP 地址, 就应该不用修改任何默认的配置。 将主机名设置为分配给您的 Internet 名称,其他的事情 sendmail 都会替您做好。 如果您的 IP 地址是动态分配的, 并使用 PPP 连接拨入 Internet, 则您可能会从 ISP 的邮件服务器上得到一个信箱。 这里我们假设您的 ISP 的域名是 example.net, 您的用户名是 user, 您把自己的机器称作 bsd.home, 而您的 ISP 告诉您可以使用 relay.example.net 来转发邮件。 为了从邮箱收取邮件, 需要安装一个收信代理。 fetchmail 是一个能够支持许多种不同协议的不错的选择。 这个程序可以通过 package 或 ports collection (mail/fetchmail) 来安装。 通常, 您的 ISP 会提供 POP。 如果您使用用户 PPP,您还可以在 Internet 连接建立时自动地抓取邮件, 这可以通过在 /etc/ppp/ppp.linkup 中增加如下的项来实现: MYADDR: !bg su user -c fetchmail 如果您正使用sendmail (如下所示) 传送邮件到非本地帐户,这会强迫 sendmail 在连接网络后马上处理邮件进程队列,它在 /etc/ppp/ppp.linkup 文件执行 fetchmail 命令。 !bg su user -c "sendmail -q" 假设您有一个 user 帐户,在 bsd.home机器上。在 bsd.home 机器上的 user 目录里建立一个 .fetchmailrc文件: poll example.net protocol pop3 fetchall pass MySecret 这个文件除了 user 外不应该被任何人读取, 因为它包含了 MySecret 这个密码。 为了在发信时有正确的抬头 from:,您必须告诉 sendmail 使用 user@example.net 而非 user@bsd.home。您可能会希望告诉 sendmailrelay.example.net 发送所有邮件,加快邮件的传送。 以下的 .mc 文件应该可以满足您的需求: VERSIONID(`bsd.home.mc version 1.0') OSTYPE(bsd4.4)dnl FEATURE(nouucp)dnl MAILER(local)dnl MAILER(smtp)dnl Cwlocalhost Cwbsd.home MASQUERADE_AS(`example.net')dnl FEATURE(allmasquerade)dnl FEATURE(masquerade_envelope)dnl FEATURE(nocanonify)dnl FEATURE(nodns)dnl define(`SMART_HOST', `relay.example.net') Dmbsd.home define(`confDOMAIN_NAME',`bsd.home')dnl define(`confDELIVERY_MODE',`deferred')dnl 如何转换这个 .mc 文件到 sendmail.cf 文件的细节,请参考前面的章节。 另外,在更新 sendmail.cf 文件后, 不要忘记重启 sendmail James Gorham 作者: SMTP 验证 在您的邮件服务器上启用 SMTP 验证有很多好处。 SMTP 验证可以让 sendmail 多一重安全保障, 而且也使得使用不同机器的漫游用户能够使用同一个邮件服务器, 而不需要每次都修改它们的邮件客户端配置。 从 ports 中安装 security/cyrus-sasl。 您可以从 security/cyrus-sasl 找到它。 security/cyrus-sasl 有一系列编译时可选的选项, 包括我们将要使用的验证方式等等。请务必选择 安装完 security/cyrus-sasl 之后, 编辑 /usr/local/lib/sasl/Sendmail.conf (如果不存在则建立) 并在其中增加: pwcheck_method: passwd 这个方法将允许sendmail 依照您的 FreeBSD passwd 数据库进行验证。 这将为每个用户建立一个新用户名设置和口令使用 SMTP 验证减少麻烦,并且保证登录和邮件口令是相同的。 现在编辑 /etc/make.conf 文件,添加如下行: SENDMAIL_CFLAGS=-I/usr/local/include/sasl1 -DSASL SENDMAIL_LDFLAGS=-L/usr/local/lib SENDMAIL_LDADD=-lsasl 这些行将给 sendmail 合适的配置选项, 为在编译时间链接到 cyrus-sasl。 确定 cyrus-sasl 被安装之前重新编译 sendmail 重新编译 sendmail 运行如下命令: &prompt.root; cd /usr/src/usr.sbin/sendmail &prompt.root; make cleandir &prompt.root; make obj &prompt.root; make &prompt.root; make install 如果 /usr/src 和共享库没有大的变化并且它们都必须可用,sendmail 编译应该没有任何问题。 sendmail 被重新编译和安装后, 编辑您的 /etc/mail/freebsd.mc 文件 (或者无论您选择使用的您的哪个 .mc 文件。许多管理员选择使用跟 &man.hostname.1; 一样的唯一的 .mc 文件输出)。添加这些行在这个文件: dnl set SASL options TRUST_AUTH_MECH(`GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN')dnl define(`confAUTH_MECHANISMS', `GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN')dnl define(`confDEF_AUTH_INFO', `/etc/mail/auth-info')dnl 这些选项配置有不同的方法,对于 sendmail 验证用户。 如果您想要使用除 pwcheck 之外的方法,请参考相关文档。 最后,在 /etc/mail 运行 &man.make.1;。 它将建立您的新 .mc 文件并建立一个 .cf 文件命名为 freebsd.cf (或者您想使用您的其它名字的 .mc文件)。接着使用命令 make install restart,这将复制文件到 sendmail.cf,并且正确的重新启动 sendmail。 更多有关这个过程的信息,您可以参考 /etc/mail/Makefile 文件。 如果所每个步骤都做对了, 您应该可以通过您的邮件客户端进入您的登录信息并且传送一个测试信息。 更多的分析,设置 sendmail 到 13 并且查看 /var/log/maillog 中的信息。 您也许希望添加如下行到 /etc/rc.conf 文件, 这将允许服务在重起之后自动运行: sasl_pwcheck_enable="YES" sasl_pwcheck_program="/usr/local/sbin/pwcheck" 这将保证 SMTP_AUTH 初始化在系统启动时自动运行。 更多的信息,请参看 sendmail 相关页 SMTP 验证 Marc Silver Contributed by Mail User Agents ** 翻译进行中 ** Mail User Agents ** 翻译进行中 ** mail ** 翻译进行中 ** mutt ** 翻译进行中 ** pine ** 翻译进行中 ** Marc Silver Contributed by Using fetchmail ** 翻译进行中 ** Using fetchmail Marc Silver Contributed by Using procmail ** 翻译进行中 ** Using procmail