![手动路由中扩展字符串失败](https://linux22.com/image/752961/%E6%89%8B%E5%8A%A8%E8%B7%AF%E7%94%B1%E4%B8%AD%E6%89%A9%E5%B1%95%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%A4%B1%E8%B4%A5.png)
我尝试根据 mx 记录添加重定向的路线。
但我的正则表达式从来不起作用。
Exim 4.90,操作系统 ubontu 18.04。
我的配置:
non_mydom_mx:
driver = manualroute
#condition = ${lookup dnsdb{mxh=^mx\d\.mydom\.net}{true}fail}
condition = ${lookup dnsdb{mxh=^.*\$}{true}fail}
transport = non_mydom
route_list = * 192.168.0.11
测试路由失败:
[email protected]
<-- [email protected]
router = dnslookup, transport = remote_smtp
host mx1.mydom.net [xxxx] MX=10
host mx2.mydom.net [xxxx] MX=20
答案1
这里有几个问题。较小的问题是$
正则表达式末尾的 未转义,因此 exim 认为它是变量的开头。这导致表达式无法扩展。
更大的问题是dnsdb
查找执行的是一个简单的 DNS 查询,仅此而已。在查找中提供正则表达式是没有意义的,因为这样查询就会变得模棱两可。在您的例子中,查找类似于“给我一个 MX 地址,我不在乎哪个”,这显然行不通。即使您转义了符号$
,exim 也不会扩展给定的正则表达式,而是尝试查找名为 的主机的 MX 记录^.*$
。
基于 MX 记录的路由可以按如下方式进行:
non_mydom_mx:
driver = manualroute
condition = ${if match {${lookup dnsdb{>: mxh=$domain}}}{[^:]\d\.mydom\.net}{yes}{no} }
transport = non_mydom
route_list = * 192.168.0.11
在这里,您查询收件人域的 MX 主机名。由于域往往具有更多 MX 记录,因此查找会将结果连接起来,并以 分隔(这由查找值开头的:
指定)。查找给出的值用于,它将结果与正则表达式进行比较(将字符视为新行的开头)。如果结果匹配,则条件结果为,否则为,在这种情况下路由器会拒绝。>:
dnsdb
match
:
yes
no
值得一提的是,exim 具有出色的调试输出,因此如果您遇到困难,只需像这样以调试模式启动 exim:
exim4 -d+all -bd -oX 25252 2>&1|tee exim-debuglog.txt
此后,连接到给定端口 ( 25252
) 并尝试发送一条简单消息将使 exim 写入有关处理该消息的所有信息,包括 ACL、路由器和变量扩展的阶段。如果您试图弄清楚某条规则不起作用的原因,它可能会派上用场。