• a+. Это выражение выполняет те же действия, что и a*, но количество символов в последовательности не может быть нулевым.
• a?. Данное выражение означает, что указанный символ может отсутствовать.
• последовательность1|последовательность2. Чтобы указать на то, что в строке может присутствовать одна из двух последовательностей символов, надо разделить эти последовательности символом |. При необходимости вы можете задать выбор более чем из двух альтернативных вариантов, использовав несколько символов |.
• (последовательность)*. Это выражение похоже на a*, но оно означает многократное повторение не одного символа, а целой последовательности.
• [символы]. Набор символов, помещенных в квадратные скобки, означает, что в строке должен присутствовать любой из них. Например, выражению [aeiou] соответствуют символы а, е, i, о или u. Если два символа разделены дефисом (-), они задают диапазон символов. Например, выражению [m-q] соответствуют символы m, n, о, p или q.
• . Обратная косая черта отменяет специальное значение символа. Например, выражение . соответствует обычной точке.
Дополнительную информацию о регулярных выражениях вы найдете на страницах справочной системы, посвященных Procmail. Объединяя обычный текст и специальные символы, вы можете создавать достаточно сложные выражения. Как было сказано ранее, условия в составе рецепта могут занимать одну или несколько строк. В большинстве случаев используются условия, состоящие из одной строки. Если условия занимают несколько строк, письмо соответствует рецепту в том случае, если оно соответствует каждому из условий. Если условия отсутствуют, рецепту соответствует любое сообщение.
В составе условий могут быть использованы дополнительные символы, указывающие на то, что рецепт должен быть интерпретирован специальным образом. Некоторые из них описаны ниже.
• !. Данный символ инвертирует результат сравнения. Если условие начинается с символа !, то, для того, чтобы письмо соответствовало рецепту, оно не должно соответствовать данному условию. Например, вы можете создать рецепт, которому соответствуют все сообщения, кроме адресованных пользователю postmaster.
• <. Условие применяется в том случае, если длина сообщения меньше указанного числа байтов.
• >. Условие применяется в том случае, если длина сообщения больше указанного числа байтов.
Действие
Действие в составе рецепта занимает одну строку и указывает Procmail, как следует обрабатывать сообщение. Простое действие лишь задает имя файла, в который Procmail должен поместить сообщение. Действия Procmail хорошо сочетаются с sendmail, Exim, Postfix и другими серверами, использующими формат mbox. Если же вы работаете с qmail или другим сервером, поддерживающим формат maildir, описание действия Procmail необходимо завершать косой чертой (/), которая указывает на то, что Procmail должен сохранить сообщение в формате maildir. Procmail также поддерживает еще один формат хранения сообщений, для использования которого описание действия должно заканчиваться косой чертой и точкой.
Помимо записи писем в папки, Procmail также может выполнять другие действия, для описания которых в начале строки указываются перечисленные ниже символы.
• !. Если описание действия начинается с восклицательного знака, Procmail интерпретирует содержимое строки как список почтовых адресов, по которым следует перенаправить сообщение. Вы можете использовать данную возможность для автоматического создания сообщений, предназначенных для группы пользователей.
• |. В оболочках UNIX вертикальная черта используется для организации конвейерной обработки данных. В Procmail данный символ имеет аналогичное назначение. Если описание действия начинается с вертикальной черты, Procmail запускает указанную программу и передает ей сообщение для обработки. Вы можете использовать данную возможность для выполнения более сложных действий над сообщениями.
• {. Открывающая фигурная скобка является признаком начала блока. В состав блока могут входить рецепты, которые применяются только к сообщениям, соответствующим условиям включающего рецепта. (Включающий рецепт является рецептом без доставки. Если сообщение не соответствует ни одному из включаемых рецептов, оно не доставляется.) Такая возможность может использоваться в том случае, если у вас есть несколько рецептов и вы хотите применять их только при выполнении некоторых предварительных условий. Например, вложенные рецепты можно использовать для распознавания рекламных сообщений по некоторым признакам, каждый из которых не позволяет принять окончательное решение о типе письма. Признаком окончания блока является закрывающая фигурная скобка.
В каждом из рецептов может содержаться лишь одно действие. Если вы хотите, чтобы над сообщением выполнялось несколько операций, вам следует создать сценарий и передать ему сообщение для обработки. При этом вам необходимо следить за тем, чтобы сценарий прочитал все сообщение, в противном случае Procmail проверит сообщение с помощью других правил. В некоторых случаях в составе рецепта задается флаг с, указывающий на то, что операции должны выполняться над копией сообщения. При этом в зависимости от действий, производимых над сообщением, оно может быть доставлено несколько раз.
Пример использования рецептов
Приведенные выше сведения были необходимы для создания общего представления о работе Procmail. В листинге приведен чрезвычайно простой пример файла Procmail, предназначенного для фильтрации сообщений. Содержащиеся в нем рецепты пригодны для пользовательского файла .procmailrc, поскольку они предусматривают доставку сообщений в папку рабочего каталога пользователя.
Листинг 19.3. Пример конфигурационного файла Procmail
MAILDIR = $HOME/Mail
# Поиск рекламных сообщений. Проверка не затрагивает письма,
# адресованные пользователю postmaster или отправленные им
:0
*! (From|To) : . *postmaster
{
: 0 В
* .*301.*S.*1618 /dev/null
:0
* From: .*badspammer.net
/dev/null
:0
* Subject:.*$$$
/dev/null
}
# Проверка по ключевым словам rug и david и
# перенаправление писем адресату
:0 с
* From: . * [email protected].edu
* Subject: . *rug
! [email protected]
# Сообщения списков рассылки помещаются в отдельную папку
:0:
* То: . * [email protected] .example .com
$MAILDIR/mailinglist
Листинг 19.3 иллюстрирует некоторые важные особенности рецептов Procmail.
• Вложенные рецепты. Рецепты, выполняющие блокировку спама, содержатся в составе другого рецепта, в результате эти фильтры применяются только для тех сообщений, которые адресованы пользователям, отличным от postmaster. (Это достигается посредством оператора отрицания, указанного в условиях включающего рецепта.) Аналогичный результат можно получить, включив условие *! То: .*postmaster в состав каждого из фильтров, предназначенных для блокирования спама. В данном простом примере это может несколько сократить объем конфигурационного файла. В более сложных фильтрах при использовании вложенных рецептов объем файла уменьшается. Кроме того, применение вложенных фильтров уменьшает вероятность ошибки, так как некоторые условия при этом указываются однократно.
• Регулярные выражения. В листинге 19.3 содержатся три рецепта, предназначенные для фильтрации рекламных сообщений. Первый из них проверяет тело сообщения (на это указывает флаг В) на наличие строки, содержащей последовательности 301, S и 1618. Этот рецепт предназначен для перехвата писем, содержащих указание на раздел 301 и номер S.1618, которые часто используются спамерами для создания иллюзии официального сообщения. Второй из рецептов, предназначенных для фильтрации спама, блокирует все письма из домена badspammer.net, а третий фильтр блокирует сообщения, содержащие в поле Subject: последовательность $$$. Обратите внимание на использование обратной косой черты для отмены специального значения символов. Все три рассматриваемых здесь рецепта направляют сообщения в файл /dev/null, т.е. удаляют их. После копирования в файл /dev/null письма уже не могут быть восстановлены. Файл блокировки для этих рецептов не требуется, так как сообщения не сохраняются ни в одной папке.