Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

第四章 邮件核心协议: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。