XCLIENT 扩展在 SMTP 中的用途
当 SMTP 服务器声明支持 XCLIENT 命令时,SMTP 客户端可发送覆盖一个或多个客户端相关会话属性的信息。XCLIENT 命令旨在解决以下问题:
- 访问控制测试。当访问控制规则仅由远程客户端触发时,SMTP 服务器访问规则难以验证。为了便于访问规则测试,授权的 SMTP 客户端测试程序需要能够在整个 SMTP 会话期间覆盖 SMTP 服务器对 SMTP 客户端主机名、网络地址及其他客户端信息的识别。
- 从上游邮件服务器下载邮件并通过 SMTP 注入本地 MTA 的客户端软件。为了利用本地 MTA 的 SMTP 服务器访问规则,客户端软件需要能够覆盖 SMTP 服务器对远程客户端名称、客户端地址及其他信息的识别。此类信息通常可从上游邮件服务器的 Received: 消息头中提取。
- 后置过滤访问控制和日志记录。对于采用"互联网→过滤器→MTA"架构的内容过滤应用,若过滤器能将邮件中继及其他访问控制决策委托给MTA,则可简化过滤器实现。这在过滤器作为SMTP命令透明代理时尤为有用。为此,过滤器需具备覆盖MTA对SMTP客户端主机名、网络地址等信息的认知的权限。
XCLIENT 命令语法
本文末尾给出了一个客户端-服务器对话示例。
在 SMTP 服务器 EHLO 响应中,与该扩展关联的关键词是 XCLIENT。其后跟随 XCLIENT 实现支持的属性名称。
XCLIENT 命令可在任何时间发送,但不得在邮件传输交易过程中(即 MAIL 和 DOT 之间,或 MAIL 和 RSET 之间)发送。当服务器支持 ESMTP 命令管道时,XCLIENT 命令可进行管道传输。为避免触发垃圾邮件检测器,该命令应在命令组末尾发送。
XCLIENT 请求的语法如下。大写字符串和带引号的字符串指定终端,小写字符串指定元终端,SP 表示空格。尽管命令和属性名称以大写形式显示,但实际上它们不区分大小写。
xclient-command = "XCLIENT" 1*( SP attribute-name "=" attribute-value )
attribute-name = ( "NAME" | "ADDR" | "PORT" | "PROTO" | "HELO" | "LOGIN" | "DESTADDR" | "DESTPORT" )
attribute-value = xtext
- 属性值按 RFC 1891 规范进行 xtext 编码。
- NAME 属性指定远程 SMTP 客户端的主机名(而非 SMTP 客户端地址),当客户端主机名解析失败且错误为永久性时为 [UNAVAILABLE],或当解析错误为临时性时为 [TEMPUNAVAIL]。
- ADDR 属性指定远程 SMTP 客户端的数值 IPv4 网络地址、以 "IPV6:" 前缀的 IPv6 地址,或当地址信息不可用时为 [UNAVAILABLE]。地址信息不包含在 [] 中。
- PORT 属性指定远程 SMTP 客户端的 TCP 端口号,以十进制数表示,或当信息不可用时为 [UNAVAILABLE]。
- PROTO 属性指定 SMTP 或 ESMTP。
- DESTADDR 属性指定本地 SMTP 服务器数值 IPv4 网络地址、以 "IPV6:" 前缀的 IPv6 地址,或地址信息不可用时的 [UNAVAILABLE]。地址信息不包含在 [] 中。
- DESTPORT 属性指定本地 SMTP 服务器的 TCP 端口号,以十进制数表示,或当信息不可用时显示为 [UNAVAILABLE]。
- HELO 属性指定 SMTP HELO 参数的值,或当信息不可用时显示为 [UNAVAILABLE]。
- LOGIN 属性指定 SASL 登录名称,或当信息不可用时为 [UNAVAILABLE]。
注释 1:语法上有效的 NAME 和 HELO 属性值元素最长可达 255 个字符。客户端不得发送超过 SMTP 命令 512 个字符限制的 XCLIENT 命令。为避免超出限制,客户端应将信息分多个 XCLIENT 命令发送;例如,在发送 HELO 和 PROTO 后再发送 NAME 和 ADDR。一旦发送了 ADDR,客户端通常不再被授权发送 XCLIENT 命令。
注释 2:[UNAVAILABLE]、[TEMPUNAVAIL] 和 "IPV6:" 可以使用大写、小写或混合大小写形式指定。
注释 3:Postfix 2.3 之前的实现不进行 xtext 编码属性值。希望与这些旧实现互操作的服务器应准备接收未编码的信息。
注释 4:PORT 属性在 Postfix 2.5 及更高版本中实现;LOGIN 属性在 Postfix 2.9 及更高版本中实现。
XCLIENT 服务器响应
收到格式正确的 XCLIENT 命令后,服务器将状态重置为初始 SMTP 问候协议阶段。根据可选访问决策的结果,服务器将返回 220 或适当的拒绝代码。
出于实际考虑,并非总是能够将服务器状态完全重置为初始 SMTP 问候协议阶段:
- TLS 会话信息可能无法重置,因为关闭 TLS 会使连接处于未定义状态。因此,服务器可能不会在 TLS 已激活时宣布 STARTTLS,且访问决策可能受 XCLIENT 命令之前接收的客户端证书信息影响。
- SMTP 服务器不得重置通过最后一个 XCLIENT 命令接收的属性。这包括 HELO 或 PROTO 属性。
注意:Postfix 2.3 之前的实现不会回退到初始 SMTP 问候协议阶段。这些旧实现可能在某些条件下无法正确模拟连接级访问决策。
XCLIENT 服务器响应代码
代码 含义 220 成功 421 无法继续,正在断开连接 501 命令参数语法错误 503 邮件交易正在进行中 550 授权不足 其他 连接被连接级访问决策拒绝
XCLIENT 示例
在示例中,客户端通过 XCLIENT 命令传递所有 SMTP 客户端信息,以模拟邮件源系统。客户端发送的信息以粗体显示。
220 server.example.com ESMTP Postfix EHLO client.example.com 250-server.example.com 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-XCLIENT NAME ADDR PROTO HELO 250 8BITMIME XCLIENT NAME=spike.porcupine.org ADDR=168.100.189.2 220 server.example.com ESMTP Postfix EHLO spike.porcupine.org 250-server.example.com 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-XCLIENT NAME ADDR PROTO HELO 250 8BITMIME MAIL FROM:<[email protected]> 250 Ok RCPT TO:<[email protected]> 250 Ok DATA 354 End data with <CR><LF>.<CR><LF> ...message content... . 250 Ok: queued as 763402AAE6 QUIT 221 Bye
安全
XCLIENT 命令会更改审计日志和/或 SMTP 客户端访问权限。此命令的使用必须限制为授权的 SMTP 客户端。
SMTP 连接缓存
XCLIENT 属性在 SMTP 会话结束前保持有效。如果一个会话用于代表不同 SMTP 客户端发送邮件,则在每个 MAIL FROM 命令前需根据需要重置 XCLIENT 属性。
参考
Moore, K, "SMTP 服务扩展:投递状态通知", RFC 1891, 1996 年 1 月。