Условная логика 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 появляется следующая ошибка:

неизвестное условие "если" внутри условия "и{...}"

Совсем новичок в синтаксисе exim, буду признателен за помощь.

решение1

Второе ifневерно и на самом деле оно вам не нужно: andусловия могут использовать любую булеву функцию (ср.условия расширения), а $ifвозвращает строку (ср.предметы расширенияиоператоры расширения). Также есть некоторые дополнительные }. Рабочее состояние становится:

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:адресов.

Заметьте также, чтоacl_not_smtpACL запускается только тогда, когда (локальный) пользователь вызывает exim4 с помощьюопция -bm или -bS. Это означает, что ваш ACL будет блокировать отправку исходящей почты локальными пользователями.

Если это то, что вы хотите сделать, то ваше выражение можно упростить:

  • Проверку From:заголовка можно выполнить более эффективно, настроив Eximдоверенные пользователи.

  • Вместо того чтобы проверять отдельно To:, Cc:​​и Bcc:, вы можете использовать $recipientsпеременную, которая содержит их все в ,отдельной строке.

Все это сводится к двум строфам ACL:

  accept
    condition = ${if forall {<,${recipients}}\
                  {match_domain{${domain:${item}}}{+local_domains}}\
                }
  deny

В общем случае вы можете отладить свои строковые расширения и не- SMTPACL, создав (или сохранив) и отправив электронное письмо (скажем, на email.eml) и выполнив:

exim4 -d-all+acl+expand -bm -t < email.eml

как root (предупреждение: это попытается осуществить настоящую доставку электронной почты), а для проверки только расширений выполните:

exim4 -bem email.eml

Связанный контент