exim 路由文件状态

exim 路由文件状态

使用 exim4,我设置了使用外部 SMTP 服务器的路由。我使用的是 cPanel,它在文件 /etc/localdomains 中保存了服务器上本地设置的域列表。因此,我设置了一个条件,即只有当发件人地址域位于此文件中时,才通过此中继发送。这很好用。

但是现在我想添加另一个条件,以确保如果某个域在文件(例如 /etc/norelaydomains)中列出,则不应使用中继发送该域。我以为通过添加与确保域在 /etc/localdomains 中的条件类似的条件来使其工作是一件容易的事情,但这似乎无法正常工作(没有使用中继发送邮件)。

总结一下我想要的是:如果 sender_domain 在 /etc/localdomains 中,并且 sender_domain 不在 /etc/norelaydomains 中,则使用中继发送,否则使用本地邮件服务器发送。

我的正常设置可以正常工作:

my_route:
  condition = ${lookup {$sender_address_domain} \ 
lsearch {/etc/localdomains} {yes}}
  driver = manualroute
  domains = !+local_domains
  transport = my_relay
  route_list = * mysmtp.com

我尝试过的设置(使用此设置,邮件不会通过中继)

my_route:
  condition = ${lookup {$sender_address_domain} \ 
lsearch {/etc/localdomains} {yes}}
  condition = ${lookup{$sender_address_domain} \
lsearch{/etc/norelaydomains} {no}}
  driver = manualroute
  domains = !+local_domains
  transport = my_relay
  route_list = * mysmtp.com

任何帮助使其工作起来的帮助都将非常感激。

答案1

我懂了。

您的问题在于结果替换不完整。

${lookup{value}lsearch{file}}默认情况下返回已找到的字符串或空字符串。您可以通过结果替换来修改该行为:

${lookup{value}lsearch{file}{yes}}

yes如果在文件中找到值,则该版本返回,否则返回空字符串。但 exim 的条件评估仅将“是”、“真”和非零正数视为逻辑 TRUE。因此

${lookup{value}lsearch{file}{no}}

相当于

${lookup{value}lsearch{file}{no}{no}}

总是。当然,您的路由器永远不会被使用。您必须明确替换两个结果:

my_route:
  condition = ${lookup {$sender_address_domain}lsearch{/etc/localdomains} {yes}{no}}
  condition = ${lookup {$sender_address_domain}lsearch{/etc/norelaydomains} {no}{yes}}
  driver = manualroute
  domains = !+local_domains
  transport = my_relay
  route_list = * mysmtp.com

相关内容