SMTP 是用于互联网上邮件传输的协议。关于该协议的详细描述,请参考 RFC 2821,以及 Dave Crocker 关于 互联网邮件架构 的介绍。
邮件传递涉及连接主机(客户端)和接收主机(服务器)之间的 SMTP 事务。在本文的讨论中,连接主机是 peer,接收主机是您的服务器。
在一个典型的 SMTP 事务中,客户端发出 SMTP 命令,例如 EHLO、MAIL FROM:、RCPT TO: 和 DATA。 您的服务器使用 3 位数字代码响应每个命令,指示命令是被接受 (2xx)、受到临时故障或限制 (4xx),还是最终/永久失败 (5xx),后跟一些人类可读的解释。 RFC 2821 中包含了对这些代码的完整描述。
最佳情况下的 SMTP 事务通常包含以下相关步骤
表 1-1. 简单 SMTP 对话
客户端 | 服务器 | ||
---|---|---|---|
发起与服务器的 TCP 连接。 |
展示 SMTP banner - 即以代码 220 开头的问候语,表明它已准备好进行 SMTP 通信(或通常是 ESMTP,SMTP 的超集)
| ||
通过 Hello 命令(HELO(现已过时)或 EHLO)以及自身的 完全限定域名 来介绍自己
|
使用 250 响应接受此问候语。 如果客户端使用了 Hello 命令的扩展版本 (EHLO),则您的服务器知道它能够处理多行响应,因此通常会发回多行,指示您的服务器提供的功能
如果此响应中包含 PIPELINING 功能,则客户端可以从此时开始一次发出多个命令,而无需等待每个命令的响应。 | ||
通过指定 信封发件人 来开始新的邮件事务
|
发出 250 响应,指示发件人已被接受。 | ||
一次列出消息的 信封收件人,使用命令
|
对每个命令发出响应(2xx、4xx 或 5xx,具体取决于是否接受、临时失败或拒绝向该收件人发送邮件)。 | ||
发出 DATA 命令,指示它已准备好发送消息。 |
响应 354,指示该命令已被临时接受。 | ||
传输消息,从符合 RFC 2822 标准的标头行开始(例如From, To, Subject, Date, Message-ID)。 标头和正文之间用空行分隔。 为了指示消息的结尾,客户端在单独的行上发送单个句点 (“.”)。 |
回复 250,指示消息已被接受。 | ||
如果有更多消息要传递,则发出下一个 MAIL FROM: 命令。 否则,它会说 QUIT,或者在极少数情况下,只是断开连接。 |
断开连接。 |