【概述】
电子邮件是一种异步通信方式,通信时不需要双方同时在场
电子邮件将邮件发送到收件人使用的邮件服务器,并放在其中的收件人邮箱中,收件人可以随时上网到自己使用的邮件服务器进行读取
【电子邮件系统组成】
一个电子邮件系统具有三个组成构件:用户代理、邮件服务器、邮件发送协议和读取协议
用户代理,是用户与电子邮件系统的接口,其能够使用户通过一个接口来收发邮件,同时,其具有撰写、显示、邮件处理的功能,在通常情况下,用户代理就是一个运行在 PC 端的程序,常见的有:Outlook、Foxmail 等
邮件服务器,是电子邮件系统的核心,其主要功能是发送、接收邮件,同时还要向发信人报告邮件传送的情况,包括已交付、被拒绝、丢失等
邮件服务器采用 C/S 方式,其能够同时充当客户和服务器,举例来说,当邮件服务器 A
向邮件服务器 B
发送邮件时,A
就作为客户,B
是服务器,反之,B
向 A
发送邮件时,B
作为客户,A
是服务器
邮件发送协议用于用户代理向邮件服务器发送邮件,或在邮件服务器间发送邮件,通常使用 SMTP 协议
邮件读取协议用于用户代理从邮件服务器读取邮件,通常使用 POP3 协议
【电子邮件收发过程】
电子邮件的发送接收过程可简化为上图所示形式:
- 发信人通过用户代理来撰写要发送的邮件
- 用户代理通过 SMTP 协议将邮件传给发送方邮件服务器
- 发送方邮件服务器放入邮件缓存队列中,等待发送
- 运行在发送方邮件服务器的 SMTP 客户进程,发现邮件缓存中存在待发送邮件,就向运行在接收方邮件服务器的 SMTP 客户进程建立 TCP 连接
- TCP 连接建立后,SMTP 客户进程开始向远程 SMTP 进程发送邮件
- 当所有待发送邮件发送完毕,发送方 SMTP 进程关闭所建立的 TCP 连接
- 运行在接收方的 SMTP 进程收到邮件后,将邮件放入收信人的用户邮箱中,等待收信人接收
- 收信人在打算收信时,使用用户代理,通过 POP3 协议,将自己的邮件从接收方邮件服务器的用户邮箱中取回
【SMTP 协议】
简单邮件传输协议(Simple Mail Transfer Protocol,SMTP)是一种提供可靠且有效的电子邮件传输协议,控制两个相互通信的 SMTP 进程交换信息,SMTP 基于 C/S 模型,在传输层上采用 TCP 协议,端口号为 $25$
SMTP 通信主要有以下三个阶段:
1.连接建立
发件人的邮件发送到发送方邮件服务器的缓存后,SMTP 客户每隔一定时间,就对邮件缓存扫描一次
若发现有邮件,就利用 SMTP 的 $25$ 号端口与接收方的 SMTP 建立 TCP 连接
TCP 连接建立后,接收方 SMTP 要发送 220 Service ready
服务就绪消息,然后 SMPT 发送方会发送 HELO
命令,并附上发送方的主机名
2.邮件传送
在 TCP 连接建立后,就可以进行邮件的传送
1)邮件的传送从 MAIL
命令开始,其后跟有发件人的地址,例如:MAIL FROM: <123@qq.com>
,若 SMTP 接收方准备好接收邮件,就回答 250
OK 信息
2)接着 SMTP 客户端发送一个或多个 RCPT
命令,来确定接收方是否已经做好接收邮件的准备,RCPT
命令的格式为:
每发送一个 RCPT
命令,都应有相应的信息从 SMTP 服务器返回,一般为 250
OK 信息或 550
无此用户信息
3)在获取 250
OK 信息后,发送方会使用 DATA
命令,开始传送邮件内容
一般情况下,接收方会回复:
这说明 SMTP 发送方可以开始传送邮件内容,并用 <CRLF>.<CRLF>
(两个回车中间一个点)表示邮件内容的结束
3.连接释放
邮件发送完毕后,SMTP 发送方会发送 QUIT
命令,若 SMTP 接收方同意释放连接,会返回 221
服务关闭信息
随着万维网的流行,目前出现了许多基于万维网的电子邮件,例如 Gmail、Hotmail 等
这种电子邮件的特点是用户浏览器与邮件服务器间,发送、接收邮件使用 HTTP 协议,仅在不同邮件服务器间传送邮件才使用 SMTP 协议
【POP3 协议】
邮局协议(Post Office Protocol,POP),是一个简单但功能有限的邮件读取协议,目前使用的是其第 $3$ 个版本,即 POP3 协议,其基于 C/S 模型,在传输层使用 TCP 协议,端口号为 $110$
POP3 采取的是拉(Pull)的通信方式,当用户读取邮件时,用户代理会向邮件服务器发出请求,拉取用户邮箱中的邮件
POP 有两种工作方式:
- 下载并保留:用户从邮件服务器中读取邮件后,邮件依然保留在服务器上,可下次再次从服务器上读取该邮件
- 下载并删除:用户从邮件服务器中读取邮件后,邮件就从服务器上删除了
值得注意是,除了 POP3 外,还有一个邮件读取协议是网际报文存取协议 IMAP,其比 POP3 要复杂的多,目前只是因特网的建议标准
【电子邮件格式】
一个电子邮件分为信封和内容两部分,邮件内容又分为首部和主体两部分
其中,邮件的首部格式在 RFC 822 中有具体的规定,而邮件内容的主体部分让用户自行撰写
在用户写好首部和主体后,邮件系统会自动将信封所需的信息提取出来,并填写在信封上,无需用户亲自填写
邮件内容的首部包含一些首部行,每个首部行的格式为 关键字:值
,有些首部行是必需的,有些则是可选的,最重要的关键字是 To
、Subject
To
,是必需的关键字,其后跟一个或多个收信人的电子邮件地址;Subject
,是可选的关键字,其是邮件的主题
此外,还有一个必需的关键字 From
,但其是由邮件系统自动填入的,其是发信人的电子邮件地址
一个典型的邮件内容如下图所示
【MIME】
由于 SMTP 只能传送一定长度 ASCII 码,这导致许多非英语国家的文字无法利用 SMTP 来传送,也无法传送可执行文件与二进制对象,为此,提出了多用途网络邮件扩充(Multipurpose Internet Mail Extensions,MIME)
MIME 并没有改动 SMTP 或取代它,其继续仍旧使用当前的格式,只是增加了邮件主体的结构,并定义了传送非 ASCII 码的编码规则
MIME 与 SMTP 关系如下图所示
MIME 主要包括了以下三部分内容:
- 定义了五个新的邮件首部:MIME 版本、内容描述、内容标识、内容传送编码、内容类型
- 定义了许多邮件内容的格式,同时对多媒体邮件的表示方法进行了标准化
- 在 ASCII 码的基础上定义了内容传送编码(Content-Transfer-Encoding)
关于内容传送编码
MIME 在 SMTP 的基础上定义了该编码,对原 ASCII 编码进行了扩充,具体规则如下:
1)若传送数据为 ASCII 码的话,仍采用 ASCII 码的编码方案
2)若传送数据只有少量 ASCII 码的话,采用 quoted-printable
编码方案
对于可打印 ASCII 码,除
=
外的所有编码,均不变对于不可打印 ASCII 码、
=
、非 ASCII 码,每个字节的二进制代码用两个十六进制表示,然后在前面加上一个=
3)对于二进制文件,采用 base64
编码方案
即先将二进制码划分为一个个 $24$ 位长的单元,再将每一个 $24$ 位单元划分为 $4$ 个 $6$ 位组,最后将每个 $6$ 位组转成一个 ASCII 码,具体规则是:
A~Z
表示0~25
a~z
表示26~51
0~9
表示52~61
+
表示62
/
表示63