14.4. Автоматическая сортировка входящей почты — программа procmail
14.4. Автоматическая сортировка входящей почты — программа procmail
Лучше всего объяснять работу любой программы на практическом примере. Допустим, в вашей организации три отдела, и их адреса depl@firma.ru, dep2@firma.ru и dep3@firma.ru. У вас также есть пользователь mail, на имя которого будет приходить вся почта. Вам нужно сортировать приходящую почту по названию отдела: например, если в теле письма или в одном из его заголовков упоминается название отдела, отправить это сообщение одному из пользователей отдела. Кроме того, вы хотите, чтобы рассылка проекта LinuxRSP отправлялась вам по адресу adm@firma.ru.
Создайте в домашнем каталоге пользователя mail файл .procmailrc, примерное содержание которого показано в листинге 14.2.
Листинг 14.2. Файл .procmailrc — правила сортировки почты
:0
* ^Subject:.*dep1
! dep1
:0
* ^Subject:.*dep2
! dep2
:0
* ^Subject:.*dep3
! dep3
:0
* ^Subject:.*LinuxRSP
! adm
Правила означают следующее: если в теме (заголовок Subject) присутствует название отдела, то сообщение будет отправлено нужному пользователю, который должен быть зарегистрирован в системе. Вместо имени пользователя можно указать адрес электронной почты.
Можно выполнить сортировку по любому другому полю. Например, последнее правило могло бы выглядеть так:
:0
* ^From:.* Subscribe.Ru
! adm
В этом случае, если кто-нибудь из пользователей вашей системы также подпишется на другую рассылку на сервере Subscribe.Ru, то вся почта попадет к пользователю adm.
А теперь создадим почтовый автоответчик. Существуют два типа автоответчиков. Первые посылают автоответ только на определенные сообщения (например, отправляют клиенту прайс-лист вашей организации по его требованию), а вторые — на все (например, сообщают, что вы сейчас заняты, прочитаете письмо тогда-то). Автоответчик первого типа настраивается при помощи правила
0:
* ^Subject.*Price
| (formail -r ; cat $HOME/pricelist.zip) | sendmail -t
А второй тип создается еще проще. Вы не определяете никаких условий, поэтому файл info.txt, содержащий ваш автоответ, будет послан любому отправителю:
0:
| (formail -r; cat $HOME/info.txt) | sendmail -t
Владельцем файла .procmailrc должен быть пользователь mail. Права доступа следует установить «600».
Вызывать агент доставки procmail можно с помощью правил программы sendmail, но сейчас мы рассмотрим другой способ. В этом же каталоге ($HOME/mail) создайте файл .forward с такими же правами доступа, как у .procmailrc. В файле .forward задаются правила перенаправления почты. Добавьте в него следующую строку:
|IFS= && exec /usr/bin/procmail USER= <mail>
Используйте procmail с большой осторожностью, потому что если вы неправильно укажете условия сортировки, почта будет просто утеряна без возможности восстановления.
Строки файла конфигурации .procmailrc, которые начинаются с символа решетки (#) считаются комментариями.
Строки, начинающиеся с последовательности символов :0 или :0:, определяют правила, на основании которых procmail выполнит действие над сообщением. После символов :0 можно указать опции поиска и исполняемый файл, которому будет передано сообщение. Общий синтаксис такой:
:0 [опции] [: программа]
Опция H (header) означает, что условие будет применяться к заголовку письма, а опция В — к телу. Опция D указывает программе различать нижний и верхний регистры символов. По умолчанию используется опция H, то есть условие применяется только к заголовку, а верхний и нижний регистры не различаются. Подробнее об опциях вы прочитаете на man-странице программы procmail.
Условие задается с помощью регулярных выражений. Каждое условие начинается символом * и записывается в отдельной строке. Регулярные выражения задаются как обычно, а именно:
? Символ ^ указывает на начало строки, а $ — на ее конец.
? Символ . обозначает любой символ, кроме CR (возврат каретки).
? Символы ? и * читаются как «ноль или более раз».
? Символ + — «один или более раз».
? Символ | обозначает логическую операцию ИЛИ : x|у — x ИЛИ у.
? [a-z] определяет любой символ из диапазона a..z.
? [^a-z] задает любой символ вне диапазона a..z.
После условия указывается одна команда. Если первый символ команды «!», то сообщение будет перенаправлено на все указанные почтовые адреса, а если «|», то сообщение будет передано исполняемому файлу (программе), который указан после символа Вместо исполняемого файла можно указать переменную окружения, в которую будет записан результат.
Переменная окружения MAILDIR устанавливается в файле .procmailrc. Обычно она имеет значение $HOME/Mail.
Кроме переменной окружения MAILDIR, вы можете указать переменные окружения SENDMAIL и FORMAIL, которые содержат полный путь к программам sendmail и formail (фильтр-преобразователь сообщений в формат mailbox). Переменная окружения LOGFILE содержит имя файла протокола программы procmail, а переменная DEFAULT — имя файла, в который будут записываться сообщения, к которому procmail не может применить ни одно из правил.
Для иллюстрации я приведу свой файл конфигурации procmail.
Листинг 14.3. Мой файл .procmailrc
PATH=$HOME/bin:/usr/bin:/usr/sbin:/bin:/usr/local/bin:.
MAILDIR=/home/den/mail
DEFAULT=$MAILDIR/mbox
LOGFILE=$MAILDIR/from
LOCKFILE=$HOME/.lockmail
:0
* ^Subject.*Privet
privets
:0
* ^Subject.*Job
| (formail -r ; cat /home/den/vakancy.txt) | /usr/sbin/sendmail -t
Если в теме сообщения было найдено слово «Privet», то все сообщения будут сохраняться в файле /home/den/mail/privets. Если тема сообщения содержит слово «Job», то по адресу отправителя будет автоматически отправлен файл vakancy.txt. Файл vakancy.txt должен быть текстовым — это не вложение.
Файл протокола, в который программа procmail запишет адрес отправителя, тему и размер сообщения, называется from.
Данный текст является ознакомительным фрагментом.