我正在努力使用外部 SRS 守护程序(Debian 软件包 srs)设置 exim 4。srsd 正在运行并且可以很好地来回转换地址。我不能使用 exim 的内置 srs 代码,因为它在 Debian 中没有启用(知道我可以自己编译,但这不是一个选项)。
我遇到的问题是 exim 中的 srs_forward 路由器将 SRS 标签添加到转发的邮件。我有以下重定向路由器,它应该只为来自非本地发件人和非本地收件人的非错误消息运行,而不是为另一个 mx 中继 - 至少我理解 srs 将应用于此类消息。请纠正我,如果这是错误的。我有以下代码:
srs_forward:
debug_print = "R: srs_forward for $local_part@$domain"
driver = redirect
senders = ! :
condition = ${if ! match_domain{$sender_address_domain}{+local_domains}}
domains = ! +local_domains : ! +relay_to_domains
address_data = ${readsocket{/tmp/srsd}\
{FORWARD $sender_address_local_part@$sender_address_domain $domain\n}\
{5s}{\n}{:defer: SRS daemon failure}}
errors_to = ${quote_local_part:${local_part:$address_data}}@${domain:$address_data}
data = ${quote_local_part:$local_part}@$domain
headers_add = X-SRS: Sender address rewritten from $sender_address to ${quote_local_part:${local_part:$address_data}}@$$
repeat_use = false
allow_defer
no_verify
我可以测试和工作的内容:正确生成返回路径(带有address_data和errors_to的行,以及to-address(以数据开头的行)。
我不确定前提条件:
senders = ! :
此行应防止路由器运行错误消息。
condition = ${if ! match_domain{$sender_address_domain}{+local_domains}}
此行应防止路由器运行来自本地发件人的消息。
domains = ! +local_domains : ! +relay_to_domains
此行应防止路由器运行发送给本地收件人的消息或中继消息。
有人可以澄清一下吗?
(我使用手册作为起点,虽然没有成功。)
你没有正确测试。您传递给 SRS 守护程序的信息不正确:
这不符合您的要求: $domain 包含收件人域而不是发送域。您打算将返回路径重写到转发邮件的域的意图是光荣的,但不会像这样工作:转发完成后,邮件会到达您的 SRS 路由器,因此 $domain 不再包含域消息被发送到。您应该使用 $primary_hostname 或 $original_domain。所以这条线应该是这样的:
与您的先决条件有关的,它们都很好。您可以将“发件人”和“条件”行放在一起:
您只需要确保域列表 local_domains 确实包含您的所有本地域(至少它应该包含当前路由的消息 $original_domain 和 $sender_address_domain)。
如果您的代码正在运行,请记录您的配置并在此处给我们一些提示。您还需要安排几件事:ACL 验证传入 SRS 标记的退回邮件,取消标记 SRS 标记的邮件以列入灰名单,取消标记退回,确保不要将任何其他标签(如 BATV)添加到传出邮件中,解决方法以接受带有 SRS 标记的邮件粉碎的情况下,重写退回错误消息文本以不包括 SRS 标记的发件人地址,可能拒绝任何未标记的退回,等等。所以一个好的教程将不胜感激。谢谢!