Exim条件付きロジック

Exim条件付きロジック

私は、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

関連情報