domain.com
和domain.net
托管在同一台服务器上server1
。为避免垃圾邮件和病毒,所有外发电子邮件(甚至发送到本地域的电子邮件)都需使用第三方服务进行扫描。因此,从[email protected]
到 的电子邮件[email protected]
应离开server1
,然后在 之外进行检查server1
,然后根据其 MX 记录将其发送到server1
,即其来源地。
这里我们以一个循环结束:Too many "Received" headers - suspected mail loop
。
以下是我所拥有的:
smarthost_relay:
driver = manualroute
ignore_target_hosts = 127.0.0.0/8
condition = ${if !inlist{$sender_host_address}{<; 46.xxx.xxx.xxx }}
condition = ${if or {{!eq{$sender_address}{}} {!eq{$sender_host_address}{}}}}
condition = '${perl{check_limits}}'
transport = auth_relay
route_list = $domain 46.xxx.xxx.xxx::587
same_domain_copy_routing = yes
no_more
此处$sender_host_address
没有像我预期的那样工作。因为远程检查后收到电子邮件时它是空的。我错过了什么?如何实现它?
问候,亚历克斯。
答案1
您可能希望在邮件处理期间在 ACL 中设置 ACL 变量,以指示该邮件是从 SPAM 过滤器收到的。有多个通常未定义的 ACL 可用于此目的。类似这样的 ACL 块应通过 IP 或 DNS 名称检测垃圾邮件过滤器:
warn
hosts = 46.xxx.xxx.xxx : spamfilter.example.com
set acl_c9 = SPAMFiltered
logwrite = Received from SPAM Filter server
然后使用传输中的变量进行简单检查。
condition = ${if eq {$acl_c9}{}}
一旦您知道它正在运行,您就可以从 ACL 中删除 log_write。
为了使其正常工作,您需要确保您没有使用 TURN 或 ETRN 在用于发送垃圾邮件过滤消息的连接上接收邮件。
如果您想尝试修改您的条件,您可能需要查看 match_ip 运算符而不是 in_list。
要过滤掉同一域内路由的消息,请尝试如下路由器条件:
domains = ! $sender_address_domain
答案2
我添加了以下几行acl_check_mail:
warn hosts = ! 46.xxx.xxx.xxx
set acl_m_filtered = 0
add_header = X-Received-SPAM-Filtered: $acl_m_filtered
warn hosts = 46.xxx.xxx.xxx
set acl_m_filtered = 1
add_header = X-Received-SPAM-Filtered: $acl_m_filtered
并condition = ${if eq {$acl_m_filtered}{0}{yes}{no}}
在我的路由器中检查。
到目前为止没有循环;)