我正在使用外部SRS守护进程(Debian软件包srs)设置exim 4。 srsd正在运行,并且将地址前后转换就好了。 我不能使用exim的内置srs代码,因为它在Debian中没有启用(知道我可以编译自己,但它不是一个选项)。
我遇到的问题是exim中的srs_forward路由器添加SRS标签到转发邮件。 我有下面的redirect路由器的地方,应该只运行非本地发件人和非本地收件人,这是不中继为另一个MX的错误消息 – 至less我明白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
我可以testing和工作的地方:返回path被正确生成(包含address_data和errors_to的行,以及to-address(以数据开始的行)。
我不确定的前提条件:
senders = ! :
这行应该防止路由器运行错误消息。
condition = ${if ! match_domain{$sender_address_domain}{+local_domains}}
此行应该防止路由器运行来自本地发件人的消息。
domains = ! +local_domains : ! +relay_to_domains
此行应阻止路由器运行消息到本地收件人或中继邮件。
有人可以澄清吗?
(我用手册作为出发点,虽然没有成功。)
你没有正确testing。 您传递给SRS守护程序的信息不正确:
FORWARD $sender_address_local_part@$sender_address_domain $domain\n
这不符合你的要求:$域包含收件人域,而不是发送域。 您打算重写邮件被转发到的域的返回path是光荣的,但不是这样的:消息在转发完成后到达您的SRS路由器,所以$ domain不包含域消息被发送到。 您应该使用$ primary_hostname或$ original_domain。 所以这行应该看起来像:
address_data = ${readsocket{/tmp/srsd}\ {FORWARD $sender_address_local_part@$sender_address_domain $original_domain\n}\ {5s}{\n}{:defer: SRS daemon failure}}
什么关系你的先决条件,他们没事。 您可以将“发件人”和“条件”线路放在一起:
senders = ! : ! *@+local_domains
您只需要确保域列表local_domains确实包含了您的所有本地域(至less应包含当前路由的消息$ original_domain和$ sender_address_domain)。
请logging您的configuration,如果您的代码正在运行,并给我们一些提示。 您需要安排更多的事情:ACL来validation传入的SRS标记的反弹消息,不标记SRS标记的邮件用于灰名单,不反弹的反弹,确保不添加任何其他标记如BATV到传出消息,解决方法接受SRS标记的消息与捣毁的情况下,重写反弹错误消息文本,不包括SRS标记的发件人地址,也许否认任何非标记反弹等,所以一个很好的教程,将不胜感激。 感谢名单!