跳到主要内容

2. SMTP 模型 (The SMTP Model)

2.1. 基本结构 (Basic Structure)

SMTP 设计可以表示如下:

                  +----------+                +----------+
+------+ | | | |
| User |<-->| | SMTP | |
+------+ | Client- |Commands/Replies| Server- |
+------+ | SMTP |<-------------->| SMTP | +------+
| File |<-->| | and Mail | |<-->| File |
|System| | | | | |System|
+------+ +----------+ +----------+ +------+
SMTP client SMTP server

当 SMTP 客户端有消息要传输时, 它会与 SMTP 服务器建立双向传输信道. SMTP 客户端的责任是把邮件消息传输到一个或多个 SMTP 服务器, 或者报告无法完成传输.

邮件消息如何呈现给 SMTP 客户端, 以及该客户端如何确定邮件消息应传输到哪些域, 都属于本地问题, 本文档不予规定.

无论目标域为何都转发全部流量的 SMTP 客户端, 或不维护队列以重试消息传输的 SMTP 客户端, 可以符合本规范, 但不视为功能完整. 功能完整的 SMTP 实现预期支持本规范讨论的所有排队, 重试和备用地址功能.

SMTP 服务器可以是最终目的地, 也可以是中间 "relay" (收到消息后承担 SMTP 客户端角色), 或 "gateway" (使用 SMTP 以外的协议传输消息). SMTP 命令由 SMTP 客户端生成并发送给 SMTP 服务器. SMTP 响应由 SMTP 服务器针对命令发送给 SMTP 客户端.

一旦服务器在邮件数据结束处发出成功响应, 就发生正式的责任交接: 协议要求服务器必须承担投递该消息或正确报告投递失败的责任.

2.2. 扩展模型 (The Extension Model)

2.2.1. 背景 (Background)

从 1990 年开始, 该协议被修改为带有 "service extensions" 模型, 允许客户端和服务器同意使用超出原始 SMTP 要求的共享功能.

现代 SMTP 实现必须支持基本扩展机制. 即使服务器不实现任何特定扩展, 也必须支持 EHLO 命令; 客户端应优先使用 EHLO 而不是 HELO. 不过, 为了与较旧的合规实现兼容, SMTP 客户端和服务器必须支持原始 HELO 机制作为 fallback.

2.2.2. 扩展的定义和注册 (Definition and Registration of Extensions)

SMTP 扩展机制定义了一种方式, 使扩展 SMTP 客户端和服务器能够相互识别, 并使服务器能够告知客户端它支持哪些服务扩展.

2.2.3. 扩展的特殊问题 (Special Issues with Extensions)

扩展不得改变基本 SMTP 模型, 并且必须与现有标准向上兼容.

2.3. SMTP 术语 (SMTP Terminology)

2.3.1. 邮件对象 (Mail Objects)

SMTP 传输由以下部分组成的邮件对象:

  • 包含传输参数的 envelope
  • Header section
  • Body (content)

2.3.2. 发送者和接收者 (Senders and Receivers)

发起邮件消息的一方称为 "sender" 或 "originator". 邮件被投递到的一方称为 "receiver" 或 "recipient".

2.3.3. 邮件代理和消息存储 (Mail Agents and Message Stores)

Mail User Agent (MUA): 提供读取和编写邮件的用户界面.

Mail Submission Agent (MSA): 从 MUA 接收消息并执行本地站点策略.

Mail Transfer Agent (MTA): 将邮件从一个系统传输到另一个系统.

Mail Delivery Agent (MDA): 将邮件投递到接收者的邮箱.

2.3.4. 主机 (Host)

连接到 Internet 或其他网络的计算机系统.

2.3.5. 域名 (Domain Names)

域名遵循 RFC 1034, RFC 1035 和 RFC 1123 中的说明.

2.3.6. 缓冲区和状态表 (Buffer and State Table)

SMTP 会话是有状态的. 服务器必须记住会话信息以及协议当前状态.

2.3.7. 命令和响应 (Commands and Replies)

命令是客户端发送给服务器的请求. 响应是服务器发送给客户端的应答.

2.3.8. 行 (Lines)

SMTP 数据以 CRLF (Carriage Return, Line Feed: \r\n) 终止的行传输.

2.3.9. 消息内容和邮件数据 (Message Content and Mail Data)

消息内容使用 DATA 命令传输. 邮件数据的结束由只包含一个句点 (.) 的行表示.

2.3.10. 发起, 投递, 中继和网关系统 (Originator, Delivery, Relay, and Gateway Systems)

  • Originator: 创建原始消息
  • Delivery: 最终目的地系统
  • Relay: 使用 SMTP 转发的中间系统
  • Gateway: 使用不同协议的中间系统

2.3.11. 邮箱和地址 (Mailbox and Address)

邮箱是电子邮件消息的目的地. 地址以 local-part@domain 形式指定邮箱位置.

2.4. 一般语法原则和事务模型 (General Syntax Principles and Transaction Model)

SMTP 命令和响应遵循特定语法规则:

  • 命令是 4 个字母的单词 (某些扩展为 8 个字母)
  • 响应是 3 位代码, 可带可选文本
  • 所有命令和响应均不区分大小写
  • 行不得超过指定长度限制

基本邮件事务包括:

  1. 建立连接
  2. 客户端问候 (EHLO/HELO)
  3. MAIL 命令 (指定发送者)
  4. RCPT 命令 (指定接收者, 可重复)
  5. DATA 命令 (传输消息)
  6. QUIT 命令 (关闭连接)