Денис Колисниченко
Иногда возникает потребность в создании автоответчика, например, вам ежедневно приходит очень много сообщений и вы не в состоянии ответить на все сразу. В этом случае, чтобы адресант не волновался, ему будет автоматически направлен ответ, что его сообщение обязательно будет прочитано.
В операционной системе Linux данная задача решается довольно просто - вам достаточно лишь установить программу procmail и потратить несколько минут на ее настройку.
Программа procmail читает переданные ей сообщения со стандартного ввода и выполняет над ними действия, указанные в файле .procmailrc. Действие может быть любым - удалить, сохранить, проигнорировать или написать автоматический ответ. Пользователь, то есть вы, может также определить свое действие, например, поиск в теле сообщения какой-нибудь строки и сохранение результата поиска в отдельный файл.
Прежде всего, нужно убедиться, установлена ли программа procmail. В RedHat-подобных системах это можно сделать с помощью команды:
rpm -qa | grep procmail
Если вывод команды пустой, значит, программа не установлена. Для ее установки нужно установить пакет procmail. Программа procmail является стандартной программой, поэтому она находится на инсталляционном диске вашего дистрибутива. Я использую дистрибутив Red Hat 7.3, в состав которого входит программа procmail версии 3.22 (она находится на первом инсталляционном диске). Если вы хотите обновить версию программы, посетите сайт http://rpmfind.net. RpmFind - это поисковый сервер пакетов RPM, который поможет вам найти последнюю версию любого пакета для вашей системы.
Установив программу, создайте в своем домашнем каталоге файл .forward. Этот файл используется для перенаправления почты. Например, если в нем указать адрес электронной почты, вся приходящая вам почта будет перенаправлена на этот адрес. Но мы сейчас будем использовать этот файл для перенаправления почты не на другой адрес, а на программу procmail. Добавьте в файл .forward следующую строку:
|IFS=' ' && exec /usr/bin/procmail USER=<den>
Имя пользователя denis нужно заменить нужным вам именем. Программу procmail можно вызывать и по-другому: с помощью правил программы sendmail, но мы сейчас не будем рассматривать этот способ.
Теперь перейдем к редактированию конфигурационного файла .procmailrc, который должен находится в вашем домашнем каталоге.
Строки файла конфигурации, которые начинаются с символа решетки (#) считаются комментариями и будут проигнорированы программой.
Строки, начинающиеся с последовательности символов :0 или :0:, определяют правила, на основании которых procmail выполнит действие над сообщением.
После символов :0 можно указать опции поиска и исполнимый файл, которому будет передано сообщение. Общий синтаксис такой:
:0 [опции] [: программа]
Опция H (header) означает, что условие будет применяться к заголовку письма, а опция B - к телу. Опция D указывает программе различать нижний и верхний регистры символов. По умолчанию используется опция H, то есть условие применяется только к заголовку, и верхний и нижний регистры не различаются. Более подробно об опциях вы можете прочитать в справочном руководстве по программе procmail (man procmail).
Условие задается с помощью регулярных выражений. Причем, каждое условие начинается символом * и записывается в отдельной строке. Регулярные выражения задаются как обычно, а именно:
После условия указывается одна команда. Если первый символ команды !, то сообщение будет перенаправлено на все указанные почтовые адреса, а если |, то сообщение будет передано исполнимому файлу (программе), который указан после символа |. Вместо исполнимого файла можно указать переменную окружения, в которую будет записан результат.
Мы уже знаем достаточно много, чтобы создать небольшой автоответчик. Следующее правило создаст простой автоответчик, который сообщит отправителю, что его сообщение будет прочитано:
0: | (formail -r; cat $HOME/message.txt) | sendmail -t
Данный автоответчик автоматически отправит сообщение из файла message.txt по адресу отправителя. В файле вы можете указать любую информацию, например, "Ваше сообщение будет прочитано".
Иногда нужно создать автоответ только на некоторые сообщения, например, только на те в поле Subject которых указана определенная тема. Следующий автоответчик отправит файл vacancy.txt всем, кто отправил вам сообщение, указав в теме слово JOB:
0: * ^Subject.*JOB | (formail -r ; cat $HOME/vacancy.txt) | sendmail -t
Теперь усложним нашу задачу. Предположим, что нам приходит два списка рассылки, и мы хотим, чтобы они отфильтровывались в отдельные файлы. Мы также получаем корреспонденцию для локального пользователя ivanov, которую нам нужно ему перенаправить.
:0 * ^From.* [email protected] subscribe.ru :0 * ^Subject.*DELPHI delphi :0 * ^Subject.*Ivanovy ! ivanov
Первое правило будет сохранять все сообщения, полученные от [email protected] в файл subscribe.ru. В нашем случае полный путь к файлу не указан, поэтому файл subscribe.ru будет создан в каталоге $MAILDIR.
Второе правило аналогично первому, только поиск производится не по полю FROM, а по полю SUBJECT (опция D не используется, поэтому регистры символов не различаются). Третье правило перенаправит сообщение локальному пользователю ivanov, который должен быть зарегистрирован на вашей машине. Вместо имени локального пользователя можно указать любой адрес электронной почты, например, [email protected].
Переменная окружения MAILDIR также устанавливается в файле .procmailrc. Обычно она имеет значение $HOME/Mail.
Кроме переменной окружения MAILDIR вы можете указать переменные окружения SENDMAIL и FORMAIL, которые содержат полный путь к программам sendmail и formail. Переменная окружения LOGFILE содержит имя файла протокола программы procmail, а переменная DEFAULT - имя файла, в который будут записываться сообщения, к которому procmail не может применить ни одно из правил.
Вот полный листинг моего файла конфигурации .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
Проанализируем его: почта будет сохраняться в каталоге /home/den/mail в файле mbox. Если в теме (поле Subject) сообщения было найдено слово Privet, то все сообщения будут сохраняться в файле /home/den/mail/privets. Если тема сообщения содержит слово Job, автоматически будет отправлен файл vacancy.txt по адресу отправителя. Обратите внимание на то, то последняя команда должна быть записана в одной строке. Если вы напишите
| (formail -r ; cat /home/den/vakancy.txt) | /usr/sbin/sendmail -t
автоответ создан не будет. Файл vakancy.txt должен быть текстовым (в нем содержится ответ на сообщение с темой Job) - это не вложение.
Файл протокола, в который программа procmail запишет адрес отправителя, тему и размер сообщения, называется from.
Программа procmail будет использовать файл блокировки, который называется /home/den/.lockmail.
Теперь нам нужно настроить почтовые клиенты. Настройку почтового клиента рассмотрим на примере популярной программы Kmail. Как вы знаете, все Unix-почтовые клиенты могут получать почту по протоколам POP3, IMAP и собирать почту в локальном почтовом ящике. Локальный почтовый ящик называется /var/spool/mail/<имя пользователя> (в нашем случае это /var/spool/mail/den). Этот файл также используется программой procmail для обработки почты, поэтому в программе Kmail в качестве почтового ящика нужно указать файл $MAILDIR/mbox (это наш почтовый ящик по умолчанию). Запустите программу Kmail и выберите команду меню Настройка, Настроить Kmail. Затем перейдите в раздел Сеть и добавьте локальный ящик. На рисунке 1 почтовый ящик сконфигурирован с учетом созданной нами конфигурации procmail, а именно:
Файл блокировки нужно обязательно использовать, иначе вы
рискуете потерять почту, особенно при частой периодической
проверке новых сообщений.
Кроме файла mbox мы использовали файл privets - для него тоже нужно создать почтовый ящик.
Потом все сообщения (из обоих ящиков) будут помещены в папку Входящие программы Kmail. Ясное дело, что нас это не устраивает, поэтому создайте несколько папок и используйте для каждого ящика свою папку.
Все ваши вопросы и комментарии вы можете отправить по адресу dhsilabs@mail.