跳转到主要内容

于 2025年04月22日 摘录自 Postfix XCLIENT Howto

XCLIENT 扩展在 SMTP 中的用途

当 SMTP 服务器声明支持 XCLIENT 命令时,SMTP 客户端可发送覆盖一个或多个客户端相关会话属性的信息。XCLIENT 命令旨在解决以下问题:

  1. 访问控制测试。当访问控制规则仅由远程客户端触发时,SMTP 服务器访问规则难以验证。为了便于访问规则测试,授权的 SMTP 客户端测试程序需要能够在整个 SMTP 会话期间覆盖 SMTP 服务器对 SMTP 客户端主机名、网络地址及其他客户端信息的识别。
  2. 从上游邮件服务器下载邮件并通过 SMTP 注入本地 MTA 的客户端软件。为了利用本地 MTA 的 SMTP 服务器访问规则,客户端软件需要能够覆盖 SMTP 服务器对远程客户端名称、客户端地址及其他信息的识别。此类信息通常可从上游邮件服务器的 Received: 消息头中提取。
  3. 后置过滤访问控制和日志记录。对于采用"互联网→过滤器→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 月。