手动路由中扩展字符串失败

手动路由中扩展字符串失败

我尝试根据 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 记录,因此查找会将结果连接起来,并以 分隔(这由查找值开头的:指定)。查找给出的值用于,它将结果与正则表达式进行比较(将字符视为新行的开头)。如果结果匹配,则条件结果为,否则为,在这种情况下路由器会拒绝。>:dnsdbmatch:yesno

值得一提的是,exim 具有出色的调试输出,因此如果您遇到困难,只需像这样以调试模式启动 exim:

exim4 -d+all -bd -oX 25252 2>&1|tee exim-debuglog.txt

此后,连接到给定端口 ( 25252) 并尝试发送一条简单消息将使 exim 写入有关处理该消息的所有信息,包括 ACL、路由器和变量扩展的阶段。如果您试图弄清楚某条规则不起作用的原因,它可能会派上用场。

相关内容