Rambler's Top100

main page

sendmail official site(russian)

security

forum

guestbook

documents

tools & scripts

examples

others

about

НАИМЕНОВАНИЕ

procmailrc - файл настроек procmail

$HOME/.procmailrc


ОПИСАНИЕ

Для быстрого начала прочитайте примечания в конце страницы руководства по procmail(1).

Файл настроек может содержать смесь присваиваний переменных окружения (некоторые из которых имеют особый смысл в procmail), и рецептов. В простейшем случае рецепты представляют собой регулярные выражения из одной строки, с которыми сравнивается заголовок пришедшей почты, и первый рецепт, удовлетворяющий условию, используется для дальнейшего направления почты (обычно в файл). Если во всем файле настроек соответствия не найдено, procmail доставляет почту в $DEFAULT.

Существует два типа рецептов: доставочных и не-доставочных. Если найдено соответствие в доставочном рецепте, procmail рассматривает почту как доставленную и в случае успешного выполнения строки действия прекращает дальнейший просмотр файла .procmailrc. Если обнаружен не-доставочный рецепт, обработка .procmailrc продолжится после строки действия.

Доставочные рецепты служат для записи заголовка и/или тела письма в файл, передачи в другую программу или на другой почтовый адрес.

Не-доставочные рецепты вызывают обработку вывода программы или фильтра программой procmail или которые образуют вложенный блок.

Вы можете указать procmail обрабатывать доставочные рецепты так, как будто они являются не-доставочными, указав в таком рецепте флаг 'c'. Это заставит procmail сформировать копию почты доставкой ее к этому рецепту, продолжая обрабатывать файл настроек.

Используя любое количество рецептов вы можете рассортировать вашу почту напрямую в несколько почтовых ящиков. Имейте в виду, что почта в эти почтовые ящики может приходить одновременно с разных мест (например, если одновременно работают несколько разных программ procmail). Чтобы не вызвать мешанины, настоятельно рекомендуется использовать файлы блокировок.

Присваивания переменным окружения и рецепты могут свободно сосуществовать в файле натроек. Если некоторая переменная имеет особый смысл в procmail, она используется во время ее обработки. Например, вы в любой момент можете изменить текущий каталог, указав новое значение переменной MAILDIR, переключить файлы локировок переменной LOCKFILE, изменить umask и пр.

Присваивания и подстановки этих переменных окружения обрабатываются также, как в sh. Пробелы вокруг '=' игнорируются. Если переменная указана без лидирующего '=', она удаляется из окружения. Любая программа, заключенная в обратные кавычки, запускамая procmail'ом, получает входящую почту через stdin.

Комментарии
Слово, начинающееся с # и все последующие символы до следующей строки игнорируются. Это не распространяется на строки условий, которые не могут быть закомментированы.

Рецепты
Строка, начинающаяся с ':' означает начало рецепта.
Она имеет следующий формат:

              :0 [флаги] [ : [лакльный файл локировки] ]
              <ноль или более условий (по одному на каждую строку)
              <ровно одна строка действия>

Условия начинаются с лидирующего символа '*'. Все, что следует за этим символом, передается в механизм обработки регулярных выражений. Это стандартные регулярные выражения, полностью соответствующие обычным регулярным выражениям egrep(1)

Над условиями выполняется логическое И. Если условия не указаны, то возвращается "истина".

Флаги могут быть одни из следующих:
H Регулярные выражения относятся к заголовку (по умолчанию)
B Регулярные выражения относятся к телу письма
D Различать регистр букв (по умолчанию игнорировать регистр)
A Текущий рецепт зависит от предыдущего рецепта (во вложенном уровне) без флага A или a. Это позволяет связать несколько действий, зависящих от одного условия, в одну цепочку.
a Имеет тот же смысл, что и A, но зависит от успешного завершения предыдущего рецепта
E Этот рецепт должен выполниться только в том случае, если предыдущий рецепт не выполнился. Выполнение этого рецепта также запрещает выполнение любого другого следующего рецепта с флагом E. Это полезно для указания действия типа 'else if'
e Рецепт выполняется, если предыдущий рецепт не выполнился. Это позволяет указать действие при ошибке
h Подает заголовок в канал (pipe) (по умолчанию)
b Подает тело в канал (pipe) (по умолчанию)
f Рассматривет канал как фильтр
c Создает копию текущего письма. Имеет смысл только в доставочных рецептах. При использовании в недоставочных рецептах этот флаг оказывает эффект только на вложенный блок и при создании копии письма клонирует процесс procmail (файлы локировок не затрагиваются). При этом клон продолжает обработку, а родительский процесс пропускает этот блок.
w Ждет завершения работы программы или фильтра и проверяет код его завершения (обычно этот код игнорируется). Если фильтр возвращает ошибку, то текст не будет фильтроваться.
W Этот флаг имеет то же значение, что и флаг w, но подавляет сообщения типа Program failure
i Игнорировать все ошибки записи для текущего рецепта (например, в случае преждевременного закрытия канала)
r Raw mode - обрабатывает почту как есть, без учета того, что письмо должно заканчиваться пустой строкой
Вы можете использовать несколько специальных условий, которые не являются регулярными выражениями. Для их использования условие должно начинаться со следующего символа:
! Инверсия условия
$ Обработать остаток в соответствии с правилами подстановки sh(1) внутри двойных кавычек, пропустить лидирующие пробелы, а затем снова обработать условие
?Использовать код возврата указанной программы
<Проверяет, что общий размер почты меньше указанного количества байт (в десятичной системе счисления)
> Аналог <
variablename ?? Сравнивает остаток со значением переменной окружения (которая не может быть псевдо-переменной). Специальные значения B, H, HB, BH переопределяют область поиска в заголовке/теле письма, определенную для текущего рецепта
\ Для выделения одного из вышеперечисленных символов в начале строки без трансляции

Файл локировки. Если вы указываете второе двоеточие в первом рецепте, то procmail будет использовать файл локировки (только для этого рецепта). Вы можете указать имя этого файла; иначе procmail будет использовать имя файла назначения (или имя после >>) с суффиксом $LOCKEXT.

Строка действия. Строка действия модет начинаться с одного из следующих символов:
! Перенаправление почты по указанным адресам
| Запускает указанную программу, возможно, $SHELL, если обнаружен один из символов $SHELLMETAS. Вы можете перед символом | поставить имя переменной variable=, это вызовет сохранение вывода программы в переменной окружения. Если используется одиночный символ перенаправления потока |, то вывод направляется на stdout
{ После этого символа должен следовать хотя бы один пробел, табуляция или новая строка. Этот символ означает начало вложенного блока. Весь текст до закрывающей фигурной скобки зависит от условий, определенных для текущего рецепта. Допускается неограниченное количество вложений. Закрывающая скобка существует только для разделения блока, она не завершает его выполнения. При достижении закрывающей скобки обработка продолжается как обычно. При использовании блока флаги H и B относятся к блоку, а флаги bh не используются.

Все остальное рассматривается в качестве имени почтового ящика (либо имя файла, либо имя каталога - абсолютное или относительно текущего каталога (см. MAILDIR). Если это файл (возможно, несуществующий), почта будет добавлена к его содержимому.
Если это каталог, почта будет направлена в новый файл с уникальным именем $MSGPREFIX, создаваемый в указанном каталоге. Если имя каталога заканчивается на /., то этот каталог рассматривается как MH-ящик, т.е. procmail будет использовать следующий доступный номер. Вы можете вызвать доставку в несколько каталогов (используя жесткие ссылки).

Значения переменных окружения по умолчанию
LOGNAME, HOME и SHELL Ваши (получателя) значения
SHELLMETAS
 &|<>~;?*[
SHELLFLAGS -c
ORGMAIL /var/spool/mail/$LOGNAME
(если не указан параметр -m, в этом случае значение не определено)
MAILDIR $HOME/
(если имя первого успешного открытого файла rc не начинается с ./ - в этом случае используется значение по умолчанию '.'
DEFAULT $ORGMAIL
MSGPREFIXmsg.
SENDMAIL/usr/sbin/sendmail
HOST Текущее имя машины
COMSATno
LOCKEXT.lock
Другие переменные окружения: IFS, ENV, PWD, PATH=$HOME/bin:/bin:/usr/bin:/sbin:/usr/sbin :/usr/local/bin:/usr/local/sbin:/usr/bin/X11 и USER=$LOGNAME.

Окружение. Все переменные окружения имеют значения по умолчанию.
MAILDIR Текущий каталог, в котором выполняется procmail. Каталоги считаются относительно $MAILDIR.
DEFAULT Имя файла почтового ящика по умолчанию (т.е. если не специально не указано, procmail будет помещать почту в этот файл). Перед записью в этот файл procmail автоматически использует файл локировки с именем $DEFAULT$LOCKEXT. Вам не следует менять значение этой переменной, т.к. оно указывает на стандартный системный почтовый ящик.
LOGFILE Этот файл также содержит все сообщения об ошибках и диагностические сообщения от procmail (при нормальной работе сообщений быть не должно), а также всех программ, запущенных procmail. Если этот файл не определен, все диагностические сообщения и ошибки отправляются по почте отправителю. См. также LOGABSTRACT.
VERBOSE Вы можете включить расширенную диагностику, установив значение этой переменной в 'yes' ('on') или 'no' ('off')
LOGABSTRACT Перед самым выходом procmail записывает резюме доставленного сообщения в файл $LOGFILE, включая поля заголовка 'From ' и 'Subject: ', имя почтового ящика, в который доставлено письмо, и размер сообщения в байтах. Уставновив значение этой переменной в 'no', создание резюме запрещается. Со значением 'all' procmail создает резюме для каждого успешного рецепта.
LOG Все, что присваивается этой переменной, записывается в файл $LOGFILE.
ORGMAIL Обычно это системный почтовый ящик (ORiGinal MAILbox). Если по некоторой причине (например, при переполнении диска), почта не может быть доставлена, то, как крайний случай, будет использоваться этот почтовый ящик. Если procmail не смог записать и в этот ящик, то почта возвращается отправителю.
LOCKFILE Глобальный файл-семафор. Если этот файл существует, procmail будет ждать его исчезновения перед продолжением своей работы, и создаст его сам (и удалит) при необходимости. Если указано несколько файлов локировки, то перед созданием второго файла первый будет удален. Использование глобального файла локировки нежелательно, вместо этого по возможности используйте в рецептах локальные файлы локировок.
LOCKEXT Расширение по умолчанию, которое добавляется к имени файла назначения для получения имени локального файла локировки.
LOCKSLEEPЧисло секунд ожидания между проверками файла локировки (если он существует). По умолчанию 8 секунд.
LOCKTIMEOUT Число секунд, прошедшее со времени создания/измениения файла локировки, по прошествии которых procmail начинает считать, что возникла ошибка и файл локировки следует принудительно удалить. Если значние 0, то время не проверяет, и procmail будет ждать бесконечно. Значение по умолчанию - 1024 секунды. Эта переменная используется для предотвращения зависания программ sendmail/procmail.
TIMEOUT Число секунд, прошедшее с момента запуска потомка procmail, после которого принимается решение его убить. Потомок получает от procmail сигнал TERM, и обработка файла рецепта продолжается. Значение 0 означает бесконечное ожидание. Значение по умолчанию - 960 секунд.
MSGPREFIX Префикс имени файла, используемого при доставке в каталог (не используется при доставке в MH-каталог)
HOSTЕсли это не имя машины, выполнение procmail прекращается. Если в командной строке указаны другие файлы рецептов, продолжается обработка следующего файла. Если все файлы исчерпаны, программа завершает работу, но без генерации сообщений об ошибках (т.е. почтовый агент будет думать, что почта доставлена)
UMASK Все, что присваивается этой переменной, рассматривается как восьмеричное число. Если значение не указано, принимается 077. Если umask допускает значение o+x, то все почтовые ящики, куда procmail направляет почту, получают режим доступа o+x. Это можно использовать для проверки поступления новой почты.
SHELLMETAS Если один из символов в SHELLMETAS присутствует в строке, обозначающей фильтр или программу, то эта строка вместо непосредственного исполнения передается в $SHELL.
SHELLFLAGSЛюбой вызов $SHELL будет выглядеть так: "$SHELL" "$SHELLFLAGS" "$*";
SENDMAIL Если вы не используете пересылку почты, не обращайте внимание на эту переменную. Она определяет программу, вызываемую для пересылки почты. Программа вызывается в виде "$SENDMAIL" "$@";
NORESRETRY Число повторов, выполняемых при возникновении ошибок "переполнена таблица процессов", "переполнена таблица файлов", "не хватает памяти", "не хватает места на разделе подкачки". Если это число отрицательное, то procmail будет повторять бесконечное число циклов; если не указано - 4 раза. Повторы осуществляются с интервалом $SUSPEND секунд. Смысл этого параметра в том, что, например, при переполнении таблицы процессов или нехватке дискового пространства, другие программы обнаруживают это и завершают свою работу, освобождая ресурсы для procmail
SUSPEND Число секунд, которое procmail ожидает освобождения ресурсов (памяти, дискового пространства), которые в данный момент недоступны. По умолчанию 16 секунд. См. LOCKSLEEP
LINEBUF Величина внутреннего буфера строк, который должен быть больше 128. Все строки, считываемые из файла рецептов, не должны превышать длину $LINEBUF до и после расширения. Если значение не указано, оно принимается равным 2048. Это ограничение не распространяется на почту, которая может иметь разные длины строк или быть вообще двоичным файлом.
DELIVERED Если установлено в 'yes', procmail сообщает почтовому агенту о доставке почты. Если почта не может быть доставлена после присваивания этого значения (yes), почта теряется (без возврата отправителю).
TRAP По завершении своей работы procmail выполняет содержимое этой переменной. Копия письма может быть прочитана через stdin. Любой вывод будет добавлен в $LOGFILE. Возможное использование TRAP: удаление временных файлов, регистрация резюме и пр.
См.EXITCODE и LOGABSTRACT
EXITCODE Если procmail завершает работу, а значением этой переменной является положительное целое число, procmail будет использовать это число в качестве кода возврата. Если переменная установленная, но имеет пустое значение, procmail возвращает значение, полученное после выполнения программы из переменной TRAP. Если эта переменная не установлена, procmail устанавливает ее на короткое время перед вызовом программы из TRAP.
LASTFOLDER Значение этой переменной присваивается procmail при доставке в каталог или в программу. Она всегда содержит имя последнего каталога (или программы), куда доставлялась почта.
MATCH Значение этой переменной присваивается при экстракции текста при сравнении с регулярным выражением. Оно содержит весь текст, совпадающий с регулярным выражением после символа '\/'.
SHIFT Присваивание этой переменной положительного значения оказывает такой же эффект, как команда 'shift' в командном интерпретаторе. Эта команда полезна при выборке дополнительных аргументов, передаваемых procmail при использовании его в качестве общего фильтра почты.
INCLUDERC Имя файла рецепта (относительно текущего каталога), который включается так, как будто он является частью текущего файла рецепта. Допускаются неограниченные вложения.
COMSAT Уведомление о поступлении новой почты (Comsat(8)/biff(1)) по умолчанию включено. Оно может быть выключено установкой значения этой переменной в 'no'. Кроме того, сервис comsat можно настроить установкой переменной в значения @service, @hostname или service@hostname. Если значение не указано, используется biff@localhost.
DROPPRIVS Если значение 'yes', procmail сбрасывает все привилегии, которые может иметь (suid или sgid). Это полезно только в том случае, если вы хотите, чтобы дальнейшая часть файла рецепта выполнилась от имени получателя.

Расширенные регулярные выражения
Следующие ключевые символы используются как в процессоре регулярных выражений procmail, так и в стандартном процессоре.

       ^         Начало строки.
 
       $         Конец строки.

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

       a*        Любая последовательность из нуля или более 'a'.

       a+        Любая последовательность из одного или более  'a'.

       a?        Либо ноль, либо один символ 'a'.

       [^-a-d]   Любой символ кроме минуса, a, b, с, d или символа
                 новой строки.

       de|abc    Либо последовательность `de,' либо `abc'.

       (abc)*    Ноль или более число повторений `abc'.

Конечно, это только примеры. Допустимы и более сложные комбинации.

Следующие ключевые символы имеют особое значение в расширениях procmail:

       ^ или $  Новая строка (при обработке нескольких строк)

       ^^        Закрепить выражение в самом начале области поиска,
                 или если оно в конце выражения, закрепить его в 
                 самом конце области поиска

       \< или \> Совпадение символа до или после слова.
                 Это сокращенная запись для `[^a-zA-Z0-9_]',
                 но может включать конец строки. Поскольку оно   
                 совпадает с актальными символами, пригодно только для
                 разделения слов.

       \/        Делит выражение на две части. Все, что удовлетворяет
                 правой части, присваивается переменной MATCH

ПРИМЕРЫ
См. procmailex(5)

ПРЕДУПРЕЖДЕНИЯ
Множественные строки в строке действия, определяющей запуск программы, должны заканчиваться обратной косой чертой для обозначения продолжения на следующей строке.

Не помещайте комментарии в регулярные выражения в троках условий рецепта. Эти строки подаются в процессор регулярных выражений посимвольно.

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

Берегитесь мертвых блокировок при выполнении таких вредных операций, как пересылка почты на собственный счет. Мертвых блокировок позволяет избежать правильное использование LOCKTIMEOUT

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

Если вы указали флаг 'h' или 'b' в рецепте доставки, и рецепт совпадает, то если не указан флаг 'c', тело письма будет тихо утеряно.


ОШИБКИ

Единственная подстановка переменных окружения, которая может обрабатываться самим procmail, это $name, ${name}, ${name:-text}, ${name:+text}, ${name-text}, ${name+text}, $#, $n, $$, $?, $_, $- и $=;, где $_ заменяется именем текущего файла рецепта, $- - $LASTFILDER, а $= содержит метку текущего рецепта. При использовании опций -m или -a, $@ представляет указанный аргумент (список), но только при передаче его в списке аргументов в программу.

Procmail не поддерживает расширение символа '~'.

При обработке файла рецепта используется буфер длиной $LINEBUF символов. Любое расширение должно уместится в этом буфере, в противном случае результат непредсказуем.

Если глобальный файл локировок имеет относитльный маршрут и текущий каталог оличен от того, в котором создан глобальный файл локировок, то этот глобальный файл не удаляется при завершении в этом месте работы procmail. (Совет: используйте абсолютные имена при указании глобальных файлов локировок).

Локальный файл локировок в рецепте, открывающем вложенный блок, не работает так, как нужно.

При перехвате вывода stdout из рецепта в переменную окружения, обрезается ровно один символ конца строки.


ПРОЧЕЕ

Если регулярное выражение содержит ^TO, оно заменяется на
      (^((Original-)?(Resent-)?(To|Cc|Bcc)|
       (X-Envelope|Apparently(-Resent)?)-To):(.*[^a-zA-Z])?)
, что должно перехватывать всю информацию о получателе.

Если регулярное выражение содержит ^FROM_DAEMON, оно заменяется на

       (^(Precedence:.*(junk|bulk|list)
       |(((Resent-)?(From|Sender)|X-Envelope-From):|>?From
       )(.*[^(.%@a-z0-9])?(Post(ma?(st(e?r)?|n)|office)
       |(send)?Mail(er)?|daemon|mmdf|root|n?uucp|smtp|response
       |LISTSERV|owner|request|bounce|serv(ices?|er)
       |Admin(istrator)?)([^).!:a-z0-9].*)?$[^>]))'
, что должно перехватывать всю почту от почтовых демонов.

Если регулярное выражение содержит ^FROM_MAILER, оно заменяется на

       (^(((Resent-)?(From|Sender)|X-Envelope-
       From):|>?From )(.*[^(.%@a-z0-9])?(Post(ma(st(er)?|n)
       |office)|(send)?Mail(er)?|daemon|mmdf|root|n?uucp|smtp
       |response|serv(ices?|er)|Admin(istrator)?)([^).!:a-
       z0-9].*)?$[^>])
(урезанная версия ^FROM_DAEMON), что должно перехватить почту, идущую от большинства почтовых демонов.

При присваивании логических значений переменным типа VERBOSE, DELIVERED или COMSAT, procmail принимает за истину любую строку, начинающуюся: с ненулевого числа, `on', `y', `t' или `e'. Ложь - это любая строка. начинающаяся с 0, `off', `n', `f' или `d'.

Если строка действия в рецепте определяет программу, укажите одну пару обратная косая черта - символ новой строки, иначе пустая строка будет преобразована в новую строку.


ЗАМЕЧАНИЯ

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

Лидирующий символ '|' в строку действия для указания программы или фильтра обрезается перед проверкой в $SHELLMETAS.

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

При очень сложной обработке почты вы можете даже вызывать procmail рекурсивно.


АВТОР

Stephen R. van den Berg at RWTH-Aachen, Germany

ПЕРЕВОД

Пит

index