Как вы знаете Postfix может исследовать содержимое сообщения на основе таблиц шаблонов и действий. В этой главе будет показано, как применять эти шаблоны и действия. Помните, что проверки предназначены только для простой фильтрации содержимого.
Проверки ищут в сообщениях определенные символы, а также могут изменять сообщения. Имена параметров конфигурации, включающих проверки, заканчиваются на _checks, и все они – header_checks, body_checks, mime_header_checks и nested_header_checks – действуют по одой схеме:
1. Postfix анализирует сообщение строку за строкой, сравнивая их с картой шаблонов, составленных из регулярных выражений (regexp) или регулярных выражений Perl (PCRE).
2. Если строка соответствует регулярному выражению, то Postfix предпринимает действие, определенное для данного выражения, и переходит к исследованию следующей строки ввода.
Клиент передает сообщение после успешного завершения первоначального SMTP диалога. То есть Postfix обрабатывает параметры *_checks после обработки параметров ограничений smtpd_*_restrictions.
Какие действия могут вызвать проверки?
Для каждого шаблона поиска вы можете определить только одно соответствующее действие. В настоящее время Postfix поддерживает следующие действия:
REJECT [необязательный текст...]
Отказывает сообщению в приеме. Необязательный текст будет отправлен клиенту, пытающемуся передать сообщение. Postfix так же запишет этот текст в почтовый журнал.
IGNORE
Удаляет из сообщения строку, которая совпадает с шаблоном поиска.
WARN [необязательный текст...] Заставляет Postfix записать в почтовый журнал предупреждение. Если указан необязательный текст, он также будет записан в журнал. При этом Postfix доставит сообщение без каких либо изменений.
HOLD [необязательный текст...] Помещает сообщение в очередь отложенных сообщений, где оно будет находиться до тех пор, пока администратор почтовой системы не исследует его и не решит, что с ним делать. Postfix записывает в журнал строку тела или заголовка, в которой было обнаружено совпадение с шаблоном, а также необязательный текст.
DISCARD [необязательный текст...]
Сообщает почтовому клиенту об успешной доставке сообщения, но молча удаляет сообщение вместо того, чтобы передавать его в место конечного назначения. Если указан необязательный текст, то Postfix записывает его вместе со строкой, в которой найдено совпадение с шаблоном, в журнал электронной почты.
FILTER transport:nexthop
Отправляет сообщение фильтру (службе, определенной в файле master.cf, которая занимается передачей сообщений другой системе обработки данных, например антивирусному сканеру).
REDIRECT user@domain
Перенаправляет сообщение по указанному адресу вместо того, чтобы доставить его первоначальному получателю (получателям). Под меняет любое действие FILTER.
Postfix 2.x обрабатывает тело сообщения как состоящее из n сегментов, при этом каждый сегмент помечен MIME заголовком. Такая MIME обработка включена по умолчанию, но вы можете отменить ее, указав disable_mime_input_processing = yes в своем файле main.cf. Синтаксический анализатор MIME исследует каждую прочитанную строку, выясняя, к заголовку или к сегменту тела она относится. От ответа на этот вопрос зависит то, какие проверки выполняет Postfix.
Если сегмент сообщения имеет почтовые заголовки (т. е. является вложенным сообщением типа message/rfc822), такие заголовки оцениваются параметром nested_header_checks.
Все, что следует внутри сегмента за вложенными заголовками, оценивается параметром body_checks, при этом анализируемый объем определяется параметром body_checks_size_limit. Например, если у вас есть сообщение из пяти 100 килобайтных MIME сегментов (или вложений), то Postfix проверяет в каждом сегменте первые body_checks_size_limit байт.
Postfix использует параметр mime_header_checks для оценки каждого MIME заголовка (начала каждого нового сегмента). Если после какого то MIME заголовка есть почтовые заголовки, они оцениваются параметром nested_header_checks в каждом сегменте.
Postfix использует отдельный параметр конфигурации для каждого известного ему раздела сообщения. Приведем перечень параметров проверок (имейте в виду, что по умолчанию в файле main.cf они не включены). header_checks
Эти проверки применяются к заголовку сообщения, т. е. ко всему от первой строки сообщения до первой пустой строки, включая заголовки, которые физически занимают несколько строк. body_checks
Эти проверки применяются к телу сообщения; синтаксический анализатор воспринимает как тело все, что находится между заго ловками.
mime_header_checks
Эти проверки применяются к MIME заголовкам в заголовках сообщений верхнего уровня, заголовках MIME элементов и к MIME заголовкам в заголовках вложенных сообщений в соответствии с RFC 822. nested_header_checks
Эти проверки применяются к заголовкам вложенных сообщений, за исключением MIME заголовков. Действуют только на заголовки вложенных сообщений message/rfc822, за исключением MIME заголовков, перечисленных ранее в описании параметра mime_header_checks.
Проверки просматривают сообщения, выполняя поиск заданных образцов. В случае совпадения какого то элемента содержимого с образцом выполняется некоторое действие. Postfix может применять разные фильтры к разным разделам сообщения. В настоящее время Postfix поддерживает следующие разделы: • Заголовки сообщений • MIME заголовки • Тело сообщения, включая вложения • Заголовки вложенных сообщений Для создания набора проверок вы определяете отдельные шаблоны в отдельных картах, а затем назначаете эти карты различным пара метрам проверок, которые применяются к разным разделам. Для исследования содержимого сообщения Postfix использует карты совстроенной MIME программой синтаксического анализа. Эта программа работает как команда egrep; она может распознавать только простой текст и только построчно. Посмотрим, как все это работает: 1. Синтаксический анализатор проходит сообщение строка за строкой. 2. Синтаксический анализатор определяет, к какому разделу сообще ния относится текущая строка. 3. Если для раздела существует проверка, Postfix использует соответ ствующую карту для сравнения содержимого с шаблоном карты. 4. Если соответствие найдено, то Postfix инициирует действие, остав шиеся проверки не выполняются. То есть «кто первый встал, того и тапки».
Возможно, вы уже догадались, что проверки интенсивно используют процессор, поэтому решающее значение может иметь порядок шабло нов поиска в карте, т. к. чем раньше найдено совпадение, тем меньше процессорного времени использует процесс проверки.