第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是邮件传输的标准。


电子邮件的系统组成

电子邮件系统的组成:

  1. MUA(Mail User Agent)

    • 邮件用户代理
    • 用户用的客户端
    • Outlook, Foxmail, 网页邮箱
    • 用户收发邮件用的
  2. MTA(Mail Transfer Agent)

    • 邮件传输代理
    • 邮件服务器
    • 负责传输邮件
    • Sendmail, Postfix, Exchange
  3. 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类似

特点:

  • 面向文本
  • 人可读
  • 一行一个命令
  • 一行一个响应

命令响应模式。


邮件传输的过程

邮件传输的过程(简单版):

  1. 用户写邮件

    • 用MUA
    • 写好收件人、主题、内容
  2. MUA发给本地MTA

    • 用SMTP
    • 发给用户的邮件服务器
  3. 本地MTA发给对方MTA

    • 用SMTP
    • 直接发,或者中继
    • 经过多个MTA
  4. 对方MTA收到

    • 交给MDA
    • 放到收件人的邮箱
  5. 收件人收邮件

    • 用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-VersionMIME版本

很多首部字段。


Received字段

Received字段:

  • 邮件经过的每个MTA都加一个
  • 记录从哪来,到哪,什么时候
  • 可以看邮件经过了哪些服务器
  • 从上到下是从后到前的顺序

作用:

  • 追踪邮件路径
  • 排查问题
  • 反垃圾邮件

Received记录邮件路径。


28.6 邮件中继

什么是邮件中继

邮件中继(Mail Relay):

  • 邮件不是直接发到目的地
  • 经过中间的服务器转发
  • 一个传给一个
  • 最后到目的地

邮件可以经过多个服务器转发。


为什么需要中继

为什么需要中继:

  1. 不能直接到达

    • 有些网络不能直接连
    • 需要中继
  2. 防火墙/策略

    • 内部服务器不能直接发外网
    • 通过中继服务器发
  3. 负载均衡

    • 多个服务器分担
  4. 反垃圾邮件

    • 中继服务器过滤垃圾邮件

有各种原因需要中继。


开放中继

开放中继(Open Relay):

  • 服务器允许任何人通过它发邮件
  • 不需要认证
  • 谁都能用

问题:

  • 垃圾邮件发送者利用
  • 发大量垃圾邮件
  • 服务器被拉黑
  • 很不好

现在:

  • 都不开放中继了
  • 都要认证
  • 或者限制IP

开放中继很危险。


28.7 ESMTP

什么是ESMTP

ESMTP(Extended SMTP):

  • 扩展SMTP
  • 在SMTP基础上增加了扩展
  • 更多功能
  • 用EHLO而不是HELO

ESMTP是扩展的SMTP。


常见的扩展

常见的ESMTP扩展:

扩展说明
AUTH认证,登录
STARTTLS加密传输
SIZE邮件大小
8BITMIME8位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概述

  1. 什么是SMTP

    • 简单邮件传送协议
    • 发送邮件
    • 端口25
  2. 邮件系统组成

    • MUA:用户代理
    • MTA:传输代理
    • MDA:投递代理
  3. 特点

    • 面向文本
    • 命令响应模式
    • 用TCP

SMTP命令

  1. 常见命令

    • HELO/EHLO:问候
    • MAIL FROM:发件人
    • RCPT TO:收件人
    • DATA:发内容
    • QUIT:退出
  2. DATA命令

    • 发邮件内容
    • 最后一个点结束

SMTP返回码

  1. 三位数字

    • 第一位类别
    • 后两位具体
  2. 第一位含义

    • 2xx成功
    • 3xx中间
    • 4xx暂时失败
    • 5xx永久失败

邮件首部

  1. 常见字段

    • From, To, Subject, Date
    • Message-ID
    • Received
    • Content-Type
  2. Received字段

    • 记录路径
    • 每个MTA加一个

邮件中继

  1. 什么是中继

    • 经过中间服务器转发
  2. 为什么需要

    • 不能直接到达
    • 防火墙
    • 负载均衡
    • 反垃圾
  3. 开放中继

    • 谁都能用
    • 被垃圾邮件利用
    • 不好

ESMTP

  1. 什么是ESMTP

    • 扩展SMTP
    • 更多功能
    • EHLO
  2. 常见扩展

    • AUTH认证
    • STARTTLS加密
    • SIZE大小
    • PIPELINING流水线

关键概念

  1. SMTP

    • 简单邮件传输协议
    • 发邮件用
  2. MUA/MTA/MDA

    • 用户代理
    • 传输代理
    • 投递代理
  3. SMTP命令

    • HELO, MAIL FROM, RCPT TO, DATA
  4. 邮件首部

    • From, To, Subject, Received等
  5. 中继

    • 转发邮件
    • 开放中继不好
  6. ESMTP

    • 扩展SMTP
    • 更多功能

SMTP简单邮件传送