![Условная логика Exim](https://rvso.com/image/747348/%D0%A3%D1%81%D0%BB%D0%BE%D0%B2%D0%BD%D0%B0%D1%8F%20%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B0%20Exim.png)
Я пытаюсь заставить 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
В общем случае вы можете отладить свои строковые расширения и не- SMTP
ACL, создав (или сохранив) и отправив электронное письмо (скажем, на email.eml
) и выполнив:
exim4 -d-all+acl+expand -bm -t < email.eml
как root (предупреждение: это попытается осуществить настоящую доставку электронной почты), а для проверки только расширений выполните:
exim4 -bem email.eml