这篇文章系统记录了我对于SMTP协议的RFC-5321文档的阅读,记录一些我认为重要的关键点和相关问题。
RFC文档要点
1.2 一个配套的文档RFC 5322讨论了消息头部分和主体,并为它们指定了格式和结构。
2.2.2 以“X”开头的动词是可能没有注册或标准化的本地扩展。
2.3 SMTP传输一个邮件对象。邮件对象包含信封和内容。SMTP信封是作为一系列SMTP协议单元发送的(在第3节中描述),它包括一个发起者地址(错误报告应指向该地址)、一个或多个收件人地址和可选协议扩展材料。
2.3 SMTP内容在SMTP数据协议单元中发送,它有两部分:头部分和正文。如果内容符合其他当代标准,则标头部分由标头字段集合组成,每个标头字段由标头名称、冒号和数据组成,结构如消息格式规范(RFC 5322 [4]);如果是结构化的,则根据MIME (RFC 2045[21])定义主体。
2.3.3 “邮件用户代理”(MUAs或UAs)通常被认为是邮件的源和目标。从源头上说,MUA可以收集要从用户传输的邮件并将其传递给MTA;
2.3.5 The domain name given in the EHLO command MUST be either a primary host name (a domain name that resolves to an address RR) or, if the host has no name, an address literal, as described in Section 4.1.3 and discussed further in the EHLO discussion of Section 4.1.4.EHLO命令中给出的域名必须是一个主主机名(一个解析为地址RR的域名),如果主机没有名称,则必须是一个地址文字,如4.1.3节所述,并将在4.1.4节的EHLO讨论中进一步讨论.
2.3.7 会话和应答 RFC 3463[25],指定应答字符串的进一步结构,包括使用补充的和更具体的完成代码(也请参阅RFC 5248[26])。
2.3.9 “bare” “CR” or “LF” characters in text SMTP client implementations MUST NOT transmit these characters except when they are intended as line terminators and then MUST, as indicated above, transmit them only as a
sequence. 2.4 SMTP命令和响应具有严格的语法。所有命令都以命令动词开头。所有的回复都以三位数字代码开始。默认状态下谓词和参数值不区分大小写,有SMTP拓展可以支持对大小写的区分。
2.4 邮箱的本地部分必须视为区分大小写。邮箱域遵循正常的DNS规则,因此不区分大小写。
2.4 当传输服务提供一个8位字节(八位)传输通道时,每个7位字符在一个八位组中(右对齐)被传输,高阶位被清除为零。非扩展SMTP服务只提供7位传输。客户机可以使用扩展的SMTP工具(尤其是“8BITMIME”扩展RFC 1652[22])向服务器请求8位消息内容传输。
2.4 如果没有显式允许它的服务器提供的扩展名,则发送SMTP系统不允许以US-ASCII以外的任何字符集发送信封命令。接收系统应拒绝此类命令,通常使用“500语法错误-无效字符”响应。
3 本节描述SMTP中使用的过程:会话发起、邮件事务、转发邮件、验证邮箱名称和展开邮件列表,以及打开和关闭交换。
3.1 SMTP协议允许服务器正式拒绝邮件会话,同时仍然允许初始连接:初始连接打开消息中可能给出554响应,而不是220响应。采用这种方法的服务器在关闭连接之前必须等待客户机发送QUIT,并且应该响应任何带有”503 bad sequence of commands”.
3.2 一旦服务器发送了问候语(欢迎)消息,客户端接收到该消息后,客户端通常向服务器发送EHLO命令,指示客户端身份。除了打开会话之外,EHLO的使用还表明客户机能够处理服务扩展和服务器提供其支持的扩展列表的请求。
3.3 SMTP邮件事务有三个步骤。MAIL FROM RCPT(可以有多个) DATA
3.3 MAILFROM 该命令告诉SMTP-receiver一个新的邮件事务正在启动,并将重置它的所有状态表和缓冲区,包括任何收件人或邮件数据。
3.3 MAIL FROM: RCPT TO: 冒号两侧均不能出现空格
3.3 发送DATA
标识数据传输,服务器如果接受会返回一个354的中间应答,并将所有后续行(直到但不包括邮件数据结束指示器)视为消息文本。当成功接收并存储文本末尾时,SMTP-receiver将发送一个“250 OK”响应。SMTP通过发送只包含 “.” 的行来指示邮件数据的结束。 3.3 I don’t know the meaning of this sentense. In particular, they MUST NOT reject messages in which the numbers of Resent-header fields do not match or Resent-to appears without Resent-from and/or Resent-date.
3.5.1 Use the EXPN command to verify whether a given mailbox exists on the local host.
3.6.2 中继SMTP服务器通常是指定它的DNS MX记录的目标,SMTP服务器如果出于策略原因拒绝将邮件转发到特定地址,则应该返回一个550响应。
3.6.3 如果一个SMTP服务器已接受的任务传送邮件,后来发现,目的地是不正确的,或者交付的邮件不能因为一些其他的原因,那么它必须构造一个“无法投递的邮件”通知消息并将其发送到发起人无法投递的邮件(reversepath)所显示的那样。
3.6.3 在错误报告中防止循环的一种方法是在通知消息的邮件命令中指定null反向路径。When such a message is transmitted, the reverse-path MUST be set to null (see Section 4.5.5 for additional discussion).>当传输这样的消息时,必须将反向路径设置为null(有关其他讨论,请参见第4.5.5节)。
1
MAIL FROM:<>
3.6.3 a relay SMTP has no need to inspect or act upon the header section or body of the message data and MUST NOT do so except to add its own “Received:” header field.
3.7.2 When forwarding a message into or out of the Internet environment, a gateway MUST prepend a Received: line, but it MUST NOT alter in any way a Received: line that is already in the header section. 网关必须预先添加一个Received: line,但是它不能以任何方式更改已经在标题部分中的Received: line。网关应该在它提供的接收报头字段的“via”子句中指出环境和协议。
3.7.4 网关必须确保它转发到Internet邮件环境中的消息的所有头字段都满足要求。特别是,“From:”、“To:”、“Cc:”等中的所有地址,头字段必如果须被转换需要符合RFC 5322的标准头语法,必须只引用完全限定的域名,并且必须在发送回复时有效。用于将邮件从Internet协议转换为另一个环境的协议的转换算法应该确保来自外部邮件环境的错误消息从SMTP信封传递到反向路径,而不是传递到“from:”、“Sender:”或类似消息头字段中的地址。
3.8 结束回话和连接 服务器应该能够容忍未知的命令,发出500响应并等待客户机的进一步指令。
3.9 支持smtp的主机应该同时支持别名和地址扩展的列表模型,以便进行多次交付。当消息传递或转发到扩展列表表单的每个地址时,信封中的返回地址(“MAIL FROM:”)必须更改为管理列表的个人或其他实体的地址。
3.9 邮件组功能 一个重要的邮件功能是通过将一个伪邮箱地址转换为一个目标邮箱地址列表来实现单个消息的多目的地交付的机制。当消息被发送到这样一个伪邮箱时,副本被转发或重新分发到扩展列表中的每个邮箱。根据扩展规则,我们将这种伪邮件框分类为“别名”或“列表”。
4.1 SMTP命令 SMTP命令是由
结束的字符串。命令本身是字母字符,如果后面跟着参数,则以 结尾,否则以 结尾。可以容忍行末空格。 4.1.1 The reverse-path is the argument of the MAIL command, the forward-path is the argument of the RCPT command, and the mail data is the argument of the DATA command.
4.1.1.1 HELO/EHLO命令 命令参数包含SMTP客户机的完全限定域名(如果有的话),如果没有有意义的域名,客户端应该发送一个地址文本。
4.1.1.2 MAIL
4.1.1.3 RCPT TO
4.1.1.4 DATA 接收方通常向数据发送一个354响应,然后将命令后面的行(以
序列结尾的字符串,如2.3.7节所述)视为来自发送方的邮件数据。 . 结束。 4.1.1.6 VRFY 确认用户是否存在
4.1.1.7 EXPN确认mailing list是否存在。
4.1.1.11 如果服务器SMTP不能识别或不能实现与特定邮件FROM或RCPT TO命令关联的一个或多个参数,它将返回代码555。
4.1.2 详细介绍命令的符号表述 格式
4.1 2 Systems MUST NOT define mailboxes in such a way as to require the use in SMTP of non-ASCII characters (octets with the high order bit set to one) or ASCII “control characters” (decimal value 0-31 and 127).系统不能以要求在SMTP中使用非ASCII字符(高阶位设置为1的八进制)或ASCII“控制字符”(十进制值0-31和127)的方式定义邮箱。这些字符不能用于邮件或RCPT命令或其他需要邮箱名称的命令。
4.1.2 反斜杠“\”是一个引用字符,用于表示下一个字符将按字面意思使用(而不是按其正常解释)。
4.1.2 遵循DNS服务器命名一贯规定,字符外的一组字母字符,数字,字符不应出现在SMTP客户端或服务器的域名标签。特别是,下划线字符是不允许的。如果SMTP服务器接收的命令中使用了无效的字符代码,并且没有其他原因拒绝该命令,则必须拒绝响应为501的命令。
4.1.4 使用EHLO命令初始化包含邮件事务的会话。
4.1.4 如果事务开始命令参数不可接受,则必须返回501故障响应。如果事务中的命令发生故障,以致服务器无法处理它们,则必须返回一个503故障响应。
1 | If no MX records are found, but an A RR is found, the A RR is treated as if it was associated with an implicit MX RR, with a preference of 0, pointing to that host. If one or more MX RRs are found for a given name, SMTP systems MUST NOT utilize any A RRs associated with that name unless they are located using the MX RRs; the "implicit MX" rule above applies only if there are no MX records present. If MX records are present, but none of them are usable, this situation MUST be reported as an error. |