procmail

Created Четверг 05 Март 2015

procmail агент доставки электронной почты и почтовый фильтр. Программа для локальной обработки почтовых сообщений, широко используемая в Unix системах.

Используется для фильтрации почты и сортировки по почтовым ящикам пользователя, в зависимости от содержимого сообщения. Procmail можно настроить таким образом, чтобы она вызывала внешние программы для обработки сообщений. Эта возможность часто используется для настройки фильтрации спама, когда с помощью procmail вызывается внешний спам-фильтр, например SpamAssassin.

https://www.gentoo.org/doc/ru/guide-to-mutt.xml

https://www.freebsd.org/doc/ru/books/handbook/mail-procmail.html

man procmailex <<---- читать man

touch ~/.procmailrc <<---- создать файл

chmod -R 600 ~/.procmailrc <<---- не забывать про права

#=======================.procmailrc=================================

MAILDIR=$HOME/Mail # Директория с почтовыми ящиками

LOGFILE=$HOME/procmail.log # Куда писать логи

VERBOSE=off

#VERBOSE=on только для отладки

FORMAIL=/usr/bin/formail #Где искать formail

SENDMAIL=/usr/bin/sendmail #Где искать sendmail

DEFAULT=$HOME/Mail/<....> # Ящик по умолчанию

###--->> правила сортировки

# То что не попало ни под один критерий сортировки

:0

$HOME/Mail/INBOX

#================================================================

Первым делом необходимо указать в .procmailrc некоторые переменные окружения (среды), здесь приведены некоторые из переменных.

MAILDIR

Указывает на каталог, в котором procmail сохраняет файлы с почтовыми сообщениями. Обычно эта переменная указывает на $HOME/mail или $HOME/Mail. Тот или иной каталог, зависит от используемого почтового клиента.

LOGFILE

Указывает на имя лог-файла, в котором procmail записывает все выполненные операции.

SENDMAIL

Указывает на то, где найти sendmail, который используется для автоматического ответа на сообщения.

FORMAIL

Указывает на то, где найти formail. Эта программа распространяется вместе с procmail и ее задачей является изменение почтовых заголовков или переформатирование сообщения для отправки или сохранения.

DEFAULT

Файл, в котором сохраняется сообщение, если procmail не может применить к нему ни одного определенного правила.

Определять переменную окружения можно в любом месте .procmailrc. Если переменная записана без символа =, за которым следует значение, то такая переменная удаляется.

Что касается правил, то они делятся на две группы: Первые предполагают, что после их применения сообщение доставлено, и остальные.

Первые правила простые, после обработки предполагается, что к этому сообщению дальнейшие правила не применяются и поэтому сообщение считается доставленным.

Второй тип правил, то есть те, которые не считают, что сообщение доставлено после их обработки, очень полезны при использовании нескольких правил и для многократной обработки перед доставкой одного и того же сообщения.

Строки, начинающиеся с :0 или :0: указывают на начало нового правила, которое говорит procmail что делать с сообщением.Оставшиеся строки, то есть те, которые не начинаются с : или ***** рассматриваются как команды, или, другими словами, предпринимаемые procmail'ом действия, удовлетворяющие условию. Некоторыми возможными действиями или командами могут быть: удалить сообщение, переслать сообщение, сохранить сообщение и т.д.

Общий синтаксис правила следующий:

:0 [опции] [ : [исполняемый файл] ]

условие 1

условие 2 .

.

.

условие N

команда

Прежде всего, каждое правило начинается с :0, после этого могут следовать любые из этих опций:

H Условие применяется к заголовку почты.

B Условие ищется в теле сообщения.

D Это условие означает, что верхний и нижний регистры различаются.

A Это правило применяется только когда применялось предыдущее.

a Как и A за исключением того, что при применении предыдущего правила ошибок не должно быть.

E Это правило выполняется, если предыдущее не было применено.

e Это правило будет исполнено, если предыдущее был выполнено, но завершилось с ошибками.

h Команде передается заголовок сообщения.

b Команде передается тело сообщения.

f Команда интерпретируется как фильтр.

c Создать копию cc сообщения. При применении этого правила предполагается, что сообщение доставляется с этим флагом и после его доставки дальнейшие правила можно применять к копии сообщения.

w Ждать окончания исполнения команды для получения результата.

W Так же как и предыдущая опция, но в случае ошибки не выдавать ни каких сообщений.

i Игнорировать возможные опечатки.

r Пишет сообщение таким, как оно есть. Проверка на окончание пустой строкой не выполняется.

По умолчанию, если не была указана ни одна опция, условие применяется к заголовку сообщения (опция H). На стандартный вход команды поступает и заголовок и тело сообщения (опции h и g). Верхний и нижний регистры не различаются.

После :0 и возможных опций может следовать второе :. Если так и есть, то это указывает на то, что файл назначения, куда должно быть записано сообщение, должен быть блокирован во избежание ситуации, когда два процесса одновременно пишут в один файл. Можно указать файл, который будет использован в качестве блокирующего.

Далее идут условия, по одному в строке, и перед каждым ставится символ *****. Условия обычно записываются в виде регулярных выражений для того, чтобы определить последовательность символов в заголовке или теле сообщения. Регулярное выражение среди прочих использует следующие символы:

^ Начало строки.

$ Конец строки.

. Любой символ, за исключением символа возврата каретки.

***** Ноль или более раз.

+ Один или более раз.

? Ноль или более раз.

[a-z] Диапазон символов, в этом случае от a до z.

[^a-z] Любой символ вне диапазона от a до z.

a|b Или 'a' или 'b'

После условий идет одна команда. Если первый символ команды является одним из приведенных ниже, то предполагается особое поведение:

! Сообщение перенаправляется на все указанные почтовые адреса.

| Если после этого символа следует исполняемый файл, то он исполняется всякий раз, когда выполняется условие. Если после этого символа ничего не стоит, то весь текст сообщения

отправляется на стандартный вывод. Если за | следует переменная, то результат указанной команды сохраняется в эту переменную.

*****************примеры************

#отлавливание копий, используя formail

:0 Whc: .msgid.lock

| $FORMAIL -D 16384 .msgid.cache

:0 a

$MAILDIR/duplicates

#удаление писем от адресата spammer@mail.ru

:0 * ^From.*spammer@mail.ru # условие (From: spammer@mail.ru)

/dev/null # каталог /dev/null

#/dev/null — специальный файл в системах класса UNIX, представляющий собой т. н. «пустое устройство». #Запись в него происходит успешно, независимо от объёма «записанной» информации. Чтение из /dev/null #эквивалентно считыванию конца файла (EOF).

#люди которые всегда пишут с одного почтового адреса

:0 * ^From:.*(craig\@hotmail|renee\@local.com)

$MAILDIR/friends

#выборка некоторого спама

:0 * ^Subject:.*(credit|cash|money|debt|sex|sale|loan)

$MAILDIR/spam

*****************************

Автоматический ответ ....???????

Другой ситуацией, в которой procmail может пригодиться, являются автоответчики. Часто очень удобно, например, если вы хотите автоматически отправить ваш публичный ключ PGP любому, запросившему его по E-Mail

Чтобы это сделать, напишите правило, которое считает запросом вашего ключа PGP любое собщение, в строке subject которого есть строка PGP. Это правило можно записать как:

------------------------------------------

0:

^Subject.*PGP | (formail -r ; cat $HOME/key.asc) | sendmail -t

------------------------------------------------

Та же самая идея используется для написания обычной программы, которая сообщает людям о том, что мы в отпуске и ответим на их почтовое сообщение по возвращении:

------------------------------------------------------

0:

| (formail -r; cat $HOME/text-1.txt) | /usr/bin/msmtp

-------------------------------------------------------

В последнем случае условий нет, так как на все сообщения будут отправлены одни и те же ответы.

================================================================