第十三章 电子邮件
自从第一个网络被设计出来,连网最显著的用途之一就是电子邮件(eletronic mail)。它
是从将一个文件从一台机器拷贝到另一台机器的简单服务开始的,并将该拷贝的文件添加到
接收者的mailbox文件中。本质上来说,这仍然是email所做的全部工作,尽管不断增长的网
络及其复杂的路由需求以及它的不断增大的消息负载量已经促使要求更加精心制作的方案。
已设计出了各种邮件交换的标准。Internet上的站点始终坚持RFC 822中的设计,并被描述与
机器无关的传输特殊字符方法的某些RFC所扩充,等等。对于“多媒体邮件”的更多思考目前
也已作出,这涉及到有关在邮件消息中包含图形和声音。另一个标准,X.400,也已被CCITT
定义。
有许多UN*X系统的邮件传输程序被实现。其中最为著名的是Berkeley大学的sendmail,它被
用于很多平台上。最初的作者是Eric Allman,他现在又再次积极地工作于sendmail小组中。
有两个sendmail-5.56c的Linux移植版本,其中之一将在第15章中讨论。目前正在开发的sen
dmail版本是8.6.5。
Linux最常用的邮件代理程序是smail-3.1.28,是由Curt Landon Noll和Ronald S.Karr编写
和版权所有。在大多数Linux发行版中都包含这个程序。下面,我们将简称它为smail,尽管
它还有其它完全不同的版本,但我们在这里并不讨论它们。
与sendmail相比,smail就显得非常简单。当对于一个没有复杂路由要求的小站点处理邮件时
,这两者的性能就非常相近。然而,对于大型站点,sendmail总能高出一筹,因为它的配置
方案是非常灵活的。
smail和sendmail两者够支持一族配置文件,它们都需要进行自定义(定制)。除了邮件子系
统运行所必要的信息以外(比如象本地主机名),还有许多参数需要调整。Sendmail的主要
配置文件开始是非常难理解的。它看上去就好象你的猫在按下了shift键的键盘上打过盹。s
mail的配置文件就非常结构化并且比sendmail的容易理解,但没有给予用户很强的调整邮件
箱性能的能力。然而,对于小型的UUCP或Internet站点,它们的配置所需要的工作基本上是
一样的。
在本章中,我们将讨论什么是邮件以及作为一个管理员你要涉及什么问题。第14章和第15章
将对第一次设置smail和sendmail给出指导。那里所提供的信息已足够让一个小型站点工作起
来,但是还有许多的选项,你可以在你的计算机旁花费很多快乐的时间来配置这些奇妙的特
性。
在本章的最后,我们将概要地讨论elm的设置,这是一个许多UN*X系统(包括Linux)非常通
用的邮件用户代理程序。
有关Linux上电子邮件方面问题的更多信息,请参考Vince Skahan的Electronic Mail HOWTO
,这是定期投递到comp.os.linux.announce上的。Elm、smail和sendmail的源程序发行版同
样也包含了非常广的文档资料,能够解答设置它们时所遇到的大多数问题。如果你在寻找有
关电子邮件的一般性信息,有许多RFC涉及这个方面。它们列于本书后的参考书目中。
13.1 什么是邮件消息?
一个邮件消息是由消息体―它是发送者所写的文本、以及指明收信者的特定数据、传输介质
等等组成,非常象信封上所见的信息。
这些管理用的数据可以分成两类;第一类是与特定传输介质相关的数据,就象发信者和收信
者的地址。因此它们被称为envelope。在消息传输途径中,它们可能会被转换。
第二类是处理邮件消息所需的任何数据,它们并不是针对任何传输机制的,比如消息的主题
行(subject line)、所有接收者列表、以及消息发送的日期。在许多网络中,将这些数据
添置到邮件消息中已成为了标准,形成所谓的邮件头(mail header)。它与邮件体(mail
body)之间相隔一空行。[1]
UN*X世界中的很多邮件传输软件使用一个RFC 822中指定的头[标题]格式。它的最初目的是在
ARPANET上的使用指定一个标准,但是由于它被设计成是与任何环境都独立的,它很容易地被
其它网络采纳,包括许多基于UUCP的网络。
然而,RFC 822仅是最伟大的公共奠基石。现有更多的标准已被构想出来以应付不断增长的需
求,比如,数据加密、国际字符集的支持、以及多媒体邮件扩展(MIME)。
在所有这些标准中,标题[头]由几行组成,并由换行符来分割。每行是由从第一列开始的字
段名、和由一个冒号和一个空格分割的字段本身组成。每个字段的格式和语义是随字段名的
不同而有变化的。如果下一行是以一个TAB开始的,表示是标题字段的续行。各字段的顺序是
随意的。
一个典型的邮件标题看上去象这样的:
From brewhq.swb.de!ora.com!andyo Wed Apr 13 00:17:03 1994
Return-Path:
Received: from brewhq.swb.de by monad.swb.de with uucp
(Smail3.1.28.1 #6) id m0pqqlT-00023aB; Wed, 13 Apr 94 00:17 MET DST
Received: from ora.com (ruby.ora.com) by brewhq.swb.de with smtp
(Smail3.1.28.1 #28.6) id ; Tue, 12 Apr 94 21:47 MEST
Received: by ruby.ora.com (8.6.8/8.6.4) id RAA26438; Tue, 12 Arp 94 15:56 ?0400
Date: Tue, 12 Apr 1994 15:56:49 ?0400
Message-Id: 199404121956.PAA07787@ruby
From: andyo@ora.com (Andy Oram)
To: okir@monad.swb.de
Subject: Re: Your RPC section
通常,所有所需的标题字段都是由你所使用的邮件程序界面产生,象elm、pine、much或mai
lx。然而有些字段是可选的,可以由用户自己加上去。例如,elm允许你编辑部分消息头[标
题]。而其它的则是由邮件传输软件加上去的。常用的标题字段以及它们的含义如下所示:
From: 含有发送者的email地址,以及可能还有“真实名字”。这里使用了一个格式的完整z
oo。
To: 这是接收者的地址。
Subject: 用几个词描述邮件的内容。起码这是应该做的。
Date: 邮件发送的日期。
Reply-To: 发送者指定接收者回信所发往的地址。对于你有几个帐号,但是只想在你常用的
帐号下接收大量的邮件,此时这个字段是很有用的。该字段是可选的。
Organization: 产生邮件的机器所属的组织。如果你的机器是属于你个人的,你可以空着该
字段,或者插入“个人”(“private”)或某些完全无意义的东西。这个字段是可选字段。
Message-ID: 产生邮件的系统的邮件传输程序生成的字符串。对于这条消息来讲是唯一的。
Received: 处理你的邮件的每一个站点(包括发送者和接收者的机器)在标题中插入的字段
,给出它的站点名称、一个消息id、收到该消息的时间和日期、从哪个站点来的以及使用了
哪个传输软件。根据此,你可以跟踪消息走过的路由,并且如果出了差错你可以抱怨的负有
责任的相关人士。
X-anything: 以X-开头的标题行对任何邮件相关的程序都是不起作用的。它是用于实现还没
有写入或不可能写入RFC的额外的特性的。例如,它用于Linux Activists邮件列表中,其中
,是用X-Mn-Key: 标题字段 来选择频道的。
这个结构的一个例外是最开头的一行。它以关键字From开始,紧接着是一个空格而是一个冒
号。为了与普通的From:字段相区别,它通常被引用为From_。它包含消息所参与的UUCP大宗
路径形式(下面将作解释)的路由、最后一台接收消息的机器处理消息的时间和日期以及一
指明从哪台主机接收来的可选部分。由于每个处理过这个消息的系统都会生成这个字段,所
以它通常包括在信封数据下。
因此From_字段与某些老式的邮件程序是向后兼容的,但已不再经常使用,除了邮件用户界面
程序还要依靠它来确定用户邮件箱中一个消息的开始处。也是为了消除以“From ”开始的消
息体中的行所带来的潜在问题,在它之前放置“”以避免任何这样的现象出现,这已经成为
一标准方法。
13.2 邮件是如何投递的?
一般来讲,你要使用一个邮件界面程序象mail或mailx来编写邮件;或者使用更为复杂的象e
lm、mush或pine。这些程序统称为邮件用户代理(mail user agents),或简称MUA。如果你
发出了一个邮件消息,那么在大多数情况下界面(接口)程序会将它传递给另一个程序去进
行投递。这个程序称为邮件传输代理(mail transport agent),或简称MTA。在某些系统中
,对于本地的和远程的投递有不同的邮件传输代理程序;在其它系统上,仅有一个。远程投
递的命令通常称为rmail,其它的称为lmail(如果存在的话)。
当然,本地邮件的投递仅仅是将进来的消息附加到接收者的邮件箱里。通常,本地MTA是懂得
别名(将接收者的地址设置成指向其它的地址),和转发的(将用户的邮件重定向到某个其
它的目的地)。同样,不能投递的消息通常必须反弹回来(bounced),也即,附带某些出错
信息返回给发送者。
对于远程投递操作,所用的传输软件依赖于链接的属性。如果一个邮件必须在使用TCP/IP的
网络上投递的话,常常会使用SMTP。SMTP表示简单邮件传输协议(Simple Mail Transfer P
rotocol),是在RFC 788和RFC 821中定义的。SMTP通常直接连接至接收者的机器上,与远端
的SMTP后台程序(daemon)协商消息的传输。
在UUCP网络中,邮件通常不是直接投递的,而是通过一系列的中间系统转发到目的主机上的
。为了在UUCP链接上发送一个消息