SMTP 实验记录:一次邮件发送过程与 Header 格式验证

实验目的

验证 SMTP 客户端与服务器之间的交互过程,观察命令及状态码响应,探究 DATA 阶段中 RFC 5322 报文格式(Header 与分隔空行)对邮件接收的影响。

实验环境

  • 客户端:::1 (localhost)
  • SMTP 服务器:Mailpit (Local ESMTP Service)
  • 端口:1025
  • 是否使用 TLS:否(明文 TCP 连接)
  • 使用的工具:telnet

实验步骤

  1. 建立连接(telnet 127.0.0.1 1025
  2. 发送客户端问候(HELO MyMail
  3. 进行身份认证(无,本地测试环境无需认证)
  4. 指定发件人和收件人(MAIL FROM, RCPT TO
  5. 发送邮件内容(DATA 阶段)
    • 对照组 1:无 Header,直接输入文本(观察失败响应)
    • 对照组 2:包含 Header 并在 Header 与正文间加入空行(观察成功响应)
  6. 结束会话

实际过程

Trying ::1...
Connected to localhost.
Escape character is '^]'.
220 HuaLiMao-AQdeMacBook-Pro.local Mailpit ESMTP Service ready
 
HELO MyMail
250 HuaLiMao-AQdeMacBook-Pro.local greets MyMail
 
MAIL FROM: <hualimao@localhost.local>
250 2.1.0 Ok
 
RCPT TO: <hualimao@localhost.local>
250 2.1.5 Ok
 
--- [对照组 1:缺少 Header 与分隔空行] ---
DATA
354 Start mail input; end with <CR><LF>.<CR><LF>
Hello
.
451 4.3.5 Unable to process mail
 
--- [对照组 2:补充 Header 并添加分隔空行] ---
DATA
354 Start mail input; end with <CR><LF>.<CR><LF>
Subject: TEST
FROM: <hualimao@localhost.local>
TO: <hualimao@localhost.local>
 
Hello
.
250 2.0.0 Ok: queued as 1PKGPInrNXIKCGVvf8xopC

现象分析与总结

  1. 对照组 1 失败原因(451 4.3.5): 收到 354 提示后直接输入 Hello,由于缺少 Key: Value 格式的 Header 以及分隔 Header 与 Body 的空行,服务器按 Header 校验 Hello 失败引发报错拒收。

  2. 对照组 2 成功原因(250 2.0.0): 补全了 Subject:, FROM:, TO: 标头,并在 Header 与正文 Hello 之间显式输入了一个空行(CRLF)。该空行是 RFC 5322 规范中标识“Header 解析结束、进入 Body 正文”的法定界限。

  3. 结论: 教材中在 DATA 后直接写正文的示例仅为 SMTP 命令传输(RFC 5321)的抽象简化;现实工程中,服务器必然会依照 RFC 5322 校验报文格式,Header 与正文之间的空行不可省略