第28章 SMTP:简单邮件传送协议
所属:TCP/IP详解 卷1:协议 来源:TCP/IP详解 卷1:协议
本章介绍SMTP协议,包括SMTP的工作方式、邮件传输、SMTP命令、邮件首部和中继等。
28.1 引言
SMTP的作用
SMTP(Simple Mail Transfer Protocol):
- 简单邮件传送协议
- 发送电子邮件
- 邮件服务器之间传邮件
- 应用层
- 用TCP
- 端口25
SMTP用于发送邮件。
为什么需要SMTP
为什么需要SMTP:
- 需要一个标准的邮件传输协议
- 不同的邮件系统之间能传邮件
- 统一的协议
- 互联网邮件的基础
SMTP是邮件传输的标准。
电子邮件的系统组成
电子邮件系统的组成:
-
MUA(Mail User Agent)
- 邮件用户代理
- 用户用的客户端
- Outlook, Foxmail, 网页邮箱
- 用户收发邮件用的
-
MTA(Mail Transfer Agent)
- 邮件传输代理
- 邮件服务器
- 负责传输邮件
- Sendmail, Postfix, Exchange
-
MDA(Mail Delivery Agent)
- 邮件投递代理
- 把邮件放到用户邮箱
- 最后一步
MUA→MTA→…→MTA→MDA→用户。
本章讨论的内容
本章讨论的内容:
- SMTP的工作方式
- 邮件传输过程
- SMTP命令
- 邮件首部
- 邮件中继
- SMTP的返回码
本章介绍SMTP协议。
28.2 SMTP的工作方式
SMTP的连接
SMTP的连接:
- 客户端连服务器25端口
- TCP连接
- 建立连接后
- 服务器先发问候
- 然后客户端发命令
- 服务器回响应
SMTP用TCP,端口25。
SMTP命令和响应
SMTP命令和响应:
- 命令:客户端发,文本
- 响应:服务器回,三位数字+文本
- 和FTP类似
特点:
- 面向文本
- 人可读
- 一行一个命令
- 一行一个响应
命令响应模式。
邮件传输的过程
邮件传输的过程(简单版):
-
用户写邮件
- 用MUA
- 写好收件人、主题、内容
-
MUA发给本地MTA
- 用SMTP
- 发给用户的邮件服务器
-
本地MTA发给对方MTA
- 用SMTP
- 直接发,或者中继
- 经过多个MTA
-
对方MTA收到
- 交给MDA
- 放到收件人的邮箱
-
收件人收邮件
- 用MUA
- 从邮箱取(POP3/IMAP)
发邮件用SMTP,收邮件用POP3/IMAP。
28.3 SMTP命令
常见的SMTP命令
常见的SMTP命令:
| 命令 | 说明 |
|---|---|
| HELO | 问候,介绍自己 |
| EHLO | 扩展问候,ESMTP用 |
| MAIL FROM | 发件人地址 |
| RCPT TO | 收件人地址 |
| DATA | 开始发邮件内容 |
| RSET | 重置 |
| VRFY | 验证用户是否存在 |
| EXPN | 展开邮件列表 |
| NOOP | 空操作 |
| QUIT | 退出 |
很多SMTP命令。
命令的例子
发送邮件的例子:
服务器: 220 mail.example.com ESMTP Postfix
客户端: HELO client.example.com
服务器: 250 mail.example.com
客户端: MAIL FROM:<sender@example.com>
服务器: 250 Ok
客户端: RCPT TO:<recipient@example.com>
服务器: 250 Ok
客户端: DATA
服务器: 354 End data with <CR><LF>.<CR><LF>
客户端: Subject: Test
客户端:
客户端: This is a test.
客户端: .
服务器: 250 Ok: queued as ABC123
客户端: QUIT
服务器: 221 Bye
典型的SMTP会话。
DATA命令
DATA命令:
- 发完MAIL FROM和RCPT TO
- 发DATA
- 服务器说可以开始发了
- 然后发邮件内容
- 最后一行只有一个点,表示结束
邮件内容:
- 邮件首部
- 空行
- 邮件正文
DATA命令发邮件内容。
28.4 SMTP返回码
返回码
SMTP返回码:
- 三位数字
- 和FTP类似
- 第一位是类别
- 后两位具体的
三位数字返回码。
第一位的含义
第一位的含义:
| 第一位 | 含义 |
|---|---|
| 2xx | 成功 |
| 3xx | 中间,需要更多信息 |
| 4xx | 暂时失败,稍后重试 |
| 5xx | 永久失败,不行 |
和FTP类似。
常见的返回码
常见的返回码:
| 返回码 | 说明 |
|---|---|
| 220 | 服务就绪 |
| 221 | 服务关闭 |
| 250 | 命令成功 |
| 251 | 用户不在本地,转发 |
| 354 | 开始发邮件内容,以.结束 |
| 450 | 邮箱不可用,暂时 |
| 451 | 处理出错,暂时 |
| 550 | 邮箱不可用,永久 |
| 551 | 用户不在本地 |
| 552 | 超出存储分配 |
| 553 | 邮箱名不允许 |
很多返回码。
28.5 邮件首部
邮件首部
邮件首部(Email Header):
- 邮件的头部
- 各种字段
- 类似HTTP首部
- 每行一个字段
- 字段名: 值
邮件首部有很多字段。
常见的首部字段
常见的首部字段:
| 字段 | 说明 |
|---|---|
| From | 发件人 |
| To | 收件人 |
| Cc | 抄送 |
| Bcc | 密送 |
| Subject | 主题 |
| Date | 日期 |
| Message-ID | 邮件ID |
| Reply-To | 回复地址 |
| Received | 接收记录,每经过一个MTA加一个 |
| Content-Type | 内容类型 |
| Content-Transfer-Encoding | 内容传输编码 |
| MIME-Version | MIME版本 |
很多首部字段。
Received字段
Received字段:
- 邮件经过的每个MTA都加一个
- 记录从哪来,到哪,什么时候
- 可以看邮件经过了哪些服务器
- 从上到下是从后到前的顺序
作用:
- 追踪邮件路径
- 排查问题
- 反垃圾邮件
Received记录邮件路径。
28.6 邮件中继
什么是邮件中继
邮件中继(Mail Relay):
- 邮件不是直接发到目的地
- 经过中间的服务器转发
- 一个传给一个
- 最后到目的地
邮件可以经过多个服务器转发。
为什么需要中继
为什么需要中继:
-
不能直接到达
- 有些网络不能直接连
- 需要中继
-
防火墙/策略
- 内部服务器不能直接发外网
- 通过中继服务器发
-
负载均衡
- 多个服务器分担
-
反垃圾邮件
- 中继服务器过滤垃圾邮件
有各种原因需要中继。
开放中继
开放中继(Open Relay):
- 服务器允许任何人通过它发邮件
- 不需要认证
- 谁都能用
问题:
- 垃圾邮件发送者利用
- 发大量垃圾邮件
- 服务器被拉黑
- 很不好
现在:
- 都不开放中继了
- 都要认证
- 或者限制IP
开放中继很危险。
28.7 ESMTP
什么是ESMTP
ESMTP(Extended SMTP):
- 扩展SMTP
- 在SMTP基础上增加了扩展
- 更多功能
- 用EHLO而不是HELO
ESMTP是扩展的SMTP。
常见的扩展
常见的ESMTP扩展:
| 扩展 | 说明 |
|---|---|
| AUTH | 认证,登录 |
| STARTTLS | 加密传输 |
| SIZE | 邮件大小 |
| 8BITMIME | 8位MIME |
| PIPELINING | 流水线,命令不用等响应 |
很多扩展。
EHLO
EHLO命令:
- ESMTP的问候
- 代替HELO
- 服务器回支持的扩展
- 客户端知道服务器支持什么
例子:
客户端: EHLO client.example.com
服务器: 250-mail.example.com
服务器: 250-PIPELINING
服务器: 250-SIZE 10240000
服务器: 250-AUTH LOGIN PLAIN
服务器: 250 STARTTLS
EHLO返回支持的扩展。
28.8 小结
SMTP概述
-
什么是SMTP
- 简单邮件传送协议
- 发送邮件
- 端口25
-
邮件系统组成
- MUA:用户代理
- MTA:传输代理
- MDA:投递代理
-
特点
- 面向文本
- 命令响应模式
- 用TCP
SMTP命令
-
常见命令
- HELO/EHLO:问候
- MAIL FROM:发件人
- RCPT TO:收件人
- DATA:发内容
- QUIT:退出
-
DATA命令
- 发邮件内容
- 最后一个点结束
SMTP返回码
-
三位数字
- 第一位类别
- 后两位具体
-
第一位含义
- 2xx成功
- 3xx中间
- 4xx暂时失败
- 5xx永久失败
邮件首部
-
常见字段
- From, To, Subject, Date
- Message-ID
- Received
- Content-Type
-
Received字段
- 记录路径
- 每个MTA加一个
邮件中继
-
什么是中继
- 经过中间服务器转发
-
为什么需要
- 不能直接到达
- 防火墙
- 负载均衡
- 反垃圾
-
开放中继
- 谁都能用
- 被垃圾邮件利用
- 不好
ESMTP
-
什么是ESMTP
- 扩展SMTP
- 更多功能
- EHLO
-
常见扩展
- AUTH认证
- STARTTLS加密
- SIZE大小
- PIPELINING流水线
关键概念
-
SMTP
- 简单邮件传输协议
- 发邮件用
-
MUA/MTA/MDA
- 用户代理
- 传输代理
- 投递代理
-
SMTP命令
- HELO, MAIL FROM, RCPT TO, DATA
-
邮件首部
- From, To, Subject, Received等
-
中继
- 转发邮件
- 开放中继不好
-
ESMTP
- 扩展SMTP
- 更多功能