简单邮件传输协议

简单邮件传输协议（英语：Simple Mail Transfer Protocol，缩写：SMTP）是一种用于电子邮件传输的互联网标准通信协议。邮件服务器使用SMTP来发送和接收邮件。电子邮件客户端通常仅使用SMTP将邮件发送至邮件服务器进行中继，并通常在端口587或465上提交外发邮件（依据RFC 8314）。用于接收邮件的标准协议是IMAP（取代了旧的POP），但专有服务器也常常实现专有协议，例如Exchange ActiveSync。

SMTP起源于1980年，基于1971年在ARPANET上实施的概念构建。此协议已多次更新、修改和扩展。目前普遍使用的版本具有可扩展的结构，支持多种扩展功能，如身份验证、加密、二进制数据传输和国际化电子邮件地址。SMTP服务器通常使用TCP，在端口25（用于服务器之间）和端口587（用于来自已认证客户端的提交）上运行，支持加密与非加密两种方式。

## SMTP发展历史

### SMTP的前身

在1960年代，不同形式的一对一电子信息传递已在使用，用户通过为特定大型计算机开发的系统进行通信。随着计算机互联增多，尤其是在美国政府的ARPANET中，逐渐制定了标准以允许在不同操作系统之间交换消息。

ARPANET上的邮件可以追溯到1971年：当时提出了未实现的Mail Box Protocol（邮件盒协议），该协议在RFC 196中有讨论；同年，BBN的Ray Tomlinson改造了SNDMSG程序，使其能够在ARPANET上的两台计算机间发送消息。随后在1973年6月的RFC 524中提出了另一种邮件协议，但同样未被实现。

1973年3月，RFC 469建议使用文件传输协议（FTP）在ARPANET上进行网络邮件传输。通过RFC 561、RFC 680、RFC 724以及最终在1977年11月发布的RFC 733，形成了使用FTP邮件服务器的标准化电子邮件框架。

SMTP的发展源于1970年代制定的这些标准。Ray Tomlinson在1974年9月的INWG协议备忘录2中讨论了网络邮件。1979年，INWG讨论了电子邮件协议，该讨论内容在Jon Postel关于互联网邮件的早期工作中有引用。Postel在1979年首次提出了互联网消息协议，作为互联网实验报告（IEN）系列的一部分。

### 原始的SMTP

1980年，Postel和Suzanne Sluizer发布了RFC 772，提出了邮件传输协议（Mail Transfer Protocol）以替代FTP用于邮件传输。1981年5月，RFC 780取消了所有对FTP的引用，并为TCP和UDP分配了端口57（但IANA后来取消了这一分配）。1981年11月，Postel发布了RFC 788——简单邮件传输协议。

SMTP标准的开发与Usenet（一个具有相似之处的一对多通信网络）几乎是同期的。

SMTP在1980年代初得到了广泛使用。当时，它是对Unix间复制协议（UUCP）的补充，UUCP更适合用于处理两台间歇性连接的计算机间的邮件传输。相比之下，SMTP更适合发送方和接收方的机器始终连接到网络的环境。两者都使用存储转发机制，是推送技术的例子。尽管Usenet的新闻组仍然通过UUCP在服务器间传播，但UUCP作为邮件传输工具几乎已消失，随之消失的还有UUCP用于消息路由的“叹号路径”。

1983年随4.1cBSD发布的Sendmail，是首批实现SMTP的邮件传输代理（MTA）之一。随着BSD Unix成为互联网最流行的操作系统，Sendmail也成为最常见的MTA。

原始的SMTP协议仅支持未经身份验证的7位ASCII文本通信，且不加密，易受中间人攻击、欺骗和垃圾邮件的侵害，并且需要将二进制数据编码为可读文本后才能传输。由于缺少适当的身份验证机制，原始设计中的SMTP服务器都是开放邮件中继站。互联网邮件联盟（IMC）报告称，1998年时有55%的邮件服务器是开放中继，而到2002年降至不到1%。由于垃圾邮件问题，大多数电子邮件提供商将开放中继列入阻止名单，使原始SMTP在互联网普遍使用场景中几乎不再适用。

### 现代SMTP

1995年11月，RFC 1869定义了扩展简单邮件传输协议（ESMTP），为现有和未来的所有扩展提供了通用结构，旨在弥补原始SMTP协议的功能缺失。ESMTP定义了一套一致、可管理的方式，用于识别ESMTP客户端和服务器，并让服务器指示其支持的扩展功能。

1998年和1999年，引入了消息提交（RFC 2476）和SMTP-AUTH（RFC 2554），标志着电子邮件传输的新趋势。最初，SMTP服务器通常是内部使用的，用于接收来自外部的邮件并转发组织内的邮件到外部。但随着时间推移，SMTP服务器（邮件传输代理，MTA）实际上扩展了其角色，成为邮件用户代理（MUA）的消息提交代理，有些甚至中继来自外部的邮件（例如，公司高管在出差时通过公司SMTP服务器发送邮件）。这种变化是由于万维网的快速普及，使得SMTP必须包含特定的中继规则和用户身份验证方法，以防止滥用行为，如未经请求的邮件（垃圾邮件）的中继。RFC 2476的消息提交工作最初是因为流行的邮件服务器经常会在尝试修复邮件问题时重写邮件，例如为不完整的地址添加域名。虽然此行为在初次提交时有帮助，但在邮件来自他处并被中继时则存在风险。将邮件清晰地分为提交和中继被视为一种方法，既能允许和鼓励提交时重写，又禁止中继时重写。随着垃圾邮件的增多，这一分离也被视为对组织外发送邮件提供授权和追踪的方式。这种中继和提交的分离迅速成为现代电子邮件安全实践的基础。

由于SMTP协议最初仅基于ASCII文本，因此对二进制文件或多语言字符处理不佳。多用途互联网邮件扩展（MIME）标准被开发出来，将二进制文件编码以便通过SMTP传输。在Sendmail之后开发的邮件传输代理（MTA）通常被实现为8位“干净”模式，使得可以使用“直接发送八位”的策略传输任意文本数据（以任意8位ASCII类似字符编码）。然而，由于不同厂商的字符集映射差异，仍然存在乱码问题，且电子邮件地址本身仍然只允许使用ASCII字符。如今，8位“干净”MTA倾向于支持8BITMIME扩展，使得部分二进制文件几乎可以像纯文本一样容易传输（仍然存在行长和允许的八位值限制，因此大多数非文本数据和一些文本格式仍需要MIME编码）。2012年，SMTPUTF8扩展被引入，以支持UTF-8文本，允许使用非拉丁字符（如西里尔字母或中文）的国际内容和地址。

许多人对核心SMTP规范作出了贡献，包括Jon Postel、Eric Allman、Dave Crocker、Ned Freed、Randall Gellens、John Klensin和Keith Moore。

## 邮件处理模型

<image>

电子邮件通过邮件客户端（邮件用户代理，MUA）使用SMTP通过TCP端口587提交到邮件服务器（邮件提交代理，MSA）。大多数邮箱提供商仍允许通过传统的端口25提交。MSA将邮件传送给其邮件传输代理（MTA）。通常，这两个代理是同一软件的实例，在同一台机器上启动时采用不同选项。可以在单台计算机上完成本地处理，也可以分配到多台机器上；一台机器上的邮件代理进程可以共享文件，但如果在多台机器上进行处理，它们会使用SMTP在彼此之间传递消息，每台机器都配置为使用下一台机器作为智能主机。每个进程都是其自身的MTA（SMTP服务器）。

边界MTA使用DNS查找接收方域的MX记录（即电子邮件地址中@符号右侧的部分）。MX记录包含目标MTA的名称。根据目标主机和其他因素，发送MTA选择一个接收服务器并连接以完成邮件交换。

邮件传输可以在两个MTA之间的单次连接中完成，或通过中间系统的一系列跳转来完成。接收SMTP服务器可能是最终目的地、中继（即存储并转发消息）或网关（即可能使用SMTP以外的协议转发消息）。根据RFC 5321第2.1节，每一次跳转都正式交接了消息的责任，接收服务器必须要么传递消息，要幺正确报告未能传递的原因。

一旦最终跳转接受传入消息，它将消息交给邮件投递代理（MDA）以进行本地传递。MDA将消息保存在相关的邮箱格式中。和发送一样，接收过程可以在一台或多台计算机上完成，但在上图中MDA被描绘为位于邮件交换器附近的一个框。MDA可以直接将消息传送到存储中，或通过网络使用SMTP或其他协议（如本地邮件传输协议LMTP）转发，这种协议是为此目的设计的SMTP衍生协议。

一旦邮件传递到本地邮件服务器，邮件便被存储以供经过身份验证的邮件客户端批量检索。邮件由称为电子邮件客户端的终端用户应用程序使用Internet消息访问协议（IMAP）或邮局协议（POP）检索。IMAP用于访问和管理已存储的邮件，而POP通常使用传统的mbox邮件文件格式或专有系统，如Microsoft Exchange/Outlook或Lotus Notes。Webmail客户端可能使用其中任一方式，但检索协议通常不是正式标准。

SMTP定义了消息传输而非消息内容，因此它定义了邮件信封及其参数（如信封发件人），但不包括消息的头部（除追踪信息外）或正文。STD 10和RFC 5321定义了SMTP（即信封），而STD 11和RFC 5322则定义了消息（头部和正文），正式称为互联网消息格式。

## SMTP通信举例

在发送方（客户端）和接收方（服务器）间建立连接之后，会建立一个合法的SMTP会话，如下例。在下面的例子中，所有客户端发送的都以“C:”作为前缀，所有服务器发送的都以“S:”作为前缀。在多数计算机系统上，可以在发送的机器上使用telnet命令来建立连接，比如：

```
telnet www.example.com 25
```

它建立一个从发送的机器到主机www.example.com的SMTP连接。

```
<span style="color: blue">S: 220 smtp.example.com ESMTP Postfix</span>
C: HELO relay.example.com
<span style="color: blue">S: 250 smtp.example.com, I am glad to meet you</span>
C: MAIL FROM:<bob@example.com>
<span style="color: blue">S: 250 Ok</span>
C: RCPT TO:<alice@example.com>
<span style="color: blue">S: 250 Ok</span>
C: RCPT TO:<theboss@example.com>
<span style="color: blue">S: 250 Ok</span>
C: DATA
<span style="color: blue">S: 354 End data with <CR><LF>.<CR><LF></span>
C: From: "Bob Example" <bob@example.com>
C: To: Alice Example <alice@example.com>
C: Cc: theboss@example.com
C: Date: Tue, 15 Jan 2008 16:02:43 -0500
C: Subject: Test message
C: 
C: Hello Alice.
C: This is a test message with 5 header fields and 4 lines in the message body.
C: Your friend,
C: Bob
C: .
<span style="color: blue">S: 250 Ok: queued as 12345</span>
C: QUIT
<span style="color: blue">S: 221 Bye</span>
{The server closes the connection}
```

虽然是可选的，但几乎所有的客户端都会使用EHLO问候消息（而不是上面所示的HELO）来询问服务器支持何种SMTP扩展，邮件的文本体（接着DATA）一般是典型的MIME格式。

## SMTP安全和垃圾邮件

最初的SMTP的局限之一，在于它没有对发送方进行身份验证的机制。因此，后来定义了SMTP-AUTH扩展。

尽管有了身份认证机制，垃圾邮件仍然是一个主要的问题。但由于庞大的SMTP安装数量带来的网络效应，大刀阔斧地修改或完全替代SMTP被认为是不现实的。就是一个替代SMTP的建议方案。

因此，出现了一些同SMTP工作的辅助协议。反垃圾邮件研究小组正在研究一些建议方案，以提供简单、灵活、轻量级的、可升级的源端认证。最有可能被接受的建议方案是发件人策略框架（SPF）协议。

提供SSL加密的SMTP协定被称为SMTPS。

## 参见

### 相关 RFC

- RFC 5321 - 简单邮件传输协议，在最近（2008.8）代替了 RFC 2821
- RFC 2821 - 简单邮件传输协议，在最近（2001）代替了 RFC 821，RFC 1869，RFC 974
- RFC 2822 - Internet（比如 e-mail）消息格式，代替了 RFC 822
- RFC 3461 - SMTP的发送状态通知（DSN）扩展，代替了 RFC 1891