使用exim4我已经build立了一个使用外部SMTP服务器的路由。 我使用的是cPanel,在服务器上保存本地设置的域列表:/ etc / localdomains。 因此,如果发件人地址域在这个文件中,我已经设置了一个条件,只通过这个中继发送。 这工作得很好。
但是现在我想添加另一个条件来确保如果一个域被列在一个文件中,说/ etc / norelaydomains不应该使用中继来发送。 我认为通过添加一个类似的条件来确保这个域是在/ etc / localdomains中是一件容易的事,但是这似乎不能正常工作(不使用中继发送邮件)。
回顾一下我想要的是:如果sender_domain是IN / 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
得到这个工作的任何帮助将不胜感激。
我懂了。
您的问题是在不完整的结果replace。
${lookup{value}lsearch{file}}默认返回find的string或空string。 您可以通过结果replace修改该行为:
${lookup{value}lsearch{file}{yes}}
如果在文件中find了值,那么该版本返回yes否则返回空string。 但是,exim的条件评估只有“是”,“是”和非零的正面评估才是合乎逻辑的。 因此
${lookup{value}lsearch{file}{no}}
相当于
${lookup{value}lsearch{file}{no}{no}}
总是。 当然,你的路由器永远不会被使用。 你必须明确地replace两个结果:
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