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
任何幫助使它工作將不勝感激。
我懂了。
您的問題在於不完整的結果替換。
${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