Использование фильтров Procmail
🕛 03.08.2009, 19:30
Серверы SMTP, описанные в данной главе, могут обрабатывать письма, отправленные с внешних компьютеров. До сих пор мы не рассматривали вопрос о том, что происходит с письмом после того, как оно принимается сервером. В простейшем случае почтовый сервер присоединяет сообщения к файлу, в котором хранятся принятые письма. При необходимости система Linux может быть сконфигурирована так, что в процесс доставкиписем будет включен инструмент Procmail. Procmail позволяет осуществлять сложную обработку писем, принятых почтовым сервером. Вы можете использовать готовые средства фильтрации, поставляемые в составе Procmail, либо создавать собственные фильтры. Изучив принципы работы Procmail, вы можете решать такие задачи, связанные с доставкой почты, которые не могут быть решены другими способами.
Роль Procmail в процессе доставки почты
Большинство почтовых серверов предназначено для передачи сообщений с одного компьютера на другой или от одного пользователя другому, работающему на том же компьютере. В некоторых случаях среда доставки писем оказывается достаточно сложной, и возникает необходимость в фильтрации принятых сообщений. Одна из причин, по которой возникает потребность в фильтрации, - распространение спама - была рассмотрена ранее. Вы, вероятно, захотите отказаться от получения рекламных сообщений или, по крайней мере, собирать их в одной специально предназначенной для них папке. Средства для блокирования спама предусмотрены во всех рассмотренных ранее почтовых серверах, но они уступают по своим возможностям фильтрам, реализуемым посредством Procmail.
Фильтры Procmail позволяют не только отвергать сообщения, как это происходит при блокировании спама. Вы можете использовать фильтры для автоматического распределения писем по папкам. Например, если вы подписаны на несколько списков рассылки, то, вероятно, захотите отделить материалы рассылки от обычных сообщений, помещая их в разные папки. К папкам, содержащим сообщения списков рассылки, нет необходимости обращаться так же часто, как к папкам, в которые поступают обычные письма.
Procmail позволяет даже передавать письма для обработки другим программам. С помощью Procmail вы можете, например, реализовать шлюз, посредством которого принятые письма будут автоматически передаваться от почтового сервера серверу новостей. В результате у вас появится возможность читать письма с помощью программ, предусмотренных для просмотра материалов групп новостей. Чтобы защитить вашу сеть от вирусов и "троянских коней", распространяемых по почте, вы можете организовать обработку поступающих сообщений с помощью антивирусных программ. Эту задачу также позволяет решить Procmail. При необходимости можно создать фильтр, который будет воспроизводить звуковой сигнал, оповещая вас о поступлении писем, содержащих определенные ключевые слова.
Во всех описанных выше примерах используется способность Procmail сканировать сообщения. Например, фильтры для блокирования спама, созданные на основе Procmail, могут искать последовательности символов, специфические для рекламных сообщений. Для этого Procmail использует регулярные выражения, подобные тем, которые применяются сервером Postfix для обработки данных в заголовках сообщений или программой egrep.
С помощью Procmail могут создаваться фильтры для всей системы или для отдельных пользователей. Например, фильтры, действующие в пределах системы, могут использоваться для блокирования спама и борьбы с вирусами. Отдельные пользователи могут применять Procmail для распределения сообщений по папкам и выполнения других подобных действий. Конфигурация Procmail для использования в рамках системы задается с помощью файла /etc/procmailrc. Для индивидуального применения Procmail настраивается посредством файлов .procmailrc, расположенных в рабочих каталогах
пользователей. Файлы, предназначенные для отдельных пользователей, имеют тот же формат, что и файлы, ориентированные на применение во всей системе.
ВНИМАНИЕ В большинстве версий Linux файл /etc/procmailrc используется тогда, ко-5 гда Procmail запускается по инициативе пользователя root. Поэтому надо внимательно следить за тем, чтобы команды, выполняемые Procmail, не нанесли вреда системе. Кроме того, перенаправляя почту, необходимо принимать меры для того, чтобы создаваемые файлы были доступны для чтения пользователям, которым они предназначены. При работе с файлами .procmailrc, расположенными в пользовательских каталогах, подробные проблемы не возникают, так как в этом случае Procmail выполняется с привилегиями обычного пользователя.
В конфигурационном файле Procmail содержатся записи трех типов.
- Комментарии. Как и во многих других конфигурационных файлах, строки, содержащие комментарии, начинаются с символа #.
- Записи, определяющие переменные окружения. В процессе работы Procmail использует значения переменных окружения, например $НОМЕ (расположение рабочего каталога пользователя) и $MAILDIR (каталог, в котором содержатся пользовательские папки для хранения почтовых сообщений). Значения переменных окружения устанавливаются в конфигурационном файле так же, как и в оболочке. Например, запись MAILDIR = $HOME/Mail задает для переменной окружения $MAILDIR значение, указывающее на подкаталог Mail, находящийся в рабочем каталоге пользователя.
- Рецепты. Правила фильтрации Procmail называются рецептами (recipe). Основная работа по построению фильтра сводится к созданию рецепта. Каждый рецепт содержит правила, определяющие обработку сообщения, соответствующего некоторому регулярному выражению. Таким образом, полный набор правил состоит из многих рецептов. Рецепты разделяются на две категории: рецепты с доставкой (delivering) и рецепты без доставки (nondelivering). Рецепты с доставкой ориентированы на включение сообщения в состав почтового ящика, блокирование сообщения или обработку его с помощью другой программы. Рецепты без доставки определяют вложенные рецепты, т. е. приводят к повторной обработке сообщения с помощью Procmail.
Описанные три типа записей могут располагаться в пределах конфигурационного файла в любой последовательности. Многие конфигурационные файлы Procmail начинаются с определения переменных окружения, за которыми следует набор рецептов. В процессе обработки поступающей почты Procmail сканирует письма и проверяет их на соответствие рецептам. Если письмо не соответствует ни одному рецепту, Procmail доставляет его в файл, определяемый посредством переменной $DEFAULT. Обычно это почтовый ящик, используемый по умолчанию, например /var/spool/mail/имя_пользователя.
Создание рецепта
Создание рецепта может показаться очень сложной задачей, в особенности для тех, кто не знаком с регулярными выражениями. Формат рецепта имеет следующий вид:
: 0 [флаги] [: [файл_6локировки] ] [условия]
действие
Рецепт можно условно разбить на три части: идентификационную строку, условия и действие.
Идентификационная строка
Каждый рецепт начинается с символов : 0. Цифра 0 не имеет специального значения, и рецептов, начинающихся с : 1 или больших номеров, не существует. После : 0 вы можете задать один или несколько флагов, которые изменяют поведение Procmail. Наиболее часто используются следующие флаги.
- Н. Данный флаг указывает на то, что сравнению с шаблоном должны подвергаться заголовки сообщения. Этот флаг используется по умолчанию
- В. Этот флаг задает сравнение тела сообщения с шаблоном.
- D. По умолчанию при сравнении с шаблоном не учитывается регистр символов. Флаг D отменяет это соглашение.
- с. Данный флаг указывает на то, что рецепт должен работать с "копией" исходного сообщения. Его "оригинал" сохраняется для обработки другими рецептами.
- w. Этот флаг сообщает о том, что Procmail должен ожидать завершения действия, указанного в рецепте. Если действие не окончилось успешно, сообщение остается в очереди для обработки посредством других рецептов.
- W. Данный флаг действует подобно w, но подавляет сообщения об ошибках.
После флагов можно указать двоеточие и имя файла блокировки. Файл блокировки -это специальный файл, который сообщает о том, что в данный момент происходит работа с другим файлом. При наличии файла Procmail откладывает обработку сообщения до тех пор, пока этот файл не будет удален. Файл блокировки удобно использовать в тех случаях, когда в очереди содержится много сообщений; ,без него может возникнуть ситуация, когда сообщения, принятые одно за другим, будут записаны в неверном порядке. По умолчанию имя файла блокировки строится на основе имени файла, в который помещается почта (этот файл указывается в строке действия). Если в строке действия задается обработка сообщения другой программой, вы можете указать имя файла блокировки после двоеточия.
Условия
Условия в составе рецепта состоят из любого (возможно, нулевого) числа строк, обычно начинающихся с символа *. Как правило, в составе условий задаются регулярные выражения - строки символов, с которыми Procmail сравнивает входные данные (заголовок и тело сообщения). Большинство символов используется литерально, но некоторые символы имеют специальные значения. Специальные символы и выполняемые ими действия описаны ниже.
- А. Указывает на начало строки. Этот символ указывается во многих условиях Procmail после символа *.
- $. Данный символ указывает на конец строки.
- .. Точке соответствует любой символ, кроме символа новой строки. Например, выражению d.g удовлетворяют dog, dig, dug и любая другая трехсимвольная последовательность, которая начинается с d и заканчивается д.
- а*. Данному выражению соответствует любое (в том числе нулевое) число символов, указанных перед звездочкой, следующих друг за другом. Очевидно, что вместо а вы можете подставить любой символ. Например, если вам надо найти последовательность, начинающуюся с цифр 802, за которыми следует произвольное количество неизвестных символов, а затем 1618, то сделать это поможет выражение 802.*1618.
- а+. Это выражение выполняет те же действия, что и а*, но количество символов в последовательности не может быть нулевым.
- а?. Данное выражение означает, что указанный символ может отсутствовать.
- последовательность! \последовательность2. Чтобы указать на то, что в строке может присутствовать одна из двух последовательностей символов, надо разделить эти последовательности символом |. При необходимости вы можете задать выбор более чем из двух альтернативных вариантов, использовав несколько символов |.
- (последовательность) *. Это выражение похоже наа*, но оно означает многократное повторение не одного символа, а целой последовательности.
- [символы]. Набор символов, помещенных в квадратные скобки, означает, что в строке должен присутствовать любой из них. Например, выражению [aeiou] соответствуют символы а, е, i, о или и. Если два символа разделены дефисом (-), они задают диапазон символов. Например, выражению [m-q] соответствуют символы т, п, о, р или q.
- \. Обратная косая черта отменяет специальное значение символа. Например, выражение \. соответствует обычной точке.
Дополнительную информацию о регулярных выражениях вы найдете на страницах справочной системы, посвященных Procmail. Объединяя обычный текст и специальные символы, вы можете создавать достаточно сложные выражения. Как было сказано ранее, условия в составе рецепта могут занимать одну или несколько строк. В большинстве случаев используются условия, состоящие из одной строки. Если условия занимают несколько строк, письмо соответствует рецепту в том случае, если оно соответствует каждому из условий. Если условия отсутствуют, рецепту соответствует любое сообщение.
В составе условий могут быть использованы дополнительные символы, указывающие на то, что рецепт должен быть интерпретирован специальным образом. Некоторые из них описаны ниже.
- !. Данный символ инвертирует результат сравнения. Если условие начинается с символа !, то, для того, чтобы письмо соответствовало рецепту, оно не должно соответствовать данному условию. Например, вы можете создать рецепт, которому соответствуют все сообщения, кроме адресованных пользователю postmaster.
- <. Условие применяется в том случае, если длина сообщения меньше указанного числа байтов.
- >. Условие применяется в том случае, если длина сообщения больше указанного числа байтов.
Действие
Действие в составе рецепта занимает одну строку и указывает Procmail, как следует обрабатывать сообщение. Простое действие лищь задает имя файла, в который Procmail должен поместить сообщение. Действия Procmail хорошо сочетаются с sendmail, Exim, Postfix и другими серверами, использующими формат mbox. Если же вы работаете с qmail или другим сервером, поддерживающим формат maildir, описание действия Procmail необходимо завершать косой чертой (/), которая указывает на то, что Procmail должен сохранить сообщение в формате maildir. Procmail также поддерживает еще один формат хранения сообщений, для использования которого описание действия должно заканчиваться косой чертой и точкой.
Помимо записи писем в папки, Procmail также может выполнять другие действия, для описания которых в начале строки указываются перечисленные ниже символы.
- !. Если описание действия начинается с восклицательного знака, Procmail интерпретирует содержимое строки как список почтовых адресов, по которым следует перенаправить сообщение. Вы можете использовать данную возможность для автоматического создания сообщений, предназначенных для группы пользователей.
- |. В оболочках UNIX вертикальная черта используется для организации конвейерной обработки данных. В Procmail данный символ имеет аналогичное назначение. Если описание действия начинается с вертикальной черты, Procmail запускает указанную программу и передает ей сообщение для обработки. Вы можете использовать данную возможность для выполнения более сложных действий над сообщениями.
- {. Открывающая фигурная скобка является признаком начала блока. В состав блока могут входить рецепты, которые применяются только к сообщениям, соответствующим условиям включающего рецепта. (Включающий рецепт является, рецептом без доставки. Если сообщение не соответствует ни одному из включаемых рецептов, оно не доставляется.) Такая возможность может использоваться в том случае, если у вас есть несколько рецептов и вы хотите применять их только при выполнении некоторых предварительных условий. Например, вложенные рецепты можно использовать для распознавания рекламных сообщений по некоторым признакам, каждый из которых не позволяет принять окончательное решение о типе письма. Признаком окончания блока является закрывающая фигурная скобка.
В каждом из рецептов может содержаться лишь одно действие. Если вы хотите, чтобы над сообщением выполнялось несколько операций, вам следует создать сценарий и передать ему сообщение для обработки. При этом вам необходимо следить за тем, чтобы сценарий прочитал все сообщение, в противном случае Procmail проверит сообщение с помощью других правил. В некоторых случаях в составе рецепта задается флаг с, указывающий на то, что операции должны выполняться над копией сообщения. При этом в зависимости от действий, производимых над сообщением, оно может быть доставлено несколько раз.
Пример использования рецептов
Приведенные выше сведения были необходимы для создания общего представления о работе Procmail. В листинге 19.3 приведен чрезвычайно простой пример файла Procmail, предназначенного для фильтрации сообщений. Содержащиеся в нем рецепты пригодны для пользовательского файла .procmailrc, поскольку они предусматривают доставку сообщений в папку рабочего каталога пользователя.
Листинг 19.3 иллюстрирует некоторые важные особенности рецептов Procmail.
- Вложенные рецепты. Рецепты, выполняющие блокировку спама, содержатся в составе другого рецепта, в результате чего эти фильтры применяются только для тех сообщений, которые адресованы пользователям, отличным от postmaster. (Это достигается посредством оператора отрицания, указанного в условиях включающего рецепта.) Аналогичный результат можно получить, включив условие * ! \ То: . *postmaster в состав каждого из фильтров, предназначенных для блокирования спама. В данном простом примере это может несколько сократить объем конфигурационного файла. В более сложных фильтрах при использовании вложенных рецептов объем файла уменьшается. Кроме того, применение вложенных фильтров уменьшает вероятность ошибки, так как некоторые условия при этом указываются однократно.
- Регулярные выражения. В листинге 19.3 содержатся три рецепта, предназначенные для фильтрации рекламных сообщений. Первый из них проверяет тело сообщения (на это указывает флаг В) на наличие строки, содержащей последовательности 301, S и 1618. Этот рецепт предназначен для перехвата писем, содержащих указание на раздел 301 и номер S.1618, которые часто используются спамерами для создания иллюзии официального сообщения. Второй из рецептов, предназначенных для фильтрации спама, блокирует все письма из домена badspammer . net, а третий фильтр блокирует сообщения, содержащие в поле Subject: последовательность $. Обратите внимание на использование обратной косой черты для отмены специального значения символов. Все три рассматриваемых здесь рецепта направляют сообщения в файл /dev/null, т. е. удаляют их. После копирования в файл /dev/null письма уже не могут быть восстановлены. Файл блокировки для этих рецептов не требуется, так как сообщения не сохраняются ни в одной папке.
- Копирование сообщений. Вместо того чтобы записывать сообщение в файл, второй рецепт, приведенный в рассматриваемом примере, передает его другому пользователю. На это указывают флаг с и восклицательный знак в начале описания действия. Сообщение должно удовлетворять двум критериям: отправителем его должен быть пользователь david@pangaea. edu, и оно должно содержать слово rug в поле заголовка Sub j ect:. Если хотя бы одно из условий не выполняется, сообщение не копируется.
- Сортировка сообщений. Последний рецепт распределяет сообщения по папкам. Письма, адресованные list@mailinglist.example.com, помещаются в отдельную папку, расположенную в подкаталоге рабочего каталога пользователя, предназначенного для работы с почтой. Во многих списках рассылки поле То : заголовка сообщения используется для идентификации самого списка, а информация о получателе сообщения включается в поле То заголовка конверта. Для того чтобы выбрать наиболее удобный способ распределения писем по папкам, вам следует выяснить, какие данные содержатся в заголовках писем, распространяемых посредством списков рассылки.
Рецепты, приведенные в листинге 19.3, предельно просты, и их вряд ли можно использовать для решения конкретных задач, однако на их основе вы можете создать реальные рецепты. Кроме того, при необходимости вы можете внести изменения в фильтры, полученные из других источников.
Использование существующих наборов фильтров
Создание фильтров Procmail - достаточно сложная задача, отнимающая много сил и времени. Вместо того чтобы заниматься созданием фильтра с нуля, вы можете попытаться применить для своих целей готовые фильтры. Некоторые из источников фильтров Procmail описаны ниже.
- SpamBouncer. Этот пакет представляет собой набор фильтров Procmail, предназначенных для блокирования спама. Фильтры, входящие в состав SpamBouncer, достаточно сложны, но при необходимости вы можете адаптировать некоторые из них для решения собственных задач. Подробно эти фильтры описаны в документации, поставляемой в составе пакета. Чтобы скопировать SpamBouncer, надо обратиться на его Web-страницу, расположенную по адресу http: //www. spambouncer. org.
- SmartList. Этот пакет, реализующий список рассылки, создан на основе Procmail. Дополнительную информацию о нем вы можете получить из документа SmartList FAQ, доступного по адресу http://www.hartzler.net/smartlist/ SmartList-FAQ.html.
- Советы и рецепты Тимо. Тимо Салми (Timo Salmi) поддерживает Web-страницу (http://www.uwasa. fi/~ts/info/proctips .html),посредством которой он распространяет информацию о простых рецептах Procmail. Информацию, представленную на этой странице, нельзя рассматривать как готовый к использованию пакет, такой как SpamBouncer или SmartList, однако вы можете найти на ней "заготовки" для своих фильтров.
Примеры рецептов Procmail с комментариями. Web-узел handsonhowto.com/pmaill02.html содержит примеры рецептов Procmail, снабженные комментариями, которые поясняют их работу.
Дополнительную информацию о фильтрах и рецептах, пригодных для использования, вы получите, выполнив в Internet поиск по ключевым словам Procmail recipes. Многие полезные ссылки можно найти на Web-узле Procmail по адресу http: //www. procmail.org.
Простые наборы фильтров можно разместить в рабочем каталоге пользователя в файле .procmailrc. Если фильтр должен воздействовать на систему в целом, его надо включить в файл /etc/procmailrc. Некоторые пакеты, например SpamBouncer, содержат специальные файлы, поэтому при инсталляции необходимо следить, чтобы они были установлены корректно.
ВНИМАНИЕ В ряде случаев, чтобы выполнить задачу, недостаточно инсталлировать фильтр. | Некоторые фильтры приходится настраивать, указывая в них имена у шов и даже имена пользователей. Разработчики многих фильтров ориентировались на потребности конкретных администраторов, в то время как перед вами могут стоять несколько другие задачи.
СОВЕТ Как системный администратор, вы можете позволить себе роскошь создать спе-^Г циальную учетную запись для тестирования. Такую запись удобно использовать для проверки фильтров Procmail. Пробные сообщения можно передавать, изменив настройку программы подготовки писем и даже непосредственно взаимодействуя с сервером SMTP посредством программы telnet (для этого надо при установлении соединения указать порт 25).
Запуск Procmail
При обсуждении принципов фильтрации предполагалось, что программа Procmail уже запущена и обрабатывает поступающие сообщения. В большинстве версий Linux почтовые серверы уже сконфигурированы для использования Procmail при доставке почты. Действия, необходимые для настройки серверов, описаны ниже.
- sendmail. Чтобы настроить сервер для использования Procmail, необходимо включить в конфигурационный файлш4 три записи. Первая из них,
define(,PROCMAIL_MAILER_PATH', Vusr/bin/procmail'),
сообщает sendmail о том, где расположены двоичные файлы Procmail. Записи FEATURE<local_j>rocmail) и MAILER(procmail) указывают sendmail на необходимость использования Procmail при доставке почты.
- Exim. Около двух третей конфигурационного файлаexim.conf, используемого по умолчанию, занимает раздел procmail_pipe. Этот раздел посвящен использованию Procmail для доставки почты. Убедитесь, что данный раздел присутствует в конфигурационном файле и что в нем указан требуемый двоичный файл.
- Postfix. В конфигурационном файлеnairi.cf, используемом по умолчанию, для вызова Procmail применяется опция mailbox_command. Если вы не укажете эту опцию, Postfix будет доставлять почту, минуя Procmail.
Во многих версиях Linux почтовые серверы по умолчанию настроены для взаимодействия с Procmail. При работе с этими версиями вам не потребуется изменять конфигурацию сервера. Если же на вашем компьютере Procmail по умолчанию не применяется, но вы хотите использовать этот инструмент при доставке почты некоторым пользователям, вам надо создать в рабочих каталогах этих пользователей файл с именем . forward, содержащий следующую строку:
Следите за тем, чтобы одинарные и двойные кавычки были указаны точно так, как в этом примере.
Электронная почта - одна из наиболее важных служб Internet. Linux обеспечивает работу самых различных почтовых серверов, как всем известного sendmail, так и новых продуктов, например Exim и Postfix. Независимо от того, какой сервер SMTP вы используете, можете настроить его для выполнения некоторых стандартных действий, скажем, для получения писем и перенаправления их другим системам. При настройке сервера необходимо уделять внимание различным деталям, например, указывать набор компьютеров, с которых сервер должен получать письма для передачи другим системам, принимать меры для блокировки спама и т. д. После получения сообщения сервером SMTP оно может быть обработано с помощью Procmail. Procmail позволяет отвергать рекламные сообщения, передавать письма другим программам, пересылать копии сообщений другим пользователям и выполнять прочие, самые разнообразные задачи. Procmail обеспечивает большую гибкость в работе, в частности, правила фильтрации может создавать не только системный администратор, но и любой пользователь.