使用 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