Нахождение acl для использования
Значение опции “acl_smtp_xxx” раскрывается перед использованием, таким образом, вы можете использовать различные ACL для разных ситуаций. Результирующая строка не должна бфть именем ACL в конфигурационном файле; есть другие возможности. Раскрыв строку, exim ищет ACL в следующим образом:
Если строка начинается со слэша, exim использует её как имя файла, и читает его содержимое как ACL. Строки обрабатываются таким же образом, как строки в конфигурационном файле exim`a. В частности, поддерживается продолжение строк, пустые строки игнорируются, как и строки, чей первый символ, не являющийся пробелом - “#”. Если файл не существует, или не может быть прочитан, происходит ошибка (типично - вызывается временная ошибка любой вызываемой для запуска ACL). Например:
acl_smtp_data = /etc/acls/\ ${lookup{$sender_host_address}lsearch\ {/etc/acllist}{$value}{default}} |
В примере ищется используемый файл ACL на основе IP-адреса хоста, в случае неудачи поиска, используется дефолтовое значение. Если ACL успешно прочитана из файла, она сохраняется в памяти при работе процесса exim`a, таким образом, она может быть повторно использована, без необходимости перечитывать файл.
Если строка не начинается со слэша, и не содержит каких-либо пробелов, exim ищет секцию ACL в конфигурации ACL чьё имя совпадает со строкой.
Если имя ACL не найдено, или строка содержит пробелы, exim обрабатывает строку как ACL. Это может сэкономить ввод (в смысле - меньше букавок набирать - прим. lissyara) в случаях, когда вы хотите сделать что-то типа этого:
acl_smtp_vrfy = accept |
для разрешения свободного использования команды VRFY. Такая строка может содержать символы новой строки; она обрабатывается таким же способом, как и ACL читаемая из файла.
Коды возврата acl
Исключая ACL QUIT, которая не затрагивает код возврата SMTP (смотрите выше, секцию 39.7), результат работы ACL - или “accept” или “deny”, или, проверка не может быть завершена (например, упала БД) - “defer”. Эти результаты вызывают использование кодов ответа “2xx”,“5xx”, и “4xx” в диалоге SMTP, соответственно. Четвёртое возвращаемое значение, “error”, происходит при ошибках, типа неправильного синтаксиса в ACL. Она также вызывает “4xx” код возврата. Для не-SMTP ACL, “defer” и “error” - рассматриваются также как и “deny”, поскольку не существует механизма для передачи временных ошибок отправителям не-SMTP сообщений. ACL, которые релевантны приёму сообщений, также могут вернуть “discard”. Это имеет тот же самый эффект что и “accept”, но, вызывает отбрасываение всего сообщения, или адреса отдельного отправителя. Другими словами - это, средство для органицации чёрной дыры (имеется ввиду - сообщения уходят вникуда - прим. lissyara). Используйте это с осторожностью. Если ACL для MAIL возвращает “discard”, и все получатели отбрасываются, и для последующих команд RCPT не запускается никаких ACL. Эффект “discard” в ACL RCPT - отбрасывание лишь одного адреса получателя. Если не осталось получателей сообщения, когда получены данные сообщения, ACL DATA не запускается. Если “discard” возвращается из DATA, или не-SMTP ACL, - отбрасываются все получатели. Не разрещается возвращать “discard” для ACL“acl_smtp_predata”. Функция “local_scan()” запускается всегда, даже если не осталось получателей; она может создать новых получателей.
