第四章 邮件核心协议:SMTP
协议是邮件系统的灵魂,正是因为有了全球统一的标准化协议,不同厂商、不同平台的邮件系统才能实现无缝互通。SMTP是邮件系统最核心的传输协议。
协议概述
邮件系统的协议栈可以分为三层:
| 层级 | 协议 | 作用 |
|---|---|---|
| 传输层 | SMTP | 邮件在服务器之间的传输 |
| 访问层 | POP3/IMAP | 用户客户端从服务器接收邮件 |
| 扩展层 | MIME/SPF/DKIM/DMARC/S/MIME/PGP | 内容扩展、安全认证、加密等功能 |
所有协议都由IETF(互联网工程任务组)发布的RFC文档定义,是全球统一的开放标准。
SMTP协议:邮件传输的核心
SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)是邮件系统的核心协议,负责邮件从发件人到收件人之间的传输。
基本信息
- 标准文档:RFC 5321(最新版本)
- 默认端口:25(普通传输)、587(提交端口,需要身份认证)、465(SMTPS,加密传输)
- 工作模式:客户端/服务器模式,基于文本命令交互
SMTP的工作过程
SMTP通信分为三个阶段:连接建立、邮件传输、连接关闭。
客户端 服务器
│ │
│─── 连接到端口25 ───────────────▶│
│◀─── 220 服务就绪 ───────────────│
│─── HELO mydomain.com ─────────▶│
│◀─── 250 Hello ─────────────────│
│─── MAIL FROM:<[email protected]> ─▶│
│◀─── 250 OK ────────────────────│
│─── RCPT TO:<[email protected]> ─────▶│
│◀─── 250 OK ────────────────────│
│─── DATA ──────────────────────▶│
│◀─── 354 开始输入,以<CRLF>.<CRLF>结束 ──│
│─── 邮件内容 ───────────────────▶│
│─── . ─────────────────────────▶│
│◀─── 250 OK: queued as 12345 ───│
│─── QUIT ──────────────────────▶│
│◀─── 221 Bye ───────────────────│
│ │
常用SMTP命令
| 命令 | 作用 | 示例 |
|---|---|---|
| HELO/EHLO | 向服务器标识客户端身份 | HELO example.com |
| MAIL FROM | 指定发件人地址 | MAIL FROM:<[email protected]> |
| RCPT TO | 指定收件人地址 | RCPT TO:<[email protected]> |
| DATA | 开始传输邮件内容 | DATA |
| RSET | 重置当前会话,取消正在进行的邮件传输 | RSET |
| VRFY | 验证邮箱地址是否存在(通常被禁用) | VRFY [email protected] |
| EXPN | 展开邮件列表(通常被禁用) | EXPN [email protected] |
| HELP | 查询服务器支持的命令 | HELP |
| NOOP | 空操作,用于测试连接 | NOOP |
| QUIT | 结束会话 | QUIT |
常见SMTP状态码
| 状态码 | 含义 |
|---|---|
| 2xx | 成功 |
| 220 | 服务就绪 |
| 250 | 请求的命令执行成功 |
| 251 | 用户不存在,将转发到其他地址 |
| 354 | 开始输入邮件内容,以.结束 |
| 4xx | 临时错误,稍后重试 |
| 421 | 服务不可用,关闭连接 |
| 450 | 邮箱不可用(例如邮箱满) |
| 451 | 处理过程中发生错误 |
| 452 | 系统存储不足 |
| 5xx | 永久错误,不需要重试 |
| 500 | 语法错误,命令无法识别 |
| 501 | 参数语法错误 |
| 502 | 命令不支持 |
| 503 | 命令顺序错误 |
| 504 | 命令参数不支持 |
| 550 | 邮箱不存在,或被拒绝 |
| 551 | 用户不在本地,需要转发 |
| 552 | 邮箱空间不足 |
| 553 | 邮箱地址不合法 |
| 554 | 事务失败(例如被反垃圾邮件拦截) |
ESMTP扩展
ESMTP(Extended SMTP)是SMTP的扩展版本,支持更多功能:
- 使用EHLO命令代替HELO
- 支持身份认证(AUTH命令)
- 支持TLS加密传输(STARTTLS命令)
- 支持8位字节传输(8BITMIME)
- 支持消息大小声明(SIZE)
- 支持投递状态通知(DSN)
实际测试SMTP
我们可以使用telnet命令手动测试SMTP协议:
telnet smtp.example.com 25
EHLO mydomain.com
AUTH LOGIN
(base64编码的用户名)
(base64编码的密码)
MAIL FROM:<[email protected]>
RCPT TO:<[email protected]>
DATA
Subject: 测试邮件
From: 发件人 <[email protected]>
To: 收件人 <[email protected]>
这是一封测试邮件。
.
QUIT
本章小结
SMTP是邮件系统的核心传输协议,负责邮件从发件人到收件人的传递。理解SMTP的工作原理是掌握邮件系统的基础。下一章我们将介绍第一个邮件接收协议POP3。