私は、exim にドメインリストに対して送信メールと受信メールのドメインをチェックさせようとしています。送信メールの FROM アドレスと受信メールの TO/CC/BCC アドレスがローカル ドメインのリストにない場合は、メッセージを拒否/破棄したいのです。以下は、私が思いついたもので、"acl_not_smpt" セクションに配置されています。
discard
condition = ${if and {{! match_domain{${domain:${address:$h_from:}}}{+local_domains}}\
{if or {\
{! match_domain{${domain:${address:$h_to:}}}{+local_domains}}}\
{! match_domain{${domain:${address:$h_cc:}}}{+local_domains}}}\
{! match_domain{${domain:${address:$h_bcc:}}}{+local_domains}}}\
}\
}\
}\
message = Mail discarded for spoofing
しかし、exim ログに以下のエラーが表示されます。
「and{...}」条件内の不明な条件「if」
exim 構文については非常に初心者なので、助けていただければ幸いです。
答え1
2 番目if
は誤りであり、実際には必要ありません。and
条件には任意のブール関数を使用できます (cf.拡張条件)、一方、は$if
文字列を返します(cf.拡張アイテムそして展開演算子)。さらにいくつかの追加があります}
。動作条件は次のようになります。
condition = ${if and {\
{!match_domain{${domain:${address:$h_from:}}}{+local_domains}}\
{ or {\
{! match_domain{${domain:${address:$h_to:}}}{+local_domains}}\
{! match_domain{${domain:${address:$h_cc:}}}{+local_domains}}\
{! match_domain{${domain:${address:$h_bcc:}}}{+local_domains}}\
}}\
}}
この条件にはいくつかバグがあります。複数の受信者とFrom:
アドレスがないかどうかがチェックされます。
また、非SMTPACLは、(ローカル)ユーザーがexim4を-bm または -bS オプションつまり、ACL によりローカル ユーザーによる送信メールの送信がブロックされることになります。
それが目的であれば、式を簡略化することができます。
ヘッダーのチェックは
From:
Eximの設定によりより効果的に行うことができます。信頼できるユーザー。To:
、Cc:
およびを個別にチェックする代わりに、それらすべてを区切られた文字列に格納する変数 をBcc:
使用できます。$recipients
,
これらすべては、2 つの ACL スタンザに相当します。
accept
condition = ${if forall {<,${recipients}}\
{match_domain{${domain:${item}}}{+local_domains}}\
}
deny
一般に、 と のSMTP
電子メール ( とします) を作成 (または保存) しemail.eml
て実行することで、文字列拡張と非 ACL をデバッグできます。
exim4 -d-all+acl+expand -bm -t < email.eml
ルートとして(警告: これは実際の電子メール配信を試みます)、拡張のみをチェックするには次を実行します:
exim4 -bem email.eml