目录
1. 电子邮件系统及组成结构
1.1 电子邮件
电子邮件自因特网诞生以来已经成为最为流行的应用程序,时至今日,仍然是最为重要和实用的互联网应用之一
与普通邮件一样,电子邮件是一种异步通信方式,不像电话等通信方式必须通信双方同时在场,发送方可以在任意时间发送邮件,接收方也可以在任意时间接收邮件
电子邮件较普通邮件更为快速而且易于分发,价格便宜。现代电子邮件具有许多强大的特性,包括具有附件、超链接、HTML格式文本和图片的报文
1.2 电子邮件系统的组件
一个电子邮件系统的组成构件
主要有三个组成部分:
- 用户代理(user agents,UA)
- 邮件服务器(mail servers)
- 简单邮件传输协议(Simple Mail Transfer Protocol,SMTP)
电子邮箱的工作方式和寄快递类似
- 首先找一个跑腿小哥(相当于用户代理)帮你去寄东西,你要先把发件人收件人信息填好(邮箱地址)
- 跑腿小哥将你的东西拿到寄件处(邮件服务器)准备邮寄
- 寄件处帮你把物品寄出去,通过物流(相当于传输协议)运往目的地
- 物品到达收件人的寄件处(对方的邮件服务器)
- 收件人也叫了一个跑腿小哥(对方的用户代理)将东西取回来
用户代理:用户和电子邮件系统的接口
用户代理简单来说就是一个程序,如QQ邮箱、Outlook等。通常具有撰写、显示和处理邮件的功能
邮件服务器:用于发送和接受邮件,先发信人报告邮件传送的情况 ,一个邮件服务器可能有多个代理
是电子邮件体系结构的核心。它采用C/S结构, 但它必须要能够同时充当服务器和客户端
邮件服务器有两个功能:
- 邮箱:存储发给该用户的Email
- 消息队列(message queue):存储等待发送的Email
简单邮件传输协议:用于完成邮件在邮件服务器之间的传输
SMTP是因特网电子邮件中主要的应用层协议,邮件服务器之间传递消息所使用的协议
一个典型的邮件发送的例子是:
- 发送方通过用户代理将邮件传输到A用户的邮件服务器
- 再由A的邮件服务器传输到B的邮件服务器
- 然后该邮件被分发到接受方的邮箱中
通常,如果发送方的服务器不能完成邮件的传输,那么邮件就在发送方的邮件服务器的消息队列中排队,一段时间后(一般是30分钟)再尝试发送
2. SMTP(邮件发送协议)
2.1 SMTP的特征
SMTP协议定义在[RFC 5321]中,用于从发送方的邮件服务器发送报文到接受发的邮件服务器,它最典型的特征有:
- 使用TCP进行email消息的可靠传输
- 端口25
- 传输过程的三个阶段——握手、消息传输、关闭
- Email消息只能包含7位ASCII码
- 使用命令/响应交互模式
命令(command): ASCII文本
响应(response): 状态代码和语句
2.2 SMTP的基本操作
举一个例子来描述SMTP的基本操作,假设左边的用户是Alice,右边的用户是Bob:
- Alice首先通过她的用户代理写了一封邮件,并且在邮件中填上Bob的邮件地址
- 然后这封邮件被用户代理发送到Alice的邮件服务器上,这一过程中这封邮件需要在服务器中排队
- Alice邮件服务器上的SMTP客户端在报文队列中发现有邮件要发送,与Bob的邮件服务器建立一条TCP连接
- 经过一些SMTP握手后,SMTP客户端通过该TCP连接发送邮件
- 邮件被传送到Bob的邮件服务器上
- Bob随时可以来读取邮件
值得注意的是:
SMTP一般不使用中间邮件服务器发送邮件,也就是说即使邮件的发送者和接收者相距再远,中间所隔的网络再复杂,SMTP也总是倾向于建立起一条直连发送方和接受方的TCP连接
2.3 SMTP协议的基本流程
SMTP将一个报文从发送邮件服务器传送到接收邮件服务器的过程:
1️⃣ 客户SMTP(运行在发送邮件服务器主机上)在25号端口,建立一个到服务器SMTP(运行在接受邮件服务器主机上)的TCP连接
2️⃣ SMTP的客户和服务器在传输信息前要向对方“打招呼并先介绍自己”,在SMTP的握手阶段,SMTP客户指示发送方的邮件地址和接受发的邮件地址SMTP的客户和服务器彼此介绍后,客户发送报文
3️⃣ 如果SMTP客户还有别的邮件要发送到这台服务器,就继续发送,否则关闭TCP连接
2.4 SMTP交互与应答
SMTP交互与应答整体过程
💠 首先,当TCP连接建立后,最开始由接受方邮件服务器进行交互,发送一条服务就绪应答给客户邮件服务器,应答代码为220
💠 SMTP客户收到该应答后,以HELO(HELLO的缩写)进行应答,同时带上自己的域名
💠 SMTP服务器若认为身份有效,则发回应答代码:250
💠 SMTP客户收到该应答后,使用命令 MAIL FROM 来告诉服务器该邮件来自何方,用MAIL FROM指明发件人邮箱地址
💠 服务器认为命令合理,则发回应答代码:250
💠 SMTP客户收到该应答后,使用命令 RCPT TO 告诉服务器邮件去往何地,也就是收件人邮箱
💠 服务器中若有该收件人邮箱(确认是否存在代理),则发回应答代码250
💠 SMTP客户收到该应答后,使用 DATA 命令来告诉服务器自己准备发送邮件内容了
💠 SMTP服务器准备对该邮件进行接受,发回应代码:354
💠 SMTP客户收到该应答,发送邮件
💠 最后发送结束符CRLF.CRLF来结束邮件的发送
💠 服务器成功收到邮件,应答:250
💠 SMTP客户收到该应答后,使用命令 QUIT 向服务器请求断开连接
💠服务器发回应答代码 221表示接受请求并主动断开连接
下面给出一个SMTP客户(以C代表)和一个SMTP服务器(以S代表)之间交换报文文本的例子
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 (服务器断开连接)
2.5 SMTP与HTTP的对比
SMTP | HTTP | |
连接方式 | 持续连接 | 持续连接 |
获取信息方式 | 推式(PUSH) | 拉式(PULL) |
交互模式 | 命令/响应 | 命令/响应 |
命令和状态码 | ASCII码 | ASCII码 |
对象的封装 | 多个对象在由多个 部分构成的消息中发送 | 每个对象封装在独 立的响应消息中 |
3. 邮件报文格式与MIME
3.1 电子邮件格式
一个电子邮件分为信封和内容两大部分,邮件内容又分为首部和主体两部分
- [RFC 5322]规定了邮件的首部格式,用户要按照格式填写首部内容
- 主体部分由用户自由撰写(邮件正文)
- 信封无需用户填写,邮件系统自动从用户填写的首部中提取所需信息并写在信封上
一个典型的邮件内容首部如下
From: alice@crepes.fr
To: bob@hamburger.edu
Subject: Searching for the meaning of life.
邮件内容的首部包含一些首部行,格式为 [关键字 :值],有些关键字是必须的,有些是可选的。最重要的是To:和Subject:
- To是必需的关键字,后面填入一个或多个收件人的邮件地址,电子邮件地址的规定格式为:收件人邮箱名@邮箱所在主机的域名,如abc@mail.com,其中收件人邮箱名即用户名,abc在mail.com这个邮件服务器上必须是唯一的
- Subject是可选关键字,是邮件的主题,反应了邮件的主要内容
- From也是必需的关键字,但它由邮件系统自动填入
首部和报文主体之间由空行进行分隔,报文主体以ASCII格式表示
3.2 多用途网际邮件扩充-MIME
MIME-多用途网际邮件扩充(Multipurpose Internet Mail Extensions)定义在[RFC 2045, 2056],用于解决SMTP只能传输7位ASCII码的问题
SMTP只能传输一定长度的ASCII码邮件,对于其他国家的文字、二进制文件和可执行文件都无法传送,MIME就是对SMTP的一种扩展,它并没有改变SMTP或取而代之,相反它继续使用SMTP的格式,但增加了邮件的主体结构,并定义了传送非ASCII码的编码规则
MIME通过在邮件首部增加额外的行以声明MIME的内容类型
MIME主要包括以下三部分内容
- 5个新的邮件首部字段——MIME版本、内容描述、内容标识、传送编码和内容类型
- 定义了许多邮件内容的格式,对多媒体电子邮件的表示方法进行了标准化
- 定义了传输编码,可对任何内容格式进行转换,而不会被邮件系统改变
MIME是工作在SMTP之上的,对于非ASCII码的内容,先通过MIME以一定编码规则转化成ASCII码,再交由SMTP传送,在接受端的MIME中被还原
实际上,MIME不仅仅用于SMTP,也用于后来的同样面向ASCII字符的HTTP
4. 邮件访问协议
SMTP完成的是发送方的用户代理→发送方邮件服务器,发送方邮件服务器到接受方邮件服务器之间的传送,接受方用户从自己的邮件服务器中将邮件取回本地则使用邮件访问协议
4.1 POP3
邮局协议(Post Office Protocol, POP)是一个非常简单但功能有限的邮件读取协议,由[RFC 1939]定义,现在使用的是它的第三个版本POP3
当用户代理(客户)打开一个到邮件服务器端口110上的TCP连接后,POP3就开始工作了,分为三个阶段
- 特许( authorization ):用户代理以明文形式发送用户名和口令以鉴别用户(我理解为输入用户名和密码进行登录)
- 事务处理( transaction ):用户从邮件服务器取回报文
- 更新( update ):出现在客户发出quit命令之后,目的是结束POP3会话并删除一删除标记的邮件
POP3的主要特征
- 采用"PULL"拉式进行通信,拉取用户邮箱中的邮件
- 使用C/S结构,在传输层使用TCP,端口号为110
- POP3是无状态的
- 有两种工作方式 —— “下载并保留” 和 “下载并删除”
下载并删除:用户如果换了客户端软件,无法重读该邮件
下载并保留:不同客户端都可以保留消息的拷贝
但正是由于POP3的简单性,使得它无法完成更多功能,如不允许用户在邮件服务器上管理自己的邮件(例如创建文件夹,对邮件进行分类管理等)
4.2 IMAP
因特网报文存取协议(Internet Message Access Protocol, IMAP),由[RFC 3501]定义,主要解决了POP3无法为用户提供在远程服务器管理邮件服务的问题
IMAP与POP3有许多相似的地方,例如它们都使用TCP连接,都使用客户-服务器结构,但IMAP比POP3复杂得多,因此功能也更强大,它为用户提供了创建文件夹、在不同文件夹之间移动邮件以及在远程文件夹中查询邮件等联机命令,为此IMAP服务器维护了会话用户的状态信息
IMAP的另一特性是允许用户代理只获取报文的某些部分,例如可以指读取一个报文首部,或多部分MIME报文的一部分,这尤其适用于低带宽的情况
IMAP的主要特点有
- 所有消息统一保存在一个地方:服务器
- 允许用户利用文件夹组织消息
- 支持跨会话(Session)的用户状态:文件夹名字,文件夹与消息ID之间的映射
4.3 基于Web的电子邮件
随着万维网的流行,目前出现了许多基于万维网的电子邮件,如Hotmail、Gmail等
使用这种电子邮件相较于前面所说的有两种改变
- 用户代理由邮件客户端程序变成了普通的浏览器
- 用户和本地邮箱服务器之间的通信通过HTTP进行
发送方的用户代理(浏览器)将邮件传送到发送方的邮件服务器时,使用的是HTTP而非SMTP;接受发从接受发的邮件服务器将邮件读取到本地也使用HTTP而非POP3或IMAP,但在邮箱服务器与邮箱服务器之间进行的传送,总是使用SMTP
最终,我们所得到的电子邮件传送过程可表示为