1.3. SMTP 事务

SMTP 是用于互联网上邮件传输的协议。关于该协议的详细描述,请参考 RFC 2821,以及 Dave Crocker 关于 互联网邮件架构 的介绍。

邮件传递涉及连接主机(客户端)和接收主机(服务器)之间的 SMTP 事务。在本文的讨论中,连接主机是 peer,接收主机是您的服务器。

在一个典型的 SMTP 事务中,客户端发出 SMTP 命令,例如 EHLOMAIL FROM:RCPT TO:DATA。 您的服务器使用 3 位数字代码响应每个命令,指示命令是被接受 (2xx)、受到临时故障或限制 (4xx),还是最终/永久失败 (5xx),后跟一些人类可读的解释。 RFC 2821 中包含了对这些代码的完整描述。

最佳情况下的 SMTP 事务通常包含以下相关步骤

表 1-1. 简单 SMTP 对话

客户端服务器

发起与服务器的 TCP 连接。

展示 SMTP banner - 即以代码 220 开头的问候语,表明它已准备好进行 SMTP 通信(或通常是 ESMTP,SMTP 的超集)

220 your.f.q.d.n ESTMP...

通过 Hello 命令(HELO(现已过时)或 EHLO)以及自身的 完全限定域名 来介绍自己

EHLO peers.f.q.d.n

使用 250 响应接受此问候语。 如果客户端使用了 Hello 命令的扩展版本 (EHLO),则您的服务器知道它能够处理多行响应,因此通常会发回多行,指示您的服务器提供的功能

250-your.f.q.d.n Hello ...
250-SIZE 52428800
250-8BITMIME
250-PIPELINING
250-STARTTLS
250-AUTH
250 HELP

如果此响应中包含 PIPELINING 功能,则客户端可以从此时开始一次发出多个命令,而无需等待每个命令的响应。

通过指定 信封发件人 来开始新的邮件事务

MAIL FROM:<sender@address>
		

发出 250 响应,指示发件人已被接受。

一次列出消息的 信封收件人,使用命令

RCPT TO:<receiver@address>

对每个命令发出响应(2xx4xx5xx,具体取决于是否接受、临时失败或拒绝向该收件人发送邮件)。

发出 DATA 命令,指示它已准备好发送消息。

响应 354,指示该命令已被临时接受。

传输消息,从符合 RFC 2822 标准的标头行开始(例如From, To, Subject, Date, Message-ID)。 标头和正文之间用空行分隔。 为了指示消息的结尾,客户端在单独的行上发送单个句点 (“.”)。

回复 250,指示消息已被接受。

如果有更多消息要传递,则发出下一个 MAIL FROM: 命令。 否则,它会说 QUIT,或者在极少数情况下,只是断开连接。

断开连接。