应用层——电子邮件(SMTP、POP3、IMAP)
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
目录
1. 电子邮件系统及组成结构
1.1 电子邮件
电子邮件自因特网诞生以来已经成为最为流行的应用程序时至今日仍然是最为重要和实用的互联网应用之一
与普通邮件一样电子邮件是一种异步通信方式不像电话等通信方式必须通信双方同时在场发送方可以在任意时间发送邮件接收方也可以在任意时间接收邮件
电子邮件较普通邮件更为快速而且易于分发价格便宜。现代电子邮件具有许多强大的特性包括具有附件、超链接、HTML格式文本和图片的报文
1.2 电子邮件系统的组件
一个电子邮件系统的组成构件
主要有三个组成部分
- 用户代理(user agentsUA)
- 邮件服务器(mail servers)
- 简单邮件传输协议(Simple Mail Transfer ProtocolSMTP)
电子邮箱的工作方式和寄快递类似
- 首先找一个跑腿小哥相当于用户代理帮你去寄东西你要先把发件人收件人信息填好邮箱地址
- 跑腿小哥将你的东西拿到寄件处邮件服务器准备邮寄
- 寄件处帮你把物品寄出去通过物流相当于传输协议运往目的地
- 物品到达收件人的寄件处对方的邮件服务器
- 收件人也叫了一个跑腿小哥对方的用户代理将东西取回来
用户代理用户和电子邮件系统的接口
用户代理简单来说就是一个程序如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
最终我们所得到的电子邮件传送过程可表示为