Alex_McAvoy

想要成为渔夫的猎手

电子邮件

【概述】

电子邮件是一种异步通信方式,通信时不需要双方同时在场

电子邮件将邮件发送到收件人使用的邮件服务器,并放在其中的收件人邮箱中,收件人可以随时上网到自己使用的邮件服务器进行读取

【电子邮件系统组成】

一个电子邮件系统具有三个组成构件:用户代理、邮件服务器、邮件发送协议和读取协议

用户代理,是用户与电子邮件系统的接口,其能够使用户通过一个接口来收发邮件,同时,其具有撰写、显示、邮件处理的功能,在通常情况下,用户代理就是一个运行在 PC 端的程序,常见的有:Outlook、Foxmail 等

邮件服务器,是电子邮件系统的核心,其主要功能是发送、接收邮件,同时还要向发信人报告邮件传送的情况,包括已交付、被拒绝、丢失等

邮件服务器采用 C/S 方式,其能够同时充当客户和服务器,举例来说,当邮件服务器 A 向邮件服务器 B 发送邮件时,A 就作为客户,B 是服务器,反之,BA 发送邮件时,B 作为客户,A 是服务器

邮件发送协议用于用户代理向邮件服务器发送邮件,或在邮件服务器间发送邮件,通常使用 SMTP 协议

邮件读取协议用于用户代理从邮件服务器读取邮件,通常使用 POP3 协议

【电子邮件收发过程】

电子邮件的发送接收过程可简化为上图所示形式:

  1. 发信人通过用户代理来撰写要发送的邮件
  2. 用户代理通过 SMTP 协议将邮件传给发送方邮件服务器
  3. 发送方邮件服务器放入邮件缓存队列中,等待发送
  4. 运行在发送方邮件服务器的 SMTP 客户进程,发现邮件缓存中存在待发送邮件,就向运行在接收方邮件服务器的 SMTP 客户进程建立 TCP 连接
  5. TCP 连接建立后,SMTP 客户进程开始向远程 SMTP 进程发送邮件
  6. 当所有待发送邮件发送完毕,发送方 SMTP 进程关闭所建立的 TCP 连接
  7. 运行在接收方的 SMTP 进程收到邮件后,将邮件放入收信人的用户邮箱中,等待收信人接收
  8. 收信人在打算收信时,使用用户代理,通过 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 中有具体的规定,而邮件内容的主体部分让用户自行撰写

在用户写好首部和主体后,邮件系统会自动将信封所需的信息提取出来,并填写在信封上,无需用户亲自填写

邮件内容的首部包含一些首部行,每个首部行的格式为 关键字:值,有些首部行是必需的,有些则是可选的,最重要的关键字是 ToSubject

To,是必需的关键字,其后跟一个或多个收信人的电子邮件地址;Subject ,是可选的关键字,其是邮件的主题

此外,还有一个必需的关键字 From,但其是由邮件系统自动填入的,其是发信人的电子邮件地址

一个典型的邮件内容如下图所示

【MIME】

由于 SMTP 只能传送一定长度 ASCII 码,这导致许多非英语国家的文字无法利用 SMTP 来传送,也无法传送可执行文件与二进制对象,为此,提出了多用途网络邮件扩充(Multipurpose Internet Mail Extensions,MIME)

MIME 并没有改动 SMTP 或取代它,其继续仍旧使用当前的格式,只是增加了邮件主体的结构,并定义了传送非 ASCII 码的编码规则

MIME 与 SMTP 关系如下图所示

MIME 主要包括了以下三部分内容:

  1. 定义了五个新的邮件首部:MIME 版本、内容描述、内容标识、内容传送编码、内容类型
  2. 定义了许多邮件内容的格式,同时对多媒体邮件的表示方法进行了标准化
  3. 在 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
感谢您对我的支持,让我继续努力分享有用的技术与知识点!