Exim

exim 路由文件條件

  • October 28, 2014

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

引用自:https://serverfault.com/questions/640346