← RFC Reference

RFC 1869 – SMTP 服务扩展 (ESMTP)

Internet Standard Core SMTP & Message Format Published March 2026
ELI5: 原始SMTP就像两个只能说基础英语的人。ESMTP就像通过说"我还会说法语、德语和日语——你呢?"来开始对话。EHLO命令替代了HELO,让双方在开始交换邮件前发现他们共享的额外功能。每个现代SMTP功能——身份验证、加密、大小限制——都依赖这个协商机制。

为什么存在这个RFC

原始SMTP协议(RFC 821, 1982)没有添加新功能的机制。客户端无法发现服务器支持什么,服务器也无法通告功能。每个扩展都需要一个新的、不兼容的协议版本。

1995年发布的RFC 1869通过定义SMTP扩展的通用框架解决了这个问题。它引入了EHLO命令(扩展HELLO)作为HELO的替代品。当客户端发送EHLO时,服务器用一列它支持的扩展来响应。客户端然后可以使用双方都理解的任何扩展。

这个框架如此基础,以至于后来被直接纳入了RFC 5321中的基础SMTP规范。如今几乎每个SMTP会话都使用ESMTP——纯HELO实际上已过时。

工作原理

  1. 客户端连接并接收服务器的问候横幅。
  2. 客户端发送EHLO client.example.com(而不是旧的HELO)。
  3. 服务器用250及其主机名响应,然后每行一个扩展关键字。除了最后一行使用250 (最终),其他行都使用250-(继续)。
  4. 客户端检查扩展列表,仅使用服务器通告的功能。
  5. 如果服务器不理解EHLO(当今极其罕见),它返回500错误,客户端回退到HELO。

SMTP示例

典型的ESMTP能力协商:

S: 220 mx.example.com ESMTP ready C: EHLO sender.example.net S: 250-mx.example.com Hello sender.example.net S: 250-SIZE 52428800 S: 250-8BITMIME S: 250-STARTTLS S: 250-ENHANCEDSTATUSCODES S: 250-PIPELINING S: 250-CHUNKING S: 250-SMTPUTF8 S: 250 AUTH PLAIN LOGIN # 客户端现在确切知道这个服务器支持什么: # SIZE — 最大消息大小为50 MB # 8BITMIME — 允许8位内容传输编码 # STARTTLS — TLS加密可用 # ENHANCEDSTATUSCODES — RFC 3463状态码 # PIPELINING — 可以批处理命令(RFC 2920) # CHUNKING — BDAT命令可用(RFC 3030) # SMTPUTF8 — 国际化地址(RFC 6531) # AUTH — 使用PLAIN或LOGIN身份验证

关键技术细节

扩展注册表

ESMTP扩展向IANA注册。每个扩展定义一个关键字(例如STARTTLS、AUTH、PIPELINING)和可选参数。电子邮件最重要的扩展:

关键字 RFC 目的
SIZE RFC 1870 声明最大消息大小
8BITMIME RFC 6152 允许消息正文中的8位内容
STARTTLS RFC 3207 将连接升级到TLS加密
AUTH RFC 4954 SMTP身份验证
PIPELINING RFC 2920 批处理多个命令而无需等待
CHUNKING RFC 3030 使用BDAT进行二进制数据传输
SMTPUTF8 RFC 6531 国际化电子邮件地址
DSN RFC 3461 投递状态通知请求
ENHANCEDSTATUSCODES RFC 3463 响应中的详细状态码
REQUIRETLS RFC 8689 要求此消息的TLS

EHLO vs. HELO

HELO是1982年的原始SMTP问候。它不提供能力发现。EHLO是严格的超集:它执行相同的问候功能,但也触发能力列表。服务器必须支持两者,但客户端应始终首先尝试EHLO,仅在EHLO被拒绝时回退到HELO。

状态变化后重新EHLO

能力列表可在会话期间改变。在STARTTLS握手后,客户端必须发送新的EHLO,因为服务器可能在加密连接上通告不同的扩展(例如,AUTH通常仅在TLS后可用)。在RSET后,能力列表保持有效。

扩展参数

某些扩展在EHLO响应行上包括参数。例如,SIZE 52428800声明50 MB限制,AUTH PLAIN LOGIN列出可用的身份验证机制。扩展还可以向MAIL FROM和RCPT TO命令添加参数,如MAIL FROM:<user@example.com> SIZE=1048576。

常见错误

可投递性影响

Related RFCs