Skip to main content

3. The SMTP Procedures: An Overview (SMTP过程概述)

本节提供SMTP操作的概述,涵盖会话初始化、邮件事务、地址验证、中继、网关处理和会话终止等关键过程。

3.1. Session Initiation (会话初始化)

SMTP会话由发送SMTP (客户端) 与接收SMTP (服务器) 建立的双向传输通道启动。该通道是完全异步的,没有数据流限制。完成TCP连接后,服务器通常会发送一个"220 Service ready"(服务准备就绪) 应答。客户端通常在收到此问候之后启动操作。

3.2. Client Initiation (客户端初始化)

一旦传输服务提供了初始化通道,并且服务器发送了220服务就绪问候,客户端通常会发送EHLO命令以标识自己并请求服务器通知任何可用的服务扩展。如果服务器不支持扩展,它将以500错误响应EHLO,客户端则应回退到HELO命令。

EHLO命令示例:

S: 220 smtp.example.com ESMTP Postfix
C: EHLO client.example.com
S: 250-smtp.example.com
S: 250-SIZE 52428800
S: 250-8BITMIME
S: 250-STARTTLS
S: 250 HELP

3.3. Mail Transactions (邮件事务)

邮件事务由一系列命令组成,这些命令传输消息从客户端到服务器。邮件事务包含:

  1. MAIL命令 - 标识消息发起者
  2. 一个或多个RCPT命令 - 标识消息收件人
  3. DATA命令 - 传输消息内容

完整事务示例:

C: MAIL FROM:<[email protected]>
S: 250 Ok
C: RCPT TO:<[email protected]>
S: 250 Ok
C: RCPT TO:<[email protected]>
S: 250 Ok
C: DATA
S: 354 End data with <CR><LF>.<CR><LF>
C: From: [email protected]
C: To: [email protected]
C: Subject: Test message
C:
C: This is a test message.
C: .
S: 250 Ok: queued as 12345

MAIL命令开始邮件事务。成功完成此命令后,接收方清除其所有缓冲区和状态表,并准备接收RCPT命令。

RCPT命令标识该邮件的单个收件人。可以为给定消息发出多个RCPT命令。成功的RCPT命令将收件人添加到缓冲区中。

DATA命令导致将后续行视为消息文本而不是命令。消息以仅包含句点 (.) 的行终止。

3.4. Forwarding for Address Correction or Updating (地址更正或更新的转发)

某些服务器可能希望将邮件转发到更正或更新的地址,而不是原始收件人地址。SMTP为此目的提供了251和551应答代码。这些代码允许服务器通知客户端用户地址已更改,但服务器将尝试转发 (251) 或无法转发 (551) 消息。

3.5. Commands for Debugging Addresses (用于调试地址的命令)

3.5.1. Overview (概述)

SMTP提供了两个命令用于验证用户名和邮件列表:

  • VRFY - 验证用户名或邮箱
  • EXPN - 扩展邮件列表

这些命令主要用于调试目的,许多服务器出于安全和隐私原因禁用或限制它们。

3.5.2. VRFY Normal Response (VRFY正常响应)

VRFY命令的成功响应通常为250代码,后跟包含用户全名和邮箱地址的文本。

示例:

C: VRFY Jones
S: 250 Fred Jones <[email protected]>

3.5.3. Meaning of VRFY or EXPN Success Response (VRFY或EXPN成功响应的含义)

VRFY和EXPN命令的成功响应并不保证该地址可以接收邮件或邮件将被传递。它仅表示该地址在服务器已知并且语法有效。

3.5.4. Semantics and Applications of EXPN (EXPN的语义和应用)

EXPN命令用于扩展邮件列表或别名。它返回列表中的所有地址。

示例:

3.6. Relaying and Mail Routing (中继和邮件路由)

3.6.1. Source Routes and Relaying (源路由和中继)

历史上,SMTP支持源路由,允许发送方指定邮件应该经过的中间主机。然而,源路由已被弃用,现代SMTP实现不应该 (SHOULD NOT) 生成源路由,并且应该 (SHOULD) 忽略接收到的源路由信息。

3.6.2. Mail eXchange Records and Relaying (邮件交换记录和中继)

当SMTP客户端需要向目标域传输邮件时,它应该 (SHOULD) 首先尝试通过DNS查找该域的MX (Mail eXchanger) 记录。MX记录标识负责接收该域邮件的主机,按优先级排序。

客户端应该 (SHOULD) 首先尝试优先级最低 (数字最小) 的MX主机。如果该主机不可用,客户端应该 (SHOULD) 尝试具有下一个最低优先级的MX主机,依此类推。如果没有MX记录存在,客户端应该 (SHOULD) 尝试使用该域的A或AAAA记录。

3.6.3. Message Submission Servers as Relays (作为中继的消息提交服务器)

消息提交服务器是接受来自邮件用户代理 (MUA) 的邮件并将其转发到目标或中间中继的特殊类型的SMTP服务器。提交服务器通常需要身份验证,并可能对消息应用额外的策略或修改。详细信息参见RFC 4409。

3.7. Mail Gatewaying (邮件网关)

网关系统在不同的消息传输环境之间传输邮件。网关可能需要执行协议转换、地址重写或消息格式转换。

3.7.1. Header Fields in Gatewaying (网关中的头字段)

网关必须 (MUST) 保留消息头字段的含义和完整性,即使需要转换格式。

3.7.2. Received Lines in Gatewaying (网关中的Received行)

网关必须 (MUST) 在消息头部添加"Received:"头字段,记录网关处理。

3.7.3. Addresses in Gatewaying (网关中的地址)

网关在转换地址时必须 (MUST) 确保地址保持可路由。

3.7.4. Other Header Fields in Gatewaying (网关中的其他头字段)

网关应该 (SHOULD) 保留所有头字段,即使它们在目标环境中没有直接等价物。

3.7.5. Envelopes in Gatewaying (网关中的信封)

网关必须 (MUST) 保留SMTP信封信息的含义,即使必须使用不同的机制表示。

3.8. Terminating Sessions and Connections (终止会话和连接)

SMTP会话通过QUIT命令正常终止:

C: QUIT
S: 221 smtp.example.com Service closing transmission channel

收到QUIT命令后,服务器发送221应答并关闭传输通道。客户端在发送QUIT后应该 (SHOULD) 等待221应答,然后再关闭其连接端。

服务器也可以 (MAY) 由于超时或其他错误条件而关闭连接,在这种情况下,它应该 (SHOULD) 尝试发送421应答。

3.9. Mailing Lists and Aliases (邮件列表和别名)

3.9.1. Alias (别名)

别名 (alias) 是扩展为单个邮箱或多个邮箱的本地名称。别名扩展对SMTP客户端是透明的。

3.9.2. List (列表)

邮件列表 (mailing list) 是扩展为多个收件人地址的地址。当消息发送到邮件列表时,列表管理软件通常会为列表中的每个订阅者创建单独的消息副本。

邮件列表处理可能涉及消息修改 (例如,添加列表页脚或主题标签),这些修改超出了本规范的范围,但应符合RFC 5322和相关消息格式标准。