Назад | Перейти на главную страницу

Условная логика exim

Я пытаюсь заставить exim проверять домен исходящей и входящей почты по списку доменов. Если адрес ОТ исходящей почты и адрес 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, некоторая помощь приветствуется.

Второй 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_smtp ACL запускается только тогда, когда (локальный) пользователь вызывает exim4 с -bm или -bS параметр. Это означает, что ваш ACL будет блокировать отправку исходящей почты локальным пользователям.

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

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

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

Все это составляет две строфы ACL:

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

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

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

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

exim4 -bem email.eml