简单邮件传输协议(SimpleMailTransferProtocol)
电子邮件(e-mail)是使用最广泛的网络应用程序。
邮件传送与前面讲的一些网络应用有着重要的要求上的差别。邮件发送方不应等待远程目的主机有效时才能发送邮件,也不应因为与远程主机通信的网络暂时失效而停止传送。邮件传送是可以有较大延时的。
为处理延迟,邮件系统使用了缓冲池技术。用户发送一个邮件时,系统在个人存储区保存一个拷贝,同时初始化一个到远程主机的传送,这是作为后台活动(邮件发送代理)而进行的,因此,用户还能继续处理其他计算活动。见下页示意图:
说明1:
后台邮件传送进程成为一个客户,先解析获得远程邮件服务器的IP地址
然后初始化一个到邮件服务器的TCP连接
建立后,发送一个邮件的拷贝到远程服务器
–若发送成功,则客户端的本地缓冲池中的邮件拷贝可以清除
–如果不能建立TCP连接或TCP连接失效,则传输进程终止。在一个周期时间后,传输进程再次扫描缓冲池,检查是否有没有发送的邮件,再次发送
如果在多个周期的尝试后,仍不能发出邮件,则要向发送者返回一个报告。
说明2:
用户通过一些标识邮件目的主机名称和邮箱地址的字符串来指定收件人。
这些名称可以和为机器指派的其他名称毫无关系。邮件目的地址的解析具有单独的查询类别。
文件别名扩展机制
大多数系统都提供了包含文件别名扩展机制的邮件转发软件。邮件转发功能可以把本地邮件地址标识映射到一个或多个新的邮件地址。通常,用户写完邮件后指明一个收信人,如果没有使用邮件转发,则发出邮件给指定的收信人,如果已为此地址指定别名,那么邮件接口程序将该别名代替指定地址。
别名系统增加了邮件系统的功能并提供了巨大的方便。别名系统允许一个用户有多个标识:诸如昵称、职位等等。
另一方面,别名系统也允许用一个标识来联结一组收信人。多个收件人使用一个共同的标识称为一个电子邮件列表。
使用邮件别名扩展和转发机制的示意图:
说明
邮件发送和接收时都要通过别名扩展进程,它要检查指定的接收别名是否含有本地地址。
别名扩展有一定的危险性。设站A映射邮件地址x到站B的邮件地址y,而站B映射地址y到A上的x,即:
A:x---àB:y
B:y---àA:x
则发送到地址x的邮件将在两个站之间振荡,x永远也不能收到信件。对地址y也一样。
上述使用端到端转发的邮件系统能保证每个邮件消息在成功到达接受方之前在发送端保留一个拷贝,具有较好的可靠性。
电子邮件的转发还有另一种更常见的方式就是使用邮件网关。在这种系统中,发送端不是与接受端直接联系,而是通过一个或多个中间主机来转发邮件。
使用邮件网关的一个问题是会导致不可靠。
邮件网关导致的不可靠
在邮件网关系统中,一旦发送端主机把一个邮件发送到第一个中间主机后,它就会删除本地拷贝,也就是说,在邮件的传输过程中,发送方和接受方都没有该邮件的拷贝。中间主机的任何故障或中间路由的错误都将导致邮件的丢失,而且也不会向发送方或接收方报告邮件丢失错误。
一般,当邮件网关不能成功转发一个邮件消息到下一个主机时,它能够保留这个信息一段时间,但发送方或接收方是不能确定邮件是在中间那个位置、为什么它还没有到达目的主机或者还要延迟多长时间。也就是说,在邮件网关系统中。发送方或接收方必须依赖其他一些它们不能控制的中间主机来进行通信。
既然邮件网关系统不可靠,那么为什么还使用它呢?
邮件网关系统的优势
邮件网关系统的一个主要的优势在于它能提供异质系统的互操作。邮件网关既能为标准TCP/IP系统之间提供连结,也支持在TCP/IP网络与其他不支持IP协议的网络之间的邮件传输。
这样不能访问因特网的用户就可以通过邮件网关进行通信。
电子邮件服务的TCP/IP标准
为保证上述的互操作性,TCP/IP协议族中的邮件标准分为两个独立的部分:一个指定邮件消息的格式(RFC);另一个说明在两台主机间邮件交换的细节。分开两个标准可以使得使用不同邮件转发系统的主机能使用相同的消息格式。
邮件消息的格式:
–任何一个邮件都分为两部分:邮件头和邮件体。
–邮件头有精确的格式,而邮件体则由发送者自己决定。
–邮件头中有几个关键字是必须的,还有一些为可选的。如必须指定接收方的邮件地址,格式为以To:开始,占一行
电子邮件的地址
在IP网络中,邮件目的地址的格式为:
–邮箱名称
域名而对于邮件网关系统为:
–邮箱名称%(不同的系统有不同的要求)域名
邮件网关域名称邮件首先到达邮件网关,由邮件网关来解析出IP网络的目标邮件地址。在IP网络之外,没有标准格式,但在IP网络之类都使用标准格式。
为了统一各种邮件格式,出现了所谓的伪域名地址
例如,对于UNIX邮件系统,指定域名为uucp(UnixtoUnixCopyProgram),而由相应的系统软件进行解析。
以上为邮件格式,下面介绍邮件交换标准SMTP
简单邮件传输协议(SimpleMailTransferProtocol)
–指定在主机间交换邮件的标准。
–SMTP协议并不指明邮件系统如何从用户那儿接收邮件或者用户接口如何把邮件交给用户。而是集中在规定邮件传送系统如何通过网络连接把消息从一台主机转发到另一台主机。
–SMTP中客户和服务器间的通信过程如下:(消息均采用可读ASCII码)
初始化,客户建立一个到服务器的可靠的流连接(TCP),并等待服务器发送一个“READFORMAIL”消息
客户在收到上述消息后,发送一个HELO(hello的缩写)命令,服务器确认响应
通信建立之后,客户端就可以进行发送邮件消息、请求收发方交换角色以便接收邮件以及终止连接等活动。
邮件发送过程
–发送方以MAIL命令开始,同时FROM:字段包含发送方地址。
–服务器响应OK,意为一切准备就绪
–发送方发送一系列RCPT命令说明邮件的接收方地址,服务器均需确认,返回OK
–发送方发送DATA命令,通知对方要开始发送完整的邮件信息了。返回Startmailinput,并指定邮件终止字符
–发送方发送完数据后,发送TURN命令关闭连接,此时只关闭一方的连接。对方响应OK,并开始承担连接控制。
–如果要完全终止会话双方的连接,发送QUIT,响应OK。
上述仅为最简单的情况,实际情况可能会更复杂,如用户迁移、通信错误等等,如何处理,有的在SMTP中有规定,有的也没有。
非ASCII数据的MIME扩展
–为允许在e-mail中传送非ASCII数据,IETF定义了多目的因特网邮件扩展(MultipurposeInternetMailExtensions)
–MIME允许任意数用ASCII编码并在标准的电子邮件中传输。
–MIME有两部分:Content-Type和Content-Transfer-Encoding
Content-Type:指定数据类型
Content-Transfer-Encoding:用于把数据进行ASCII编码的方式
Content-Type:指定数据类型
–包括两个标识:contenttype和subtype,用斜线分开(如image/gif表示gif格式的图像)
–标准中有7种基本的contenttype(如下图),但允许定义私有的contenttype。