Vpopmail procmail
Содержание
Задача
Появилась задача поставить автоответчик на один почтовый ящик vpopmail-пользователя уехавшего в отпуск.
Решение
Устанавливаем procmail:
# cd /usr/ports && make search name=^procmail # cd /usr/ports/mail/procmail && make install clean && rehash
Затем в папке vpopmail-пользователя (в моей системе это /usr/local/vpopmail/domains/mydomain.ru/user, в этой папке есть папка Maildir) создаем DOT-файл .qmail:
|preline /usr/local/bin/procmail -m ./.procmailrc
Затем в этой же папке создаем файл .procmailrc:
SENDMAIL=/usr/sbin/sendmail FORMAIL=/usr/local/bin/formail LOGFILE=/var/log/procmail/procmail.log #Не забудем создать и дать права (в моем случае vpopmail) VERBOSE=off # Подробный лог, для отладки поставьте "on" MAILDIR=/usr/local/vpopmail/domains/mydomain.ru/user/Maildir #Путь до Maildir DEFAULT=/usr/local/vpopmail/domains/mydomain.ru/user/Maildir/ #Путь по умолчанию, куда будет сохранятся письмо если не попадет не под одно правило SHELL=/bin/sh :0 c # ":0"- означает начало правила, "c" - означает, что после обработки правила, обработка продолжится дальше * !^X-Loop: user@mydomain.ru # правила для автоответчика | (formail -r -A"X-Loop: user@mydomain.ru" ; cat /usr/local/vpopmail/domains/mydomain.ru/user/mess.txt) | /usr/sbin/sendmail -t -fuser@mydomain.ru # отсылка сообщения находящегося в файле /usr/local/vpopmail/domains/mydomain.ru/user/mess.txt отправителю. # Обратим внимание, что так ка мы использовали опцию "c" в начале правила и других правил больше нет, # то сообщение доставляется по маршруту DEFAULT, то есть в нашем случае /usr/local/vpopmail/domains/mydomain.ru/user/Maildir/ # и письмо дойдет пользователю.
Затем создаем файл /usr/local/vpopmail/domains/mydomain.ru/user/mess.txt в кодировке utf8:
Здравствуйте! Я уехал в отпуск! Вася Пупкин.
Не забываем, что файлы должны принадлежать vpopmail (это в нашем случае).
Дополнения
Коротко о procmail.
Общий синтаксис правил:
:0 [опции] [ : [исполняемый файл] ] * условие 1 * условие 2 . . * условие N команда
Опции:
- H Условие применяется к заголовку почты.
- B Условие ищется в теле сообщения.
- D Включает чувствительность к регистру.
- A Это правило применяется только когда применялось предыдущее.
- a Как и A, за исключением того, что при применении предыдущего правила ошибок не должно быть. E Это правило выполняется, если предыдущее не было применено.
- e Это правило будет исполнено, если предыдущее был выполнено, но завершилось с ошибками.
- h Команде передается заголовок сообщения.
- b Команде передается тело сообщения.
- f Команда интерпретируется как фильтр.
- c Создать копию cc сообщения. При применении этого правила предполагается, что сообщение доставляется с этим флагом и после его доставки дальнейшие правила можно применять к копии сообщения.
- w Ждать окончания исполнения команды для получения результата.
- W Так же как и предыдущая опция, но в случае ошибки не выдавать ни каких сообщений.
- i Игнорировать возможные опечатки.
- r Пишет сообщение таким, как оно есть. Проверка на окончание пустой строкой не выполняется.
По умолчанию, условие применяется к заголовку сообщения и нечувствительно к регистру.
После :0 и возможных опций может следовать второе :. это указывает на то, что файл назначения, куда должно быть записано сообщение, должен быть блокирован во избежание ситуации, когда два процесса одновременно пишут в один файл. Можно указать файл, который будет использован в качестве блокирующего.
Далее идут условия, по одному в строке, и перед каждым ставится символ *. Условия обычно записываются в виде регулярных выражений для того, чтобы определить последовательность символов в заголовке или теле сообщения. Символы регулярок:
- ^ Начало строки.
- $ Конец строки.
- . Любой символ, за исключением символа возврата каретки.
- * Ноль или более раз.
- + Один или более раз.
- ? Ноль или более раз.
- [a-z] Диапазон символов, в этом случае от a до z.
- [^a-z] Любой символ вне диапазона от a до z.
- a|b Или 'a' или 'b'
После условий идет одна команда. Если первый символ команды является одним из приведенных ниже, то предполагается особое поведение:
- ! Сообщение перенаправляется на все указанные почтовые адреса.
- | Если после этого символа следует исполняемый файл, то он исполняется всякий раз, когда выполняется условие. Если после этого символа ничего не стоит, то весь текст сообщения отправляется на стандартный вывод. Если за | следует переменная, то результат указанной команды сохраняется в эту переменную.