START:
2.3 因特网中的电子邮件
电子邮件是一种异步通信媒介,包括具有附件、超链接、HTML格式文本和图片的报文。
因特网电子邮件系统,有三个主要组成部分:用户代理(user-agent),邮件服务器(mail server)和简单邮件传输协议(simple mail transfer protocol,SMTP)。
1. SMTP
SMTP 是电子邮件的主要应用层协议,它使用 TCP 可靠数据传输服务,有两个部分:运行在发送方和接收方服务器的客户端上。
SMTP 是使用 7 位 ASCII 码编码的,在传送前需要编码,传送后需要译码,异常麻烦。而 HTTP 并不需要这么做。
SMTP 一般不使用中间邮件服务器发送邮件,即使这两个邮件服务器位于地球的两端。
SMTP 的发文方式
- 客户 SMTP 在 25 号端口建立一个到服务器 SMTP 的 TCP 连接;
- 连接成功,服务器和客户将会执行应用层的握手:
- 先相互介绍;
- SMTP 指示发送方和接收方的邮件地址。
- 客户发送报文;
- 如果有另外的报文发送,重复 2 - 3 过程;
- 指示 TCP 关闭。
1 | S: 220 www.example.com ESMTP Postfix |
注释:
- 在此例中,客户从邮件服务器 mydomain.com 向服务器 www.example.com 发送邮件。邮件名为 test message,内容为 Hello … good bye。最后以
. 结束一个报文。 - 如果一个连接中有多个报文发送,在报文发送结束的时候再执行 quit 命令。
2.3.2 与 HTTP 相比
HTTP 是一个拉协议(pull protocol):即 TCP 连接由想接收文件方发起。而 SMTP 是推协议(push protocol),TCP 连接有文件上传方发起。
SMTP 要求每个报文用 7 bit ACSII 码格式,若非,须转码,而 HTTP 并无此类要求。
HTTP 把每个对象封装到自己的 HTTP 的响应报文中,而 SMTP 则是把所有报文对象放在一个报文中。
- 存疑:查看 HTTP封装格式和 SMTP 的再去掉存疑。
2.3.3 邮件报文格式
!提示:邮件报文和 前文 SMTP 握手无关。
一个包含环境信息的首部位于报文体前,包括一系列的首部行,首部行与报文体用CRLF CRLF分割。
每个首部行都是字介石的,它是由关键字后跟冒号以及其值组成的。
每个首部行必须包括一个 From:
和 To:
首部行。
一个典型的报文如下:
1 | From: alice@@crepes.fr |
在首部之后,跟一个空白行,之后是以 ACSII 码构成的报文体。
2.3.4 邮件访问协议
用户通常在本地 PC 上运行一个用户代理程序,而它访问存储在总是保持在线的共享邮件服务器上的邮箱。
假设是 ALICE 向 BOB 发送了一封邮件,以下是过程:
Alice 的代理—SMTP—>Alice 的邮件服务器—SMTP—>BOB 的邮件服务器—POP3 IMAP 或 HTTP —> bob的代理
因为取报文是拉操作,所以需要引入邮件访问协议来解决,常见的有:
- 第三版邮局协议(POP3);
- 因特网邮件访问协议(IMAP);
- HTTP。
1. POP3
用户代理打开端口 110,POP3 开始工作,随着建立 TCP 连接,POP3 按照三个阶段进行工作:
- 特许;
- 事务处理;
- 更新。
特许阶段,代理发送明文的账号密码来鉴别用户;
在事务处理阶段,用户代理取回报文,并对报文进行标记(删除标记、取消删除标记、获取统计信息);
在更新阶段,出现在用户代理发送 quit
命令之后,邮件服务器会删除被标记为删除的报文。
在事物处理过程中,服务器对于客户发出的命令进行回应,通常有:
1 | + OK(有时加上服务器到客户的数据) |
特许阶段有两个主要命令:
1 | user bob |
事物处理过程中,一般有下载并删除和下载并保留方式,并且用户代理发出的命令序列取决于被配置为哪种。
下载并删除执行:
1 | c: list |
用户代理请求服务器列出存储报文的长度,接着客户要求取回并删除每一个邮件,在执行 quit
命令后,POP3 进入更新阶段,删除邮件 1 2。
在会话期间,POP3 服务器保存了一些状态信息,但并不传输。
POP3 只能将文件取回本地,并无法在服务器端建立层次文件夹。
2. IMAP
可以在远程建立文件夹,并把邮件从一个文件夹移入另一个文件夹中,还可以远程查询。
IMAP维护了绘画中的状态信息。
IMAP允许用户代理只获取报文中的一部分内容,而非全部,比如只看文本而不下载图片。
3. HTML
目前的主流方式。
一般这样来传邮件:
alice -http->server-IMAP->server-HTTP->bob。