- Подписка на печатную версию:
- Подписка на электронную версию:
- Подшивки старых номеров журнала (печатные версии)
LXF135:Procmail
Материал из Linuxformat.
- Hardcore Linux Проверьте себя на крутом проекте для продвинутых пользователей
Содержание |
Procmail: Почте в помощь
- Шашанк Шарма cнова резвится в сияющем раю командной строки и находит Procmail идеальным решением для фильтрации почты.
Необходимость отдельного решения для фильтрации почты прямо пропорциональна количеству писем в вашем ящике. Procmail – мощная утилита обработки сообщений, способная производить сортировку почты на основе любого количества правил. Входящие сообщения можно распределить по папкам на основе заранее заданного критерия, такого как тема сообщения, отправитель и т. д. Применение в правилах регулярных выражений и возможность использования множества правил для сортировки писем превращают Procmail в весьма точный почтовый фильтр. Кроме того, он легко отсеивает спам и сообщения с исполняемыми файлами во вложении, а также выступает в роли идеального автоответчика.
Так как активная разработка Procmail прекращена, он поставляется по умолчанию лишь в немногих дистрибутивах. Но пусть это вас не беспокоит: он весьма стабилен и популярен, и его легко добыть в репозиториях.
На типичном почтовом сервере одновременно работают множество различных утилит и технологий. Они включают агента доставки почты (MDA), агента получения почты (MRA) и пользовательского почтового агента (MUA). Последние – это почтовые клиенты, типа Mutt или Thunderbird. Агенты получения почты – программы вроде Fetchmail или Getmail; они получают сообщения с удаленной учетной записи. Procmail – агент доставки почты, отвечающий за сортировку сообщений и передачу их в почтовый ящик в зависимости от настроек.
За действия Procmail по фильтрации почты отвечает файл .procmailrc в вашем домашнем каталоге. Правила в этом файле называются рецептами. Задолго до того, как люди начали обмениваться фильмами и музыкой, они обменивались друг с другом рецептами Procmail, которые все еще можно найти с помощью обычного поисковика. Со временем ваши рецепты вырастут и изменятся, но, взглянув на то, как другие пользуются Procmail, вы сможете лучше обработать свои письма.
В зависимости от настроек дистрибутива, может потребоваться создать и файл .forward – так вы гарантируете, что Procmail примется за обработку ваших писем до их попадания в ваш почтовый ящик. Наберите
|/usr/bin/procmail
в текстовом редакторе и сохраните файл под именем .forward в своем домашнем каталоге. Все входящие сообщения будут перенаправлены в Procmail.
За конфигурацию большинства утилит командной строки отвечают файлы настройки, которые хранятся в каталоге /etc/. Однако у обычных пользователей нет прав доступа или привилегий для редактирования файлов, принадлежащих root. Поэтому утилиты вроде Procmail и Fetchmail позволяют пользователям создавать собственные файлы настройки в их домашних каталогах.
На нашем уроке мы воспользуемся Procmail для фильтрации писем, полученных из почтового ящика Gmail. И Fetchmail, и Gmail поддерживают IMAP, но при загрузке сообщений из почтового ящика Gmail мы будем использовать протокол POP, и Procmail сможет отфильтровать сообщения.
Получение почты
Первый шаг в настройке Fetchmail для взаимодействия с удаленной почтовой учетной записью – создание файла .fetcmailrc в вашем домашнем каталоге. Откройте текстовый редактор и введите следующий текст:
poll pop.gmail.com with proto POP3 and options no dns user ‘usernamea@gmail.com’ with password ‘ваш_пароль’ is ‘user’ here options keep ssl sslcertck sslcertpath ‘/etc/ssl/certs’ mda ‘/usr/bin/procmail -d %T’
Это все, что нужно от вас Fetchmail. Может также потребоваться еще включить перенаправление POP в настройках удаленной учетной записи (для Gmail и подобных сервисов). Первые две строки – на самом деле одна; мы разбили ее для удобства. Она велит Fetchmail связаться с учетными записями username@gmail.com или username@yourisp.com и сбросить почту локальному пользователю. В третьей строке есть несколько опций. Первая, keep, не велит Fetchmail удалять сообщения с удаленной учетной записи. Без этой опции Fetchmail удалит с учетной записи все сообщения, которые загрузит. Остальные опции относятся к шифрованию SSL. Последняя строка фрагмента кода велит Fetchmail перенаправить все входящие сообщения Procmail.
Существует два способа настройки автоматического получения новых сообщений вашей учетной записи Fetchmail. Первый – добавить строку
set daemon 300
в файл ~/.fetchmailrc. Это заставит Fetchmail проверять наличие новых писем каждые пять минут (300 секунд). Установите подходящий интервал на свое усмотрение. Второй способ – создать задание Cron для запуска Fetchmail.
Запустите crontab -e из терминала и введите
*/5 * * * * /usr/bin/fetchmail -s
в файл crontab. Fetchmail будет запускаться раз в пять минут в «тихом» режиме – то есть все сообщения о ходе этого процесса и результате будут скрыты и не попадут в стандартный вывод.
Fetchmail очень строг к правам доступа к файлу ~/.fetchmailrc и требует, чтобы они были не выше 710. Поэтому измените права на 710 или меньшие командой chmod таким образом:
LXF135_85_1.jpg
chmod 710 ~/.fetchmailrc
Файл настройки ~/.fetchmailrc можно проверить командой
fetchmail -vk
с терминала. Fetchmail запустится в подробном режиме (опция -v), а письма не будут удалены с удаленной учетной записи. Опцию -k (keep) можно не указывать, если она уже есть в файле ~/.fetchmailrc.
Следующий шаг – сообщить Procmail о различных рецептах фильтрации. Но прежде чем создавать правила для сортировки писем от друзей, семьи и из списков рассылки, нужно создать уникальные каталоги для каждой из этих категорий. Мы хотим, чтобы Procmail доставлял все сообщения в каталог ~/Mail, поэтому создадим внутри него дополнительные директории.
При запуске в «тихом» режиме (опция -s) Fetchmail все равно выводит все сообщения об ошибках.
mkdir ~/Mail mkdir ~/Mail/new mkdir ~/Mail/family mkdir ~/Mail/lists mkdir ~/Mail/lists/fedora-devel mkdir ~/Mail/lists/debian-legal mkdir ~/Mail/lists/gnome
Теперь мы готовы заполнить файл ~/.procmailrc правилами сортировки входящих сообщений. В самом базовом варианте файл ~/.procmailrc должен содержать следующую информацию:
SHELL=/bin/bash PATH=/usr/sbin:/usr/bin MAILDIR=$HOME/Mail DEFAULT=$MAILDIR/new LOGFILE=$HOME/procmail.log LOG=”” VERBOSE=yes
Выше приведены только переменные, содержащие данные для работы Procmail. MAILDIR — рабочий каталог для Procmail; внутри него будет храниться вся почта. Письма, не относящиеся ни к одному из четырех рецептов, попадают в DEFAULT. Затем мы присваиваем имя файла журнала, в который Procmail будет записывать отладочную информацию, переменной LOGFILE. Установка VERBOSE в yes гарантирует, что Procmail сохранит подробную запись своих действий – это помогает в отладке своих рецептов. Переменная PATH задает папку, где Procmail ищет все программы, нужные ему как часть рецепта. Например, вам потребуется проигрыватель, чтобы воспроизвести бравурный марш при получении того долгожданного предложения о работе.
Каждый из рецептов может содержать произвольное количество правил для выбора сообщений. Они включают отправителя или получателя, тему сообщения или даже его содержимое. Как только сообщение отобрано на основе определенных вами правил, можно заставить Procmail выполнить над ним определенные действия: например, переместить в заданную папку, ответить отправителю, перенаправить сообщение на другой адрес и т. д.
Анатомия рецепта
Каждый рецепт Procmail состоит из трех частей. Все рецепты должны начинаться с символа двоеточия (:). Следующая за этой строка содержит условия или правила отбора сообщений, и, наконец, третья строка говорит Procmail, какое действие предпринять, если найдено сообщение, соответствующее правилам в рецепте.
:0: * ^From:.*(linuxlala\@yahoo\.co\.in|geekybodhi@gmail\.com) $MAILDIR/family
Этот рецепт велит Procmail проверить все входящие письма на соответствие условию (вторая строка) и переместить все письма, удовлетворяющие условию, в каталог family. Правила начинаются с символа *. ^From — встроенный макрос Procmail. ^To_ и ^Subject – похожие встроенные макросы, которые облегчают поиск соответствующих сообщений. Строка, следующая за строкой условия – строка действия. В большинстве случаев строки действия просто говорят Procmail, в какую папку поместить сообщения.
Заметили символ | в строке условия? Он необходим в тех случаях, когда в условие нужно добавить несколько проверок. Здесь мы хотим проверить на соответствие условию ^From множество адресов. Поэтому все сообщения с адресов linuxlala@yahoo.co.in и geekybodhi@gmail.com будут доставлены в папку family.
Порядок рецептов в файле ~/.procmailrc очень важен. Все входящие сообщения проверяются на соответствие приведенным рецептам, пока не обнаружится совпадение. И как только сообщение удовлетворит условию рецепта, над ним немедленно выполняются действия. Поэтому рецепт по умолчанию идет последним в списке. Так, если какое-то сообщение соответствует более чем одному рецепту, будут выполнены действия первого рецепта из файла ~/.procmailrc, а до других рецептов дело никогда не дойдет.
В строке действия не нужно указывать полный путь до каталога, как это сделали мы. Если вы уже определили переменную $MAILDIR, достаточно использовать family вместо $MAILDIR/family. Соответствующие сообщения все равно попадут в должную папку, независимо от того, указан ли полный путь или только имя каталога.
Также обратите внимание на символ \ перед @ и . в адресе электронной почты, так как два этих символа – регламентированные ключевые слова.
Над письмом можно выполнить несколько проверок, чтобы гарантировать отсутствие ложных срабатываний. Следующий рецепт проверит поля From и Subject перед выполнением действий над соответствующими сообщениями.
:0: * ^Subject:.*techrepublic ^From:techrepublic@direct.cnet.com $MAILDIR/lists/techrepublic
Пока мы рассмотрели только простейшие рецепты, но при необходимости можно выполнять и более одной операции над сообщением. Например, если вы хотите перенаправить другу все сообщения об уроках французского и сохранить копию себе, можете воспользоваться следующим рецептом:
# forward French lessons to a friend #and also keep a copy :0 * ^Subject:.*(French) { :0 c ! myfriend@buddy.com :0 learning }
Если для получения сообщений используется Агент получения почты, такой как Fetchmail, то файл .forward для перенаправления сооб-щений Procmail вам не требуется.
Здесь вместо строки действия используется вложенный блок (заключен в фигурные скобки). В него можно поместить несколько рецептов, которые будут применяться только в том случае, если сообщение соответствует родительскому рецепту. Родительский рецепт в данном случае – проверка наличия слова ‘French’ в любом месте строки темы.
В каждом из рецептов блока нет ни одного условия. В первом действии для копирования сообщения используется флаг c. Обычно, если сообщение соответствует первому рецепту, над ним будут выполнены действия только из этого рецепта. Поэтому если не использовать этот флаг, мы не сможем применить к сообщению действия из второго рецепта. Восклицательный знак (!) перед адресом электронной почты означает, что мы хотим перенаправить сообщение на указанный адрес. Наконец, второй рецепт в блоке доставляет сообщение в каталог learning.
Обработка спама
Понятие спама или нежелательных сообщений может отличаться у разных людей. Мне не нравятся вложения PPT, поэтому такие письма всегда отбрасываются. Также игнорируются письма, тема которых написана заглавными буквами, согласно рецепту, приведенному ниже:
:0 * ^Subject: [A-Z] /dev/null
Второй способ – создать «белый список» известных и доверенных адресатов и сохранять в своем ящике сообщения только от них:
# Check my whitelist :0: * ? formail -x”From” -x”From:” -x”Sender:” -x”X-Sender:” -x”Reply-To:” -x”Return-Path” -x”To:” | egrep -i -f $HOME/.trusted $MAILDIR/trusted
В этом рецепте мы выделяем только указанные заголовки с помощью Formail и передаем их утилите egrep, которая затем сравнивает их с адресами, перечисленными в файле .trusted. Formail – внешняя утилита, используемая для обработки сообщений и выделения информации из их заголовков; в нашем рецепте ее вывод передается egrep. Файл ~/.trusted содержит список всех доверенных адресов, а ключ -i в вызове egrep делает сравнение нечувствительным к регистру.
В порядке альтернативы можно поддерживать список известных нарушителей и создать рецепт, удаляющий все сообщения от них: просто замените файл .trusted на .spammers и отправьте сообщения в /dev/null вместо $MAILDIR/trusted. Но помните, что эти сообщения нельзя будет восстановить или просмотреть позже – они утратятся навсегда. Также, поскольку эти сообщения не пишутся в файл, блокировки не требуется, поэтому начните рецепт с :0 вместо :0:.
Если вы хотите еще тщательнее обрабатывать спам, настройте Procmail для совместной работы со SpamAssassin; тогда перед настройкой Procmail нужно установить SpamAssassin. После его установки создайте файл /etc/procmailrc, чтобы перенаправить все входящие сообщения в SpamAssassin:
#Send message to SpamAssassin :0 fw * < 256000 | /usr/bin/spamc
Параметр fw в строке с двоеточием означает для Procmail, что этот рецепт является фильтром и может изменить исходное сообщение. В строке условия мы ищем сообщения, меньшие 256 КБ по размеру, так как спам-сообщения обычно невелики. Это поможет нам избежать проверки всех сообщений, сэкономив немного ресурсов. В третьей строке мы передаем сообщение SpamAssassin.
Когда SpamAssassin идентифицирует сообщение как спам, он вписывает в поле с его темой специальный тэг. Итак, теперь вы можете добавить следующий рецепт в файле ~/.procmailrc:
:0H: * ^X-Spam-Status:.*Yes spam
Можно было бы точно так же направить сообщение в /dev/null, но лучше сохранить его в локальном каталоге: так вы сможете просмотреть его содержимое, чтобы убедиться, что ни одно сообщение не было ошибочно помечено как спам.
Настройка автоответчика
В Procmail очень часто используется функция автоответчика, известного также как ответ на время отпуска или auto-reply. В его основе – утилита vacation, и если она еще не установлена в вашей системе, пора это сделать. Затем создайте в своем домашнем каталоге файл .vacation и введите туда сообщение – просто «Я в отпуске. Прочту ваше сообщение, когда вернусь. Удачи!» либо нечто более витиеватое. Сохраните файл .vacation; теперь создайте рецепт для автоответчика:
:0 Whc: vacation.lock * .*for <linuxlala@gmail.com> * !^FROM_DAEMON * !^X-Loop: linuxlala@gmail.com # Store sender’s address in vacation.cache | formail -rD 8192 vacation.cache # If sender’s address not in cache, send # mail containing vacation message. :0 ehc | (formail -rA”Precedence: junk” \ -A”X-Loop: linuxlala@gmail.com” ; \ cat ~/.vacation \ ) | /usr/lib/sendmail -oi -t
Число, следующее за : в рецепте, означает количество действий. Сейчас оно вычисляется автоматически, но для совместимости все-таки нужно писать :0.
Возможно, рецепт не совсем понятен, но если разбить его на две части, все будет очевидно. Рассмотрим первый рецепт. В нем параметр Whc обеспечивает три вещи. W ожидает возвращения из Formail, h обозначает поиск в заголовках, а c велит Procmail сохранить копию сообщения.
Далее идут три строки условия. Первая гарантирует, что в ответ на письма, присланные вам, будет высылаться ответное письмо.
* .*for <linuxlala@gmail.com>
Вторая предотвращает отправку ответа в списки рассылки.
* !^FROM_DAEMON
Третья предотвращает отправку ответа на письма, отправленные самому себе.
* !^X-Loop: linuxlala@gmail.com
В следующей строке мы велим Formail сохранить адрес отправителя в файле vacation.cache.
Следующий рецепт начинается с :0 ehc. e означает, что данный рецепт выполнится только в том случае, если первый рецепт скажет, что в файле vacation.cache нет адреса отправителя. Затем мы велим Sendmail отправить сообщение .vacation отправителю.
Эти два рецепта гарантируют, что отправители не будут получать автоответ на каждое отправленное нам письмо: раз их адреса попали в кэш, автоответы больше не отправляются. Загляните в man procmailex и в man-страницу Procmail для более подробной информации об автоответчиках, затем откиньтесь на спинку кресла и расслабьтесь в жизни, свободной от спама.
Когда блокировать файлы
Блокировка файлов – функция Procmail, позволяющая избежать порчи сообщений во время доставки. Представьте, что Procmail одновременно нужно записать два сообщения в файл. Когда это происходит, есть риск того, что два сообщения создадут путаницу в формате mailbox. Чтобы этого избежать, начинайте рецепт с :0:. Завершающее двоеточие гарантирует, что только одно сообщение будет записываться в файл в один момент времени.
Если рецепт перенаправляет все найденные сообщения или передает их внешнему приложению, блокировка файлов не нужна, так как Procmail не будет писать в них сообщения. :0: автоматически блокирует файл, когда Procmail определяет, куда пишется сообщение, и создает файл блокировки. Если файл блокировки существует, Procmail подождет некоторое время и снова попробует создать блокировку.
Регексп на гарнир
Регулярные выражения [regex] – неотъемлемая часть файла ~/.procmailrc. Если использовать их со знанием дела, они существенно повышают эффективность рецептов. Следующий рецепт ищет в теле сообщения фразу и перемещает его в заданную папку.
:0B: * [0-9]+ Wassup $MAILDIR/silly
Найдя слово ‘wassup’, предваренное одной или более цифрами, в любом месте тела сообщения, Procmail переместит сообщение в папку silly.
Выбор почтового ящика
При выборе формата почтового ящика есть два варианта: mbox и maildir. В примерах нашего урока мы пользуемся типом mbox, определенном в ~/.procmailrc как MAILDIR=$HOME/Mail и DEFAULT=$MAILDIR/new. Если бы мы добавили замыкающий слэш в конец пути, как в $HOME/Mail/ и $MAILDIR/new/, у нас получился бы тип maildir.
В почтовом ящике типа mbox все сообщения хранятся в текстовом формате в одном файле; начало сообщения отмечается строкой From, а конец сообщения – пустой строкой.
Формат maildir подразумевает хранение сообщений в отдельных файлах в каталогах cur, new и tmp; при необходимости они перемещаются из каталога в каталог.