前言
电子邮件在很长一段时间是最重要的互联网应用。或许现在我们感受不到,也很少发邮件,因为现在很多即时通信软件:QQ、微信等等。
在互联网之初,人们相互通信,大部分是通过发送邮件,所以谈谈因特网中的电子邮件协议是很重要的。
电子邮件的组成部分
电子邮件通信主要由三大部分组成:
- 用户代理
- 邮件服务器
- 邮件协议
一、用户代理 user agents
就像我们常常使用的邮箱客户端,我们能直接接触的部分
-
允许用户阅读,回复,转发,保存,编辑邮件消息
-
例如:Outlook, foxmail等
-
发送, 接收邮件消息到/从服务器
-
运行邮件协议
二、邮件服务器 mail servers
- 邮箱mailbox 存放用户接收的邮件消息
- 外出报文队列outgoing message queue
- 运行邮件协议
三、邮件协议
分类
- 简单邮件传输协议
- 邮件接收协议
SMTP [RFC 5321] 简单邮件传输协议
Simple Mail Transfer Protocol
-
客户使用TCP来可靠传输邮件消息到服务器
-
端口号
25
-
直接传送: 发送服务器到接收服务器
-
传输的3个阶段
- 握手 (问候)
- 邮件消息的传输
- 结束
命令/应答的交互
– 命令: ASCII文本格式– 应答: 状态码及其短语
邮件消息必须是7-bit ASCII
例子:Alice发送邮件消息到Bob
-
Alice使用用户代理编写邮件消息(给bob@someschool.edu的)
-
Alice的用户代理发送邮件消息 到她的邮件服务器;邮件消息存放在邮件消息队列
-
Alice邮件服务器的SMTP客户端发起建立一个到Bob的邮件服务器的SMTP服务器端的TCP连接,经过应用层握手.
-
SMTP客户在这个TCP连接上发送Alice的邮件消息
-
Bob服务器存放邮件消息存到 Bob的邮箱
-
Bob调用他的用户代理读邮件消息
SMTP总结
- SMTP使用持久连接
- SMTP 要求邮件消息 (header & body)必须 是7-bit ASCII
- SMTP服务器使用 CRLF.CRLF 来判断邮件消息的结束
与HTTP的比较:
- HTTP: 拉协议
- SMTP: 推协议
- 都有ASCII 命令/应答交互, 状态码
- HTTP: 每个对象封装在它各自的 HTTP响应消息中发送
- SMTP: 一个邮件内各个对象置于同一 个邮件消息的多目部分发送
邮件消息的格式
-
信头-头部行。如:
-
To: line
-
From:
-
Subject:
这些头部不同于SMTP命令!
-
-
信体
- 邮件消息也必须是ASCII字符
有人问信体是中文怎么办,包括之前谈到的HTTP协议,默认的都是ASCII?
这时候就出现了MIME,在请求头部添加头部就能转换编码等等其他功能,大大扩展了功能。
邮件访问协议
当通过SMTP协议将邮件传送到目的地的邮件服务器处时,接收方如何通过用户代理访问自己的邮件呢?
这里就需要邮件访问协议
邮件访问协议: 从服务器获取邮件消息
-
POP: Post Office Protocol 邮局协议[RFC 1939]
- 110端口号
- 身份认证 (代理 <–>服务器) 并下载邮件消息
-
IMAP: Internet Message Access Protocol [RFC 3501]
-
143端口
-
更多功能特征 (更复杂!)
-
允许用户像对待本地邮箱那样操纵远程邮箱的邮件
-
-
HTTP: Hotmail , Yahoo! Mail, etc.
POP3协议
-
身份认证阶段
authorization phase
-
客户命令:
- user username
- pass password
-
服务器响应
- +OK
- -ERR
-
-
传输阶段
transaction phase, client:
-
list: 列出邮件编号
-
retr: 按编号取邮件
-
dele: 删除
-
quit
-
POP3 和 IMAP
POP3的更多细节
- 先前例子使用 “Download-and-delete”.
- Bob换客户端后不能再读邮件
- “Download-and-keep”模式: 在不同客户机上的邮件拷贝
- POP3的会话是无状态的
IMAP
- 保存所有邮件消息在一个位 置: 服务器
- 允许用户在服务器的各文件 夹中管理邮件消息
- IMAP跟踪用户会话的状态 信息 :
- 文件夹和邮件消息IDs与 文件夹名字的映射
希望通过这篇文章你能明白邮件是如何实现的