目录
一、电子邮件
Internet 电子邮件系统的组成:
- 用户代理(user agents)
- 邮件服务器(mail servers)
- 简单邮件传送协议 SMTP 和邮件接收协议
1、用户代理
1)用户代理允许用户阅读、回复、转发、保存和撰写邮件消息。
- 如:Outlook、基于 web 的 Gmail 和运行在智能手机上的 Gmail 客户端等
2)用户代理将邮件消息发送到服务器,并从服务器接收邮件消息。
- 当 A 完成邮件撰写时,A 的邮件代理向其邮件服务器发送邮件
- 当 B 要阅读报文时,B 的用户代理在其邮件服务器的邮箱中取得该报文
邮件服务器将接收到的待发送的邮件放在自己的外出报文队列中
3)运行邮件协议。
2、邮件服务器
1)邮箱(mailbox)
- 用于存放邮件接收方接收的邮件信息
- 每个邮件接收方都在邮件服务器上有一个邮箱
上述的 B 就是一个邮件接收方
2)外出报文队列(outgoing message queue)
当 A 的服务器不能将邮件交付给 B 的服务器时,A 的服务器在外出报文队列中保持该报文并在以后尝试再次发送。通常每 30 分钟左右进行一次尝试,如果几天后仍不能成功,服务器就删除该报文并以电子邮件的形式通知发送方 A 。
3、SMTP
全称 simple mail transfer protocol:
- 是 Internet 电子邮件系统中的主要应用层协议
- 使用 TCP 的可靠数据传输服务
SMTP 也有两个部分:
- 运行在发送方邮件服务器的客户端
- 运行在接收方邮件服务器的服务器端
每台邮件服务器上既运行 SMTP 的客户端也运行 SMTP 的服务器端
1)直接传送
是指 SMTP 一般不使用中间邮件服务器发送邮件,都是直接从发送服务器到接收服务器。
2)保密性
因为 SMTP 一般不使用中间邮件服务器发送邮件。
3)传输的三个阶段:
- 握手/问候
- 邮件消息的传输
- 结束
4)命令/应答的交互
- 命令采用 7 比特 ASCII 文本格式
- 应答包含状态码及其短语
限制所有邮件报文的首部行和体部分采用简单的 7 比特 ASCII 表示。如:传送前需要将二进制多媒体数据编码为 ASCII 码,并且在使用 SMTP 传输后要求将相应的 ASCII 码邮件解码还原为多媒体数据。
4、发送邮件举例
① yujin 使用用户代理撰写邮件消息,准备发给 minju(minju@izone.edu);
② yujin 的用户代理将邮件消息发到她的邮件服务器,邮件消息存放在外出报文队列中;
③ yujin 邮件服务器的 SMTP 客户端发起建立一个到 minju 的邮件服务器的 SMTP 服务器端的 TCP 连接,经过一些初始 SMTP 握手(在应用层);
④ SMTP 客户端在这个 TCP 连接上发送 yujin 的邮件消息;
⑤ minju 的邮件服务器将邮件消息存放到 minju 的邮箱中;
⑥ 在 minju 音中下班的时候,她调用用户代理阅读邮件消息。
邮件服务器接收到用户代理发来的邮件消息时,将会识别接收者的邮件地址:若其邮件服务器与自身不同,则转发该邮件消息;否则,将邮件消息存放在接收者的邮箱中即可。
二、SMTP
1、SMTP 命令交互
假设:
- 客户的主机名:crepes.fr
- 服务器的主机名:hamburger.edu
一旦创建了 TCP 连接,就开始了下列过程。
- 以 “C: ” 开头的 ASCII 码文本行是客户交给其 TCP 套接字的那些行。
- 以 “S: ” 开头的 ASCII 码文本行是服务器发送给其 TCP 套接字的那些行。
下述内容源自命令行窗口。
/* 创建TCP连接 */
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、SMTP 总结
- SMTP 使用持久连接
- SMTP 要求邮件消息必须是 7 比特 ASCII
- SMTP 服务器使用 CRLF.CRLF 来判断邮件消息的结束
如果发送邮件服务器有几个报文发往同一个接收邮件服务器,它可以通过同一个 TCP 连接发送所有这些报文。对每个报文,该客户用一个新的 “mail from: <alice@crepes.fr>” 开始,用一个独立的句点指示该邮件的结束,并且仅当所有邮件发送完后才发送 quit 。
(简答题) 与 HTTP 的比较:
- HTTP 是拉协议,SMTP 是推协议
- 都有 ASCII 形式的命令/应答交互以及状态码
- HTTP:每个对象封装在它各自的 HTTP 响应消息中发送
- SMTP:一个邮件内各个对象置于同一个邮件消息的多目部分发送
三、邮件报文格式
1、邮件消息的基本格式
SMTP:用来交换邮件消息的协议。
一个典型的报文首部看起来如下:
from: alice@crepes.fr
to: bob@hamburger.edu
subject: searching for the meaning of life.
RFC 822:文本邮件消息格式标准。
- 信头/首部行:不同于 SMTP 命令!
- 信体/体:必须是 ASCII 字符。
上一小节的 mail from 是 SMTP 握手协议的一部分,这里的报文首部行虽然有 from,但它是邮件报文自身的一部分。
2、邮件消息的多媒体扩展格式
MIME:Multipurpose Internet mail Extensions,多用途因特网邮件扩展 [RFC 2045, 2046]
增添额外的信头头部声明 MIME content-type 。
From: alice@crepes.fr
To: bob@hamburger.edu
Subject: Picture of yummy crepe.
MIME-Version: 1.0 // MIME版本
Content-Transfer-Encoding: base64 // 编码方式
Content-Type: image/jpeg // 多媒体数据类型名/子类型名
base64 encoded data ..... // 编码后的数据
.........................
......base64 encoded data
SMTP 命令都是自解释的,而邮件信息内容由应用程序来解释。
3、邮件访问协议
邮件访问协议 e-mail access protocol
- SMTP:发送/存储邮件消息到接收者邮件服务器。
- 邮件访问协议:从邮件服务器获取邮件消息。
SMTP 更像是一种邮件传输协议(?)
1)POP3
Post Office Protocol,邮局协议 [RFC 1939]
- 采用端口:110
- 进行身份认证并下载邮件消息到本地
- 不支持用户远程操纵邮箱消息
2)IMAP
Internet Message Access Protocol,因特网邮件访问协议 [RFC 3501]
- 采用端口:143
- 具有更多功能特征,也更复杂
- 允许用户像对待本地邮箱那样操纵远程邮箱的邮件
3)HTTP
- 采用端口:80
- 基于 Web 的电子邮件或智能手机上的客户端
- 允许用户像对待本地邮箱那样操纵远程邮箱的邮件