前言

电子邮件在很长一段时间是最重要的互联网应用。或许现在我们感受不到,也很少发邮件,因为现在很多即时通信软件:QQ、微信等等。

在互联网之初,人们相互通信,大部分是通过发送邮件,所以谈谈因特网中的电子邮件协议是很重要的。

电子邮件的组成部分

电子邮件通信主要由三大部分组成:

  1. 用户代理
  2. 邮件服务器
  3. 邮件协议

一、用户代理 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

  1. Alice使用用户代理编写邮件消息(给bob@someschool.edu的)

  2. Alice的用户代理发送邮件消息 到她的邮件服务器;邮件消息存放在邮件消息队列

  3. Alice邮件服务器的SMTP客户端发起建立一个到Bob的邮件服务器的SMTP服务器端的TCP连接,经过应用层握手.

  4. SMTP客户在这个TCP连接上发送Alice的邮件消息

  5. Bob服务器存放邮件消息存到 Bob的邮箱

  6. 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协议

  1. 身份认证阶段

    authorization phase

    • 客户命令:

      • user username
      • pass password
    • 服务器响应

      • +OK
      • -ERR
  2. 传输阶段

    transaction phase, client:

    • list: 列出邮件编号

    • retr: 按编号取邮件

    • dele: 删除

    • quit

POP3 IMAP

POP3的更多细节

  • 先前例子使用 “Download-and-delete”.
  • Bob换客户端后不能再读邮件
  • “Download-and-keep”模式: 在不同客户机上的邮件拷贝
  • POP3的会话是无状态的

IMAP

  • 保存所有邮件消息在一个位 置: 服务器
  • 允许用户在服务器的各文件 夹中管理邮件消息
  • IMAP跟踪用户会话的状态 信息 :
    • ​ 文件夹和邮件消息IDs与 文件夹名字的映射

希望通过这篇文章你能明白邮件是如何实现的