Я пытаюсь заставить 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