用Linux作邮件服务器
来源:中国站长站 时间:2008-07-28 17:30:00
在Internet上,E-mail是用户之间交往沟通的最佳方式。通过电子邮件,可以为Linux系统开拓新的空间,增强与外界的联系。已经证明,电子邮件是Internet上使用最多的应用程序,甚至比WWW的使用还要多。本章介绍如何为Linux系统安装、配置E-mail软件。
1 Linux E-mail软件简介
Linux中的E-mail软件系统分为两大类:MUA(邮件用户代理)和MTA(邮件传送代理)。MUA的功能是为用户提供读写邮件的界面,而MTA的作用则是处理邮件的收发工作。换言之,用户可以通过MUA写信、读信,利用MTA收信、发信。
最常用的电子邮件MTA系统是sendmail,它由加州大学开发,其最新版本是8.9;另一个常见的MTA程序是smail,它由Curt Noll和Ronald Karr联合开发,也已经发布了几个版本。
值得注意的是,与其他大型软件包一样,sendmail也有自己的一些缺陷。虽然引起sendmail失败或系统崩溃的错误已基本上被排除,但提供root访问权限的安全性漏洞仍然时有发现。如果配置不当,sendmail有可能为“黑客”提供可乘之机。为了安全起见,用户最好定期访问计算机紧急反应小组(CERT,www.cert.org)的网页,加入它的邮递列表,或者阅读由它主持的网络讨论组(conp.security.announce)来了解由它发出的安全性通知。
电子邮件的MUA系统目前很多,大约有十几种,其中最常见是:mail和elm。
2 sendmail及其配置
本节介绍如何安装和配置sendmail程序,不过在开始深入研究这些详细内容之前,先介绍SMTP协议以及域名系统(DNS)对E-mail在Internet上传输的影响。
2.1 SMTP
SMTP是简单邮件传输协议的简称,是Internet上传输邮件的既定标准方式。sendmail的基础协议正是SMTP。sendmail程序提供为Linux支持SMTP连接所需的服务。
要了解sendmail所做的各种不同工作,需要掌握有关互联网协议的一些知识。所谓协议就是硬件和软件进行通信所遵守的标准。协议通常分为不同的层次,高层的协议利用低层的协议作为基础。例如,互联网协议(IP)在网络之间发送和接受数据包,但不必创建诸如SMTP和其他高层协议所使用的端到端(PPP)的连接;建立在IP之上的传输控制协议(TCP)提供了被Telnet和SMTP程序所使用的面向连接的服务;总而言之,TCP/IP为互联网提供了基本的网络服务,例如文件传输协议(FTP)和SMTP的高层协议,都建立在TCP/IP之上。协议分层的优点在于,执行SMTP或FTP协议的程序不必知道与传送数据包和连接其他主机有关的任何内容,因为它们可以使用TCP/IP提供的服务来完成。即执行高层协议的程序不必关心低层协议的具体细节。
SMTP定义了在互联网上交换E-mail的方式,因此软件版本和硬件环境对交换邮件的程序来说并不重要,只要这两个程序都正确地执行SMTP协议,它们就可以交换邮件。
下面介绍一个使用的SMTP协议的例子:位于somedomain.gov的用户li正在向位于otherdomain.com的zhang发送邮件。
$ sendmail-v zhang@otherdomain.com<letter
zhang@otherdonain.com...Connecting to otherdomain.com via top...
Trying 123.45.67.1...connected
220-otherdomain.com SMTP ready at Sun,14 Nov 1999 18:56:22-0500
220 ESMTP spoken here
>>>HELO somedomain.gov
250 otherdomain.com Hello somedomain.gov [123.45.67.2],pleased to meet you
>>>MAIL From:〈li@somedomain.gov〉
250〈li@somedomain.gov...Sender ok
>>>RCPT To:〈zhang@otherdomain.com〉
250〈zhang@otherdomain.com)...Recipient ok
>>>DATA
354 Enter mail,end with"." on a line by itself
>>>.
250 SAA08680 Message accepted for delivery
>>>QUIT
221 otherdomain.com closing connection
zhang@otherdomain.com...Sent
S
上面的第一行是直接调用Sendmail的一种命令格式,而不是利用用户所喜欢的邮件用户代理MUA(例如elm或mail)来执行这一任务。这里-v选项告诉sendmail使用冗余模式显示SMTP对话。其余行显示的是SMTP客户机和服务器进行的交谈。以>>>开始的行表示的是位于somedomain.gov处的客户机(寄件人),紧跟其后的行是位于otherdomain.com处的服务器(收件人)的答复。以220开始的第一行是最初连接之后SMTP服务器对自己进行的声明,它给出了自己的主机名以及日期和时间;第二行用来告诉客户机该服务器能够理解扩充的SMTP协议(ESMTP),以便客户能够使用它。像220这样的号码是SMTP客户机同SMTP服务器用来通信的回复代码,跟随回复代码后面的文本才是真正的内容。
如果想对这一对话有更深刻的了解,可以阅读参考文献RFC821。以-v选项运行sendmail有助于用户理解SMTP对话的工作方式。
像otherdomain.com这样的名字对于用户理解和记忆是十分方便,而计算机采用的却是像123.45.67.1这样的数字化的IP地址。幸运的是,域名系统(DNS)提供了主机名到IP地址的转化以及其他的重要信息。用户没有必要记忆主机的IP地址。
DNS把对主机进行命名和编号的权限分配给自治管理的域,例如,一个称为otherdomain. com的公司可以维护自己域中主机的所有信息。当主机a.otherdomain.com想发送邮件或远程登录(Telnet)到主机b.otherdomain.com时,它会通过网络向otherdomain.com的域名服务器发送一个请示,域名服务器不妨假设是主机ns.otherdomain.com。域名服务器ns.otherdomain.com将把b.otherdomain.com的IP地址(可能还有其他信息)返回给a.otherdomain.com,这样邮件将被发送,或者Telnet将被连接。由于us.otherdomain.com对otherdomian.com域具有管理权,因此它能够回答对otherdomain.com中的主机的任何查询,不管这些查询发自哪里;另外,它还有对域中的主机进行命名的权力。
现在,如果a.otherdomain.com上的某人想给zhang@ somedomain.gov发送邮件会怎么样呢?虽然us.otherdomain.com没有位于somedomain.gov域中的主机的有关信息,但是它却知道如何找到这一信息。当城名服务器收到它不具有此域信息的某个城中的主机的查询请示时,它便向根域名服务器(root nameserver)询问那个域中(在本例中是somedomain.gov)具有管理权限的域名服务器的名字和IP地址。根域名服务器将把对somedomain.gov具有管理权限的域名服务器的名字和IP地址提供给us.otherdomain.com。us.otherdomain.com域名服务器将询问它们并把回复转发给a.otherdomain.com。
从上可知,DNS是一个包含主机名到IP地址映射的大型分布式数据库。另外,它还包含其他信息。当利用像。sendmail这样的程序投递邮件时,它必须把收件人的主机名转化为一个IP地址。这部分DNS数据被称为A(地址)记录,它是关于主机的最基本的数据。主机数据的另一部分是邮件交换器(MX)记录,像a.otherdomain.com主机的MX记录列出的是能够为它接收邮件的一个或多个主机。
也许读者会问:MX记录的作用是什么?为什么a.otherdomain.com不简单地接收它自己邮件并处理这一过程呢?
MX记录的作用如下:
(1)通过MX,不在Internet上的主机(例如,只利用UUCP的用户)能够指定一个Internet主机来接收它们的邮件,从而使它们看起来就像具有Internet地址一样。例如,假定a.
otherdomain.com只是偶尔通过UUCP连接到ns.otherdomain.com。如果us.otherdomain.com为它发布一个MX记录,其他Internet主机就能够向它发送邮件。当ns.otherdomain.com收到邮件时,它把邮件保存起来,直到a.otherdomain.com同它连接。MX记录能够使非Internet主机也可以接收来自Internet的E-mail。
(2)通过MX,使用仅有发送功能MUA客户程序的用户也能接受电于邮件。假设有一台充当一 * C机的文件服务器的UNIX主机pcserv.otherdomain.com。这些PC机都具有可以发送邮件但不能接收邮件的带有内置SATP客户程序的MUA。如果发往外地的邮件具有类似someone@pcl.otherdomain.com的回复地址,那么接收方如何回复信件呢?通过MX记录,问题便迎刃而解:用pcserv.otherdomain.com做为所有PC机的MX主机,寄向它们的邮件都将正确到达。
(3)通过MX可以把用户的电子邮件存储起来。由于一些难以预料的原因,主机可能会长时间地离开Internet。虽然用户的主机离开了Internet,但发往它的邮件可能在其他主机上排队,当经过一段时间后邮件便返回给寄件人。如果用户的主机具有在中断时间里为它保存邮件的MX主机,那么在用户的主机重新启用后邮件将被投递。这些MX主机可以是站点内的(即在用户的域中),也可以是站点外的,或者两者都有。有条件的情况下,最好选择站点外的MX主机。因为某些事故通常会使用户的整个站点与网络断开,在这种情况下,站点内的MX主机也就毫无用处。
(4)MX记录能够隐藏信息并使用户更灵活地重新配置自己的局域网。
收邮件的主机被命名为wang.otherdomain.com还是liang.otherdomain.com并不重要,用户的通信者不会知道其中的差别。
当某个SMTP客户程序向某个主机投递邮件时,它并不只是把主机名转化为IP地址。客户程序首先查找MX记录。如果MX记录存在,它便按照记录中所提供的优先级对这些记录进行排序。例如,otherdomain.com或许就具有MX记录,这些记录把主机mailerl.otherdomain.com、mailer2.otherdomain.com和mailer3.somedomain.gov列为愿意为它们收邮件的主机。注意,“主机”otherdomain.com除作为一个MX记录外可能并不存在,即它没有一个可用的IP地址。虽然这些主机中的任何一个都将为otherdomain.com接受邮件,但MX的优先级确定了SMTP客户程序应首先尝试投递的主机。在这里,系统管理员实际上已经设置了一个主邮件服务器mailer1.otherdomain.com和一个站点内的备用邮件服务器mailer2.otherdomain.com,并且还与mailer3.somedomain.gov的管理员协商,把它作为站点外的一个备用邮件服务器。管理员通过设置MX的优先级,从而使SMTP客户程序将首先试用主邮件代收器,其次是站点内的备用邮件服务器,最后是站点外的备用邮件服务器。
当收集和排序MX记录之后,SMTP客户程序把这些主机的IP地址聚集起来并按照它们的MX优先级的顺序向它们投递。当邮件传送出现问题时,应该清楚这样一个事实:若一封信被投递的地址是zhang@otherdomain.com,这并不能说明主机。otherdomain.com一定存在;即使这一主机存在,或许它也不是直接接收邮件的主机。
另外,很有必要了解邮件头和信封地址之间的差别,因为邮件路由器处理它们的方式是不同的。下面举例说明两者之间的差别。
假定某个用户有一个便笺想寄给一些同事,他们分别是A公司的li和qiu以及B公司的zhang和wang吧。用户把便笺的一个副本交给了用户所信任的邮件收发员xie,他记录了所有的收件人。xie是个非常精明的人,他想为用户的公司节省邮费,因此把便笺复印了两份,然后把每份放进一个写有各自公司地址的信封里(而不是给每个收件人都发送一个副本)。在发往A公司的信封的封面上,他写有h和qiu的名字;在发往B公司的信封的封面上,写有zhang和wang。当xie在A公司和B公司的的同行收到这两个信封时,他们对便笺进行了复印并把它们分别送给了li、qiu和zhang、wang,而并不查看在便笺里面写的地址。对于A公司和B公司的邮件收发员来说,他们所关心的只是信封地址。
上面的比喻说明了SMTP客户程序和服务程序的工作方式。假定zhang@somedomain.gov向他的同事li@somedomain.gov和zeng@otherdomain.com发送邮件,信头部的收件人名单如下:
To:li@somedomain.gov,zeng@otherdomain.com