Email 应用概述
下图给出了因特网 Email 系统的总体情况,从该图中我们可以看到它有三个主要组成部分:邮件客户端(user agent)、邮件服务器(mail server)和简单邮件传输协议(Simple Mail Transfer Protocol, SMTP)。
- 邮件客户端允许用户读、写 Email 消息,它可以与邮件服务器交互,收、发 Email 消息。
- 邮件服务器是 Email 体系结构的核心,它为每一个用户分配一个邮箱(mailbox),并且有一个消息队列(message queue)存储等待发送的 Email,发送失败的邮件会在保存该消息队列中并在以后尝试再次发送。
- SMTP协议是邮件服务器间传递消息所使用的应用层协议,SMTP 也有两个部分:运行在发送方邮件服务器的客户端和运行在接收方邮件服务器的服务器端,每台邮件服务器既运行 SMTP 的客户端也运行 SMTP 的服务器端。
一个典型的邮件发送过程是:从发送方的用户代理开始,传输到发送方的邮件服务器,再传输到接收方的邮件服务器,然后在这里被分发到接收方的邮箱中。
SMTP 协议
简单邮件传输协议(Simple Mail Transfer Protocol, SMTP)是因特网电子邮件应用的核心,用于从发送方的邮件服务器发送报文到接收方的邮件服务器,使用 TCP 进行 Email 消息的可靠传输。
SMTP 问世的时间比 HTTP 要长很多(初始的 SMTP 的 RFC 可追溯到 1982 年,而 SMTP 在此之前就已经出现了),它限制所有邮件报文的体部分(不只是其首部)只能采用简单的 7 位 ASCII 表示,在今天的多媒体时代,在用 SMTP 传送邮件之前,需要将二进制多媒体数据编码为 ASCII 码,并且在使用 SMTP 传输后要求将响应的 ASCII 码邮件解码还原为多媒体数据。
SMTP 的交互过程:首先,客户端 SMTP 在 25 号端口建立一个到服务器 SMTP 的 TCP 连接。如果服务器没有开机,客户会在稍后继续尝试连接。一旦 TCP 连接建立,服务器和客户执行某些应用层的握手,SMTP 客户指示发送方的邮件地址和接收方的邮件地址。一旦该 SMTP 客户和服务器彼此介绍之后,客户发送该报文,SMTP 能够依赖 TCP 提供的可靠数据传输无差错地将邮件投递到接收服务器。该客户如果有另外的报文要发送到该服务器,就在该相同的TCP 连接上重复这种处理,即 SMTP 用的是持久性连接;否则,它指示 TCP 连接关闭。
S: 220 hamburger.edu
C: HELO crepes.fr
S: 250 Hello crepes.fr, pleased to meet you
C: MAIL FROM: <alice@crepes.fr>
S: 250 alice@crepes.fr... Sender ok
C: RCPT TO: <bob@hamburger.edu>
S: 250 bob@hamburger.edu ... Recipient ok
C: DATA
S: 354 Enter mail, end with "." on a line by itself
C: Do you like ketchup?
C: How about pickles?
C: .
S: 250 Message accepted for delivery
C: QUIT
S: 221 hamburger.edu closing connection
上面的例子给出了 SMTP 交互过程,DATA
命令表示客户端要开始发送数据了,收到服务器的回复之后就开始发送数据,客户通过发送一个只包含 .
的行指示该报文结束了(按照 ASCII 码的表示方法,每个报文以 CRLF.CRLF
结束,其中的每个 CR
和 LF
分别表示回车和换行)。
与 HTTP 的对比
这两个协议都用于从一台主机向另一台主机传送文件,当进行文件传送时,持久的 HTTP 与 SMTP 都使用持久性连接。因此,这两个协议有一些共同特征,如:
- 都使用命令/响应交互模式
- 命令和状态代码都是 ASCII 码
然而,两者之间也有一些重要的区别:
- HTTP 是一个拉协议(pull protocol),SMTP 是一个推协议(push protocol)
- SMTP 报文必须按照 7 比特 ASCII 码进行编码,HTTP 数据则不受这种限制
- 对于既包含文本又包含图形的文档的处理方法,HTTP 把每个对象封装到它自己的 HTTP 响应报文中,而 SMTP 则把所有报文对象放在一个报文中。
Email 消息格式
首部行(header)必须含有一个 From:
首部行和一个 To:
首部行,也许包含 Subject:
等其他可选的首部行。注意这些首部行不同于前面前面说到的 SMTP 命令(即使那里也包含了某些相同的词汇,如 from 和 to),SMTP 中的命令是 SMTP 握手协议的一部分,而这里的首部行则是邮件报文自身的一部分。
消息体(body)指 Email 消息本身,只能是 ASCII 字符。
多媒体扩展
MIME:多媒体邮件扩展,通过在邮件头部增加额外的行以声明 MIME 的内容类型。
邮件访问协议
接收方的邮件客户端不能使用 SMTP 从邮件服务器获取邮件,因为取邮件是一个拉操作,而 SMTP 是一个推协议,通过引入邮件访问协议来解决这个问题。目前有一些流行的邮件访问协议,包括第三版的邮局协议(Post Office Protocol-Version 3, POP3)、因特网邮件访问协议(Internet Mail Access Protocol, IMAP)以及 HTTP。
这也说明一个网络应用可以综合使用多个应用层协议。