SMTP 的 XFORWARD 扩展目的
当 SMTP 服务器声明支持 XFORWARD 命令时,SMTP 客户端可发送覆盖一个或多个客户端相关日志属性的信息。XFORWARD 命令旨在解决以下问题:
- SMTP 基于内容过滤后的日志记录。随着互联网→MTA1→过滤器→MTA2 风格的内容过滤应用程序的部署,当 MTA1 将邮件传递给内容过滤器时,客户端和消息标识信息的日志记录会发生变化。为了简化 MTA2 日志的解释,如果 MTA1 能够通过内容过滤器将远程客户端和/或消息标识信息转发给 MTA2,以便这些信息作为邮件处理交易的一部分进行日志记录,将非常有帮助。
此扩展以独立的 ESMTP 命令形式实现,可用于增量传输客户端或消息属性。该功能未通过在 MAIL FROM 命令中传递额外参数实现,因为此方法会要求将 MAIL FROM 命令的长度限制再增加 600 个字符或更多,而该空间已用于支持其他扩展(如 AUTH 和 DSN)。
XFORWARD 命令语法
本文件末尾给出了一个客户端-服务器对话示例。
在 SMTP 服务器 EHLO 响应中,与该扩展相关的关键字为 XFORWARD。该关键字后跟 XFORWARD 实现支持的属性名称。
在收到服务器关于 XFORWARD 支持的公告后,客户端可在除邮件传输交易中间(即 MAIL 和 RSET 或 DOT 之间)的任何时间发送 XFORWARD 请求。若服务器支持 ESMTP 命令管道化,该命令可被管道化。
XFORWARD 请求的语法如下。大写且带引号的字符串表示终端,小写字符串表示元终端,SP 表示空白。尽管命令和属性名称以大写形式显示,但实际上它们不区分大小写。
xforward-command = "XFORWARD" 1*( SP attribute-name "=" attribute-value )
attribute-name = ( "NAME" | "ADDR" | "PORT" | "PROTO" | "HELO" | "IDENT" | "SOURCE" )
attribute-value = xtext
- 属性值按 RFC 1891 规范进行 xtext 编码。
- NAME 属性指定上游主机名,或当信息不可用时为 [UNAVAILABLE]。主机名可以是非 DNS 主机名。
- ADDR 属性指定上游网络地址:一个数值形式的 IPv4 网络地址、以 "IPV6:" 前缀的 IPv6 地址,或当地址信息不可用时为 [UNAVAILABLE]。地址信息不包含在 [] 中。
- PORT 属性指定上游客户端的 TCP 端口号(十进制形式),或当信息不可用时为 [UNAVAILABLE]。
- PROTO 属性指定从上游主机接收邮件的邮件协议。这可以是长度不超过 64 个字符的 SMTP 或非 SMTP 协议名称,或当信息不可用时为 [UNAVAILABLE]。
- HELO 属性指定上游主机自我宣布的主机名(不一定通过 SMTP HELO 命令),或当信息不可用时为 [UNAVAILABLE]。主机名可以是非 DNS 主机名。
- IDENT 属性指定上游主机上的本地消息标识符,或当信息不可用时为 [UNAVAILABLE]。下游 MTA 可将此信息与自身本地消息标识符一起记录,以便在 MTA 之间跟踪消息。
- SOURCE 属性指定消息来自上游主机本地源时为 "LOCAL"(例如消息由上游主机本身发送),其他邮件为 "REMOTE",或当信息不可用时为 [UNAVAILABLE]。下游 MTA 可选择对来自本地源的邮件启用标题修改或地址资格验证等功能,但对其他来源的邮件不启用。
注释 1:属性值元素的长度不得超过 255 个字符(特定属性可能要求更短的长度)。经过 xtext 解码后,属性值不得包含控制字符、非 ASCII 字符、空格或其他在消息头中具有特殊含义的字符。
注释 2:DNS 主机名最长可达 255 个字符。XFORWARD 客户端实现不得发送超过 SMTP 命令 512 个字符限制的 XFORWARD 命令。
注释 3:[UNAVAILABLE] 可使用大写、小写或混合大小写形式指定。
注释 4:Postfix 2.3 之前的实现不进行 xtext 编码属性值。希望与这些旧实现互操作的服务器应准备接收未编码的信息。
XFORWARD 服务器操作
服务器维护一组包含转发信息的 XFORWARD 属性,此外还维护当前 SMTP 会话属性。通常,所有 XFORWARD 属性处于未定义状态,服务器使用当前 SMTP 会话属性进行日志记录。
收到初始 XFORWARD 命令时,SMTP 服务器将所有 XFORWARD 属性初始化为 [UNAVAILABLE]。每次收到有效的 XFORWARD 命令时,服务器都会用指定的值更新 XFORWARD 属性。
服务器不得将 XFORWARD 中的客户端属性与当前 SMTP 会话中的客户端属性混合使用。
在每个 MAIL FROM 事务结束时(即 RSET 或 DOT),服务器将所有 XFORWARD 属性重置为未定义状态,并准备接收另一个初始 XFORWARD 命令。
XFORWARD 服务器响应代码
代码 含义 250 成功 421 无法继续,正在断开连接 501 命令参数语法错误 503 邮件传输中 550 授权不足
XFORWARD 示例
在以下示例中,客户端发送的信息以粗体显示。
220 server.example.com ESMTP Postfix EHLO client.example.com 250-server.example.com 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-XFORWARD NAME ADDR PROTO HELO 250 8BITMIME XFORWARD NAME=spike.porcupine.org ADDR=168.100.189.2 PROTO=ESMTP 250 Ok XFORWARD HELO=spike.porcupine.org 250 Ok MAIL FROM:<[email protected]> 250 成功 RCPT TO:<[email protected]> 250 成功 DATA 354 以 <CR><LF>.<CR><LF> 结束数据 ...消息内容... . 250 成功:已排队为 3CF6B2AAE8 QUIT 221 再见
安全
XFORWARD 命令会更改审计记录。此命令的使用必须限制在授权客户端。
SMTP 连接缓存
SMTP 连接缓存使在同一 SMTP 会话中传输多个消息成为可能。XFORWARD 属性在 MAIL FROM 交易完成后(在 RSET 或 DOT 之后)会被重置,因此不存在信息泄露的风险。
参考文献
Moore, K, "SMTP Service Extension for Delivery Status Notifications", RFC 1891, January 1996.