首页/网络/协议速查/SMTP 核心命令

SMTP 核心命令

SMTP 命令不多:问候、信封、数据三段加上几个辅助命令;AUTH 与 STARTTLS 属于扩展,不在最原始的 RFC 821 里。

协议速查网络更新于 2026-10-13

命令不多,但要分阶段

SMTP 命令数量很少:问候、信封、数据三段加上几个辅助命令。原始 RFC 821 里没有认证与加密,AUTH 与 STARTTLS 都是后来的扩展,靠 EHLO 的能力列表协商。理解「哪些命令在哪个阶段可用」,抓包时就能迅速判断是客户端实现有问题,还是服务端策略在拦截。

基本信息

服务端口25 中继、587 提交(要求 STARTTLS)、465 隐式 TLS
命令格式四字母命令加参数,行长度不超过 512 字节
扩展机制EHLO 返回的能力列表决定可用扩展,如 AUTH、STARTTLS、SIZE、PIPELINING
应答格式三位数字加文本,连字符表示后续还有续行,空格表示最后一行

核心命令

命令阶段说明
HELO问候传统问候,声明发件方域名
EHLO问候扩展问候,触发 ESMTP 能力列表
MAIL FROM信封声明信封发件人,可带 SIZE 等参数
RCPT TO信封声明收件人,可重复出现
DATA数据开始传输正文,以单独一行点结束
RSET任意重置当前邮件事务,不断开连接
NOOP任意探活,服务器回 250
VRFY 与 EXPN任意验证地址与展开列表,多数服务已禁用
AUTH提交认证,机制含 PLAIN、LOGIN、CRAM-MD5、XOAUTH2
STARTTLS提交把当前明文连接升级为 TLS
QUIT结束正常结束会话,服务器回 221

只发信封不发正文

只发信封不发正文
MAIL FROM:<a@example.com>
250 Ok
RCPT TO:<b@example.net>
250 Ok
RSET
250 Ok
# 这种探测方式可验证地址是否存在,却不会真的投递邮件

典型使用场景

  • 手工 telnet 或 openssl s_client 排障,逐条命令确认服务端应答
  • 验证邮箱地址有效性:只发 MAIL FROM 与 RCPT TO,再用 RSET 撤销
  • 确认服务端是否支持 PIPELINING,评估批量投递的往返开销
  • 排查认证失败:对比 EHLO 能力列表里是否真的声明了 AUTH
RCPT TO 是收件人探测的现场:对方在应答里暴露 250 与 550 的差异,这也是 VRFY 被普遍禁用的初衷——该命令等于给攻击者提供批量地址核验接口。
MAIL FROM 是信封发件人,用于退信;正文 From 头是显示地址。两者可以不同,退信会寄到信封地址,发信程序配置错误时会让退信流入无关邮箱。

易错点

  • 把 HELO 与 EHLO 混用:用 HELO 就不会拿到能力列表,AUTH 与 STARTTLS 全都不可用,表现为「认证不被支持」
  • 忽略 EHLO 的续行格式:250- 开头的续行与 250 空格结尾的最后一行要一起解析,只读第一行会漏掉 AUTH 机制
  • 在错误阶段发命令:如认证前就发 MAIL FROM,服务端会回 503 错误序列,日志里看起来像客户端故障
  • 命令行超过 512 字节:超长参数以 500 系列报错返回,常见于把整个长地址写进 MAIL FROM

数据来源与参考

  • RFC 5321 §4.1
  • RFC 4954(AUTH)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌