电子邮件
电子邮件在互联网诞生之初就是最受欢迎的应用之一。
用户-服务器模型。三个组分:
- 用户代理(user agent):类似于前端,用于撰写,编辑,阅读邮件
- 邮件服务器(mail server),维护邮箱(mailbox)与消息队列(message queue)
- 协议
如果邮件服务器运行在本地主机上,那么为了接收随时可能到达的新邮件,本地主机必须始终在线并保持互联网连接;这对于很多用户而言并不现实。因此,典型的做法是用户在本地主机上运行用户代理,但通过一台始终在线的共享邮件服务器使用存放在其中的邮箱与消息队列。
SMTP
简单邮件传输协议(Simple Mail Transfer Protocol, SMTP)。
发送邮件的邮件服务器是 SMTP 用户(SMTP client),接受邮件的邮件服务器是 SMTP 服务器(SMTP server)。

- Alice 启动她的用户代理,撰写并发送邮件
- Alice 的用户代理将邮件发送至她的邮件服务器,放入消息队列中
- 运行在 Alice 邮件服务器上的 SMTP 客户端看到消息队列中的这封邮件后,与运行在 Bob 邮件服务器上的 SMTP 服务器端建立一条 TCP 连接
SMTP 握手 后,SMTP 客户端将 Alice 的邮件通过 TCP 连接发送出去- 运行在 Bob 邮件服务器上的 SMTP 服务器端接受该邮件,放入邮箱(mailbox)
- Bob 在方便时启动他的用户代理读取这封邮件
注意一:SMTP 直接在发送者与接收者的邮件服务器间建立连接,不使用中间服务器
注意二:SMTP 握手阶段
- 服务器端问候:
S: 200 [server host name] - 客户端打招呼:
C: HELO [client host name] - 服务器端确认:
S: 250 Hello [client], pleased to meet you - 客户端声明发件者:
C: MAIL FROM: <sender_address> - 服务器端确认:
S: 250 sender_address ... Sender ok - 客户端声明收件者:
C: RCPT TO: <recipient_address> - 服务器端确认:
S: 250 recipient_address ... Recipient ok
注意三:SMTP 传输阶段
- 客户端声明开始传输:
C: DATA - 服务器端确认:
S: 354 Enter mail - 客户端开始传输:
C: XXX C: YYYC: ZZZ- 客户端传输完毕,使用句点
.标识传输结束C: . - 服务器端确认传输完毕:
S: 250 Message accepted by delivery
注意四:SMTP 结束阶段
- 客户端声明关闭连接:
C: QUIT - 服务器端关闭连接:
S: 221 [server] closing connection
一些 SMTP 命令:HELO, MAIL FROM, RCPT TO, DATA, QUIT。
邮件消息的格式
邮件消息,即客户端在 DATA 后传输的数据内容 [XXX, YYY, ZZZ, ...] 所需要遵循的格式。
邮件头:
Date:From:To:Subject:- …
[空行]
[正文](ASCII 格式)
邮件访问协议
SMTP 协议规定了邮件如何从用户代理提交到发送方邮件服务器,以及如何将其继续推送(push)至接收方邮件服务器;至于 Bob 的用户代理如何从邮件服务器上拉取(pull)邮件,则通常由邮件访问协议(mail access protocol)来规定。
邮局协议(Post Office Protocol, POP3),无状态
- 认证(authorization)阶段
user,pass,服务器响应+OK,-ERR - 事务(transaction)阶段:
list查询消息列表,retr拉取对应消息,dele标记删除消息,quit。「下载后删除」(download-and-delete)模式:读取一条消息就标记删除一条消息。 - 更新(update)阶段:邮件服务器真正删除事务阶段中被
dele标记删除的消息
互联网邮件访问协议(Internet Mail Access Protocol, IMAP),有状态,支持将消息组织在文件夹中
HTTP:Web-based 电邮的访问协议。Web-based 电邮从用户代理提交到发送方邮件服务器使用 HTTP 协议,将其继续推送至接收方邮件服务器使用 SMTP 协议,接收方的用户代理从邮件服务器上拉取邮件仍使用 HTTP 协议。