ESMTP 扩展是什么
用 EHLO 打招呼后,服务器会逐行列出自己支持的能力清单;客户端只能使用清单里声明过的扩展,遇到未声明或显示为 UNKNOWN 的项目必须退回基础行为(RFC 5321 §4.1.1.2)。自动化发信与客户端兼容问题,大多能靠这份清单提前发现。
为什么先看清单
发信失败时,先看服务器声明了哪些扩展往往比读错误码更快:没有 8BITMIME 就不要发 8 位正文,没有 AUTH 说明这个端口不该用来提交邮件,没有 SIZE 就别指望服务器会接受超大附件。
基本信息
| 触发命令 | EHLO 主机名 |
|---|---|
| 规范 | RFC 5321 §4.1.1.2、RFC 1869 |
| 读取方式 | 连接后先 EHLO,再逐行读取应答直至结束 |
| 硬性约束 | 未声明的扩展一律不可使用 |
典型使用场景
- 排查正文乱码:确认服务器是否声明 8BITMIME
- 判断端口用途:提交端口上应当出现 AUTH 与 STARTTLS
- 大邮件投递前用 SIZE 预检,避免传到一半被拒
- 评估国际化地址支持:看是否声明 SMTPUTF8
读取能力清单
读取能力清单
openssl s_client -starttls smtp -connect smtp.example.com:587 -quiet
EHLO client.local
# 逐行读取返回的能力清单,再决定是否使用 AUTH 或 SMTPUTF8常见扩展
| 扩展 | 作用 | 备注 |
|---|---|---|
| SIZE | 声明服务器接受的邮件大小上限 | 可在发信命令中带 SIZE= 预检 |
| PIPELINING | 允许连发多条命令再统一收应答 | 降低往返延迟 |
| 8BITMIME | 允许 8 位正文,免去 base64 膨胀 | 正文编码协商 |
| SMTPUTF8 | 允许非 ASCII 地址与头部 | 国际化邮箱 |
| STARTTLS | 在明文连接上发起 TLS 升级 | 提交端口常见 |
| AUTH | 支持认证及其机制列表 | 提交端口必需 |
| DSN | 投递状态通知参数 | 精细退信 |
| CHUNKING 与 BDAT | 分块传输替代 DATA | 大邮件更稳 |
| ENHANCEDSTATUSCODES | 支持增强状态码 | 排错信息更细 |
扩展是服务器自愿声明的:客户端只能按声明使用,缺失或标记为 UNKNOWN 的扩展必须退回基础上限行为。
只认 EHLO 却不检查扩展就发 8 位内容:服务器可能直接拒绝,也可能用 base64 重编码,结果正文在收件人侧变形。