|
作者:Eric Rinker
出自:sun ecommunity
这篇文章的目的是使读者对如何在运行Solaris 9操作系统的机器上改变Sendmail的配置有一个基本的了解,适用于对UNIX操作系统的标准原理有一定工作经验的工程师们。为了使用和实践本文的内容,需要知道如何编辑文件和运行程序,并且还需要拥有root权限。
Email如何工作(邮件传输代理)
有两种处理邮件的应用程序:邮件用户代理(Mail User Agents,MUA)和邮件传输代理(Mail Transfer Agents,MTA)。
邮件用户代理是帮助用户创建、查看和处理邮件信息的一组应用程序,举例来说,UNIX系统中的mail和elm,以及Windows系统中的Eudora和Outlook就是这样的应用程序。Netscape和Explorer是具有MUA功能的Internet浏览器。
邮件传输代理负责从一台机器传输邮件,通常情况下,每台机器只使用一个MTA。Sendmail就是这样一个MTA,而其他的MTA,包括Exim、Postfix和Qmail都已被淘汰。
Sendmail的发展
Sendmail是世界上使用时间最长和应用范围最广的MTA之一。它是包括HP公司的HP-UX、IBM公司的AIX和Sun Microsystems的Solaris OS在内的绝大多数UNIX发行版本的默认MTA。由于Sendmail已经问世很长时间了,所以它的配置和维护十分复杂,但是它强大的功能弥补了这一不足。
从30多年前诞生以来,Sendmail已经逐渐发展成为一种用于从一个位置向另一位置传送电子邮件的强壮的、具有丰富特性的方法。由于在设计Sendmail时正值硬件驱动时代,当时系统仅仅提供64KB的可用空间,因而在Sendmail中使用了很多技巧来节省空间。为了使每样东西都短小而中用,Sendmail的配置文件使用了许多隐晦的参数,例如用"Fw"参数表示"Domains we receive mail for",用"DH"参数表示"Who gets all local email"。尽管有一种方法来对付这种令人发疯的情况,但是对于初学者仍然不是立刻就能明白的。为了保证向后兼容性,这些隐晦的参数在目前Sendmail版本的配置文件中仍然存在。
在过去的这些年中,Sendmail不断地增加新的特性,这使得配置过程变得越来越复杂。为了使这个过程更加友好易用,Sendmail使用了一种基于m4的编辑和配置模型。位于管理员和创建配置过程之间的这一层,使得Sendmail更加容易创建和维护,而不需要升级原有程序来处理新的交互方法。
配置
这个文档不可能覆盖Sendmail中的所有细节,如果那样的话可能需要数百页的篇幅。相反,我们将注意力集中在三个常见的配置上:邮件服务器(Mail Server)、邮件中继(Incoming Relay)以及只用于发送(Outgoing Only)。
在修改Sendmail的行为时,/etc/mail/sendmail.cf文件并不被直接修改。相反,一个.mc文件被修改并在m4宏处理器中运行。一些示例.mc文件在/usr/lib/mail/cf中给出:
main.mc是默认的安装系统。
submit.mc用于将Sendmail配置成初始的邮件提交程序。
subsidiary.mc 负责将本系统中的所有邮件在发送到目的之前先通过另一机器。
在我们的例子中,我们拷贝main.mc文件到new.mc,并且作出如下修改:
cd /usr/lib/mail/cf
vi new.mc
make new.cf
cp new.cf /etc/mail/sendmail.cf
/etc/init.d/sendmail restart
在开始之前,公共元素在所有的三个配置中完全共享。一个最小的文件包括如下内容:
OSTYPE('solaris8')dnl
MAILER('local')dnl
MAILER('smtp')dnl
OSTYPE宏定义了这个文件所处的系统,MAILER宏定义了本配置文件将使用许多不同的传递方法中的哪一种。在这个例子中,我们运行在Solaris 8或更高版本的系统中,而且我们想要同时使用本地传递系统(local delivery system)和SMTP系统。
邮件服务器
邮件服务器是专用来处理进入邮件的服务器。它接收发往user@domain 的邮件,把该邮件传递到相应用户的本地邮箱,并且在邮件队列中处理邮件以发送到外部去。
下面是Sendmail的默认设置,你只需要做一个修改:在/etc/mail/local-host-names 中为每个域增加一个本地帐户。
最终结果为:
OSTYPE('solaris8')dnl
MAILER('local')dnl
MAILER('smtp')dnl
邮件中继
邮件中继是公司邮件服务器的一种常用配置,这种邮件服务器通常在公司防火墙的外部。这些中继不存储邮件,而是将这些邮件发送到位于防火墙内部的预先定义好的公司邮件服务器。由于这台机器不实现特定邮件服务器的任何其他功能,因而这种设置能够很好地实现过滤功能。
要配置邮件中继,我们首先需要增加中继服务器信息。在下面的例子中,我们将把任何邮件都中继到relay.mydomain.com。
define('SMART_HOST', 'relay.mydomain.com')dnl
接下来,我们需要允许邮件在这台机器中被转发。我们只想要转发那些邮件服务器域内的邮件,所以我们使用如下的特性描述:
FEATURE('relay_based_on_MX')dnl
到这里就完成了。,这台服务器现在将会转发所有在本机上除了有本地帐户以外还有MX记录的邮件到:relay.mydomain.com.
最终结果为:
OSTYPE('solaris8')dnl
DOMAIN('solaris-antispam')dnl
define('SMART_HOST', 'shadowdepot.farscape.maliki.net')dnl
FEATURE('relay_based_on_MX')dnl
MAILER('local')dnl
MAILER('smtp')dnl
只用于发送
基于安全的考虑,最好不要创建任意的邮件中继。每台机器都需要有一个MTA来发送电子邮件,而且有些程序还要求具有通过SMTP服务器转发邮件的能力。根据这些需求,通过配置Sendmail只连接回环地址,可以为本地服务转发邮件,同时确保你的系统不会变成一个开放的中继。
要使Sendmail只用来发送,而不需要从任何远程主机接受邮件,我们设置只使用本地回环地址。
DAEMON_OPTIONS('Port=smtp,Addr=127.0.0.1, Name=MTA')
不再需要其他选项了;Sendmail在默认情况下将从本地机器向外界传输邮件。
最终结果为:
OSTYPE('solaris8')dnl
DOMAIN('solaris-generic')dnl
DAEMON_OPTIONS('Port=smtp,Addr=127.0.0.1, Name=MTA')
MAILER('local')dnl
MAILER('smtp')dnl
如何获取更多知识
既然你知道如何修改,你就可以决定作出何种修改。你碰到的第一个难题应该是/usr/lib/mail/README,因为它包含了大量的Sendmail配置信息、m4宏等等。一旦你感觉已经被这些东西弄晕了,你可以查看下面这些资源:
书籍:
O'Reilly's Sendmail, 3rd Edition
sendmail Performance Tuning
网站:
http://www.sendmail.org/和http://www.sendmail.com/
Sendmail Performance Tuning for Large Systems
致谢与声明:
感谢Sun Microsystems公司的John Beck先生对这篇文章的审阅。
2003年4月
除非有其他的授权,此中所有技术手册的代码(包括文章、FAQ、例子)的使用都遵从许可权。 |
|