自学教程 从零学编程

SMTP 协议

一、SMTP 是什么

SMTP(Simple Mail Transfer Protocol,简单邮件传输协议),属于应用层协议,基于TCP,默认端口 25;加密版本常用端口 465(SMTPS,SSL加密)、587(STARTTLS)。

SMTP 的核心作用:发送邮件,在邮件服务器之间传递邮件。

  • 用户发邮件时,客户端把邮件提交到自己的发件服务器,使用SMTP;
  • 发件服务器再通过SMTP,把邮件投递到收件人的邮件服务器。

重点区分:SMTP只管发送、转发邮件;接收邮件使用POP3或IMAP。

二、SMTP 通信模型

SMTP是客户端-服务端模型,分为两类场景:

  1. MUA → MTA:邮件客户端(Foxmail、Outlook、网易邮箱网页端)将邮件上传到自己的发件服务器;
    • MUA:邮件用户代理(Mail User Agent),也就是邮件客户端;
    • MTA:邮件传输代理(Mail Transfer Agent),邮件服务器。
  2. MTA → MTA:发件服务器之间使用SMTP接力,跨域名投递邮件,直到送达收件方邮件服务器。

SMTP只负责把邮件送到收件服务器,收件人从服务器下载邮件,走POP3/IMAP。

三、SMTP 核心特点

  1. 基于TCP,面向连接,可靠传输;
  2. 采用命令+响应码文本交互,可读性强;
  3. 原始25端口明文传输,现代邮件系统普遍启用STARTTLS加密;
  4. 只能发送文本内容,图片、附件会使用Base64编码转成文本再传输;
  5. 支持邮件中继转发(Relay),但开放无认证中继会被垃圾邮件利用,现在服务器都做严格限制。

四、SMTP 常用命令

客户端向SMTP服务器发送命令,服务器返回3位数字响应码。

命令作用
HELO / EHLO客户端向服务器打招呼,EHLO支持扩展功能(STARTTLS、认证)
AUTH身份认证(账号密码),现代邮箱必须开启认证,防止匿名发垃圾邮件
MAIL FROM指定发件人邮箱地址
RCPT TO指定收件人邮箱,可以多个收件人
DATA开始传输邮件正文(标题、内容、附件编码数据)
RSET重置本次邮件会话,清空已输入的发件、收件信息
QUIT结束会话,关闭TCP连接

常见响应码

  • 250 OK:命令执行成功
  • 220:SMTP服务器就绪
  • 354:收到DATA命令,提示客户端可以开始输入邮件内容,以 . 单独一行结束正文
  • 550:邮箱不存在、拒收、权限不足

五、一次完整SMTP邮件发送流程

场景:用户 userA@a.com 发送邮件给 userB@b.com

  1. MUA(邮箱客户端)建立TCP连接到 a.com 的SMTP服务器(端口25/587);
  2. 客户端发送 EHLO 握手,服务器返回支持的扩展(STARTTLS、AUTH);
  3. 协商STARTTLS,切换为加密通道;
  4. 客户端执行 AUTH,验证发件人的账号密码;
  5. MAIL FROM:<userA@a.com>,声明发件人;
  6. RCPT TO:<userB@b.com>,声明收件人;
  7. 发送 DATA,服务器返回354;
  8. 客户端发送邮件头部、正文、Base64编码的附件,单独一行的小数点.表示邮件内容结束;
  9. 服务器收到完整邮件,返回250,表示成功存入服务器队列;
  10. 客户端发送 QUIT,断开连接。

接下来:a.com 的MTA服务器,再次使用SMTP协议连接 b.com 的邮件服务器,把邮件投递过去。
收件人后续通过POP3/IMAP从b.com服务器收取邮件。

六、端口说明

  • 25:标准SMTP端口,服务器之间邮件中继;很多运营商封禁家用网络25端口,防止垃圾邮件;
  • 587:SUBMISSION端口,客户端提交邮件,推荐使用STARTTLS加密;家用客户端优先用587;
  • 465:SMTPS,SSL直接加密的SMTP,旧版客户端常用。

注意:25端口不是不能加密,一般通过EHLO+STARTTLS动态开启加密;465是连接建立就直接SSL加密。

七、SMTP、POP3、IMAP 三者对比

协议端口(加密)作用方向
SMTP25 / 587 /465发送、转发邮件客户端→服务器 / 服务器→服务器
POP3110(995)下载邮件,默认把邮件从服务器删到本地服务器→客户端
IMAP143(993)邮件保存在服务器,多端同步管理邮件服务器↔客户端

八、优缺点

✅ 优点

  1. 简单成熟,全球邮件系统通用标准;
  2. 支持邮件中继转发,实现跨域名投递;
  3. 可通过STARTTLS实现通信加密。

❌ 缺点

  1. 原始SMTP没有身份校验,早年极易伪造发件人,是垃圾邮件泛滥根源;
  2. 邮件正文本身不自带签名,不能直接验证邮件真实性,需要配合SPF/DKIM/DMARC反垃圾邮件;
  3. 仅支持文本传输,二进制附件必须Base64编码,体积增大约1/3。

九、小结

  1. SMTP是应用层TCP协议,负责邮件发送与服务器间邮件转发;
  2. 客户端提交邮件推荐使用587端口+STARTTLS;服务器间投递一般使用25端口;
  3. 交互方式:文本命令 + 数字响应码;DATA命令后传输邮件内容,单独.作为结束标记;
  4. SMTP只负责投递,收取邮件使用POP3/IMAP;
  5. 现代SMTP必须开启身份认证,配合SPF/DKIM等协议防范伪造发件人和垃圾邮件。

思考题:为什么SMTP服务器之间投递邮件一般用25端口,而邮件客户端提交邮件推荐使用587?

标签:

0 条笔记