命令不多,但要分阶段
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 头是显示地址。两者可以不同,退信会寄到信封地址,发信程序配置错误时会让退信流入无关邮箱。