跳转到主要内容

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

Postfix VERP 支持

Postfix 1.1 及更高版本支持按需使用可变信封返回路径地址。当请求 VERP 风格的投递时,每个消息的收件人都会收到一份定制的邮件副本,其中其自身的收件人地址被编码到信封发件人地址中。

例如,当请求 VERP 风格的投递时,Postfix 会从 "owner-listname@origin" 投递邮件给收件人 "user@domain",发件人地址会以以下方式编码收件人:

owner-listname+user=domain@origin

因此,无法投递的邮件可以揭示无法投递的收件人地址,而无需列表所有者解析退信消息。

VERP 概念由 qmail MTA 和 ezmlm 邮件列表管理器推广。有关此概念的详细信息,请参阅 http://cr.yp.to/proto/verp.txt

本文档涵盖的主题:

Postfix VERP 配置参数

在 Postfix 中,整个过程由四个配置参数控制。

default_verp_delimiters(默认值:+=)

当请求 VERP 风格投递但未显式指定分隔符时,Postfix 使用哪些 VERP 分隔符字符。

verp_delimiter_filter (默认值:-+=)

Postfix 在 sendmail 命令行和 SMTP 命令中接受的 VERP 分隔符字符。许多字符不能用作 VERP 分隔符,因为它们在电子邮件地址中已有特殊含义(如 @ 或 %),因为它们是用户名或域名的一部分(如字母数字字符),或者因为它们是非 ASCII 字符或控制字符。而且,有些字符可能会触发易受攻击的软件中的漏洞,我们当然不希望这种情况发生。

smtpd_authorized_verp_clients(默认值:无)

允许请求 VERP 风格传输的 SMTP 客户端。Postfix QMQP 服务器使用自己的访问控制机制,本地提交(通过 /usr/sbin/sendmail 等)始终被授权。要授权一个主机,列出其名称、IP 地址、子网(网段/掩码)或父域名。

在 Postfix 版本 1.1 和 2.0 中,此参数称为 authorized_verp_clients(默认值:$mynetworks)。

disable_verp_bounces(默认值:no)

对于多收件人的 VERP 邮件,发送一份退信报告,而不是为每个收件人发送一份退信报告。默认设置(每个收件人一份)是 ezmlm 所需要的。

在 majordomo 等邮件列表中使用 VERP

为了使 VERP 与 majordomo 等邮件列表配合使用,您需要配置列表管理器以按照以下两种形式之一提交邮件:

Postfix 2.3 及更高版本:

% sendmail -XV -f owner-listname other-arguments...
% sendmail -XV+= -f owner-listname other-arguments...

Postfix 2.2 及更早版本(Postfix 2.3 为了向后兼容仍支持旧语法,但会记录一个警告以提醒您使用新语法):

% sendmail -V -f owner-listname other-arguments...
% sendmail -V+= -f owner-listname other-arguments...

第一种形式使用默认的 main.cf VERP 分隔符字符。第二种形式允许您显式指定 VERP 分隔符字符。示例中显示了推荐的值。

本文假设您已设置了一个 owner-listname 别名,用于将无法投递的邮件转发给实际人员:

/etc/aliases:
owner-listname: yourname+listname

为了处理退信,我们将大量使用地址扩展技巧。

您需要告知 Postfix,+ 是地址与其可选地址扩展之间的分隔符,地址扩展将附加到 .forward 文件名中,并且在进行别名展开时应丢弃地址扩展:

/etc/postfix/main.cfrecipient_delimiter = +
forward_path = $home/.forward${recipient_delimiter}${extension},
$home/.forward
propagate_unmatched_extensions = canonical, virtual

(最后两个参数设置为默认设置)。

您需要创建一个名为 .forward+listname 的文件,其中包含处理发送到 owner-listname 地址的所有邮件的命令:

~/.forward+listname:
"|/some/where/command ..."

完成上述设置后,发送到 user@domain 的无法投递的邮件将被退回至以下地址:

[email protected]

该邮件将由 .forward+listname 文件中的命令处理。邮件应包含以下内容,其中包括一个包含收件人发送地址的 To: 标头:

To: [email protected]

读者可自行解析 To: 标头行并从收件人地址中提取 user=domain 部分。

Postfix SMTP 服务器对 VERP 的支持

Postfix SMTP 服务器通过 XVERP 命令启用 VERP 风格的邮件传输。该命令支持两种语法形式:

MAIL FROM:<sender@domain> XVERP
MAIL FROM:<sender@domain> XVERP=+=

第一种形式使用默认的 main.cf VERP 分隔符,第二种形式显式覆盖它们。所示值为推荐值。

您可以使用smtpd_command_filter功能,将XVERP附加到来自旧版软件的SMTP命令中。这需要Postfix 2.7或更高版本。

/etc/postfix/main.cfsmtpd_command_filter = pcre:/etc/postfix/append_verp.pcre
smtpd_authorized_verp_clients = $mynetworks
/etc/postfix/append_verp.pcre:
/^(MAIL FROM:<listname@example\.com>.*)/ $1 XVERP

Postfix sendmail 命令中的 VERP 支持

Postfix sendmail 命令有一个 -V 标志,用于请求 VERP 风格的投递。指定以下两种形式之一:

Postfix 2.3 及更高版本:

% sendmail -XV -f owner-listname ....
% sendmail -XV+= -f owner-listname ....

Postfix 2.2 及更早版本(Postfix 2.3 为了向后兼容仍支持旧语法,但会记录一条警告以提醒您使用新语法):

% sendmail -V -f owner-listname ....
% sendmail -V+= -f owner-listname ....

第一种形式使用默认的 main.cf VERP 分隔符,第二种形式显式覆盖它们。显示的值是推荐值。

Postfix QMQP 服务器中的 VERP 支持

当 Postfix QMQP 服务器收到带有以下形式的信封发件人地址的邮件时:

[email protected]@[]

Postfix 会生成发件人地址 "[email protected]",使用 "-=" 作为 VERP 分隔符,因为 qmail/ezmlm 期望此格式。

更一般地,发件人地址为 "prefix@origin-@[]" 时,请求以 VERP 风格进行投递,发件人地址格式为 "prefixuser=domain@origin"。然而,Postfix 仅允许使用通过 verp_delimiter_filter 参数指定的 VERP 分隔符。特别是,为了与 qmail 兼容,必须使用 "=" 分隔符(详见 qmail addresses(5) 手册页)。