По работе мне приходится ежедневно работать с большим количеством писем, и чтобы не упускать из виду важную информацию, их нужно сортировать. Первое время с этой задачей вполне себе справлялся настроенный Thunderbird на рабочей машине, но хотелось проверять почту не только на работе, но и дома, и еще где-нибудь — словом, в любом удобном месте при наличии желания и возможности. Стали появляться мысли о некоем серверном решении. Казалось бы — «все уже украдено до нас» (с) — связка fetchmail+procmail+(exim/postfix/sendmail и пр.)+mutt вполне себе рабочая и неплохо себя зарекомендовала, но мне не нужны были все возможности столь мощных почтовых программ, хотелось минимализма, простоты и функциональности.
Как, наверное, многие из вас знают, mutt изначально умеет работать с почтовым сервером по протоколу imap, и замечательно проверяет почту своими силами (т.е. fetchmail нам уже не нужен), так же замечательно он умеет и отправлять почту через сторонний smtp-сервер (т.е. MTA тоже не нужен), остается только решить проблему фильтрации почты. И тут на помощь приходит он — imapfilter.
Imapfilter, как очевидно из названия, фильтрует почту, соединяясь с почтовым сервером по протоколу IMAP. Возможности у этой программы воистину безграничные, с ее помощью можно делать практически все (создание/удаление/изменение папок, фильтрация/копирование/перемещение/удаление писем, установка различных флагов, сортировка и поиск писем и т.д.).
Конфигурационный файл программы представляет собой набор правил, записанных на языке lua (после просмотра типовых примеров конфига и изучения мануала сложностей с написанием собственных правил быть не должно).
Итак, небольшая инструкция по базовой настройке.
Предположим, что у нас debian-подобная система. Ставим пакет imapfilter:
$ sudo apt-get install imapfilter
И после установки создаем в своей домашней директории папку .imapfilter, а в ней — конфигурационный файл с названием «config.lua»:
$ mkdir ~/.imapfilter
$ touch ~/.imapfilter/config.lua
Теперь приступим к редактированию конфига. В качестве редактора пусть выступает стандартный Nano:
$ nano ~/.imapfilter/config.lua
Все, что начинается с "--" в конфигурационном файле считается комментариями и, соответственно, не обрабатывается.
-- Таймаут (в секундах), в течение которого нужно ждать ответ от сервера --
timeout = 120
-- Сообщаем, что мы хотим вручную указать имена почтовых ящиков (читай, imap-каталогов) --
options.namespace = false
-- Настройка учетной записи --
account_name = IMAP {
server = 'mailserver.ru',
username = 'your_login',
password = 'your_pass',
}
Сюда же, если нужно, можно добавить поля 'ssl' и 'port', заполнив их необходимыми значениями.
Далее определяем список папок, и проверяем текущий статус каталога с входящей почтой:
mailboxes, folders = account_name:list_all()
account_name:check_status()
Опция «list_all()» вернет список всех доступных каталогов и подкаталогов в Вашем почтовом ящике, а опция «check_status()», соответственно, предоставит информацию о том, сколько в Вашем ящике всего писем, сколько отправленных, сколько непрочитанных (перед началом фильтрации необходимо убедиться, что у Вас уже созданы все необходимые каталоги, по которым Вы будете раскладывать почту, либо можно воспользоваться функцией «create_mailbox» для создания нового каталога).
Затем мы определим переменную «results», которую будем использовать в дальнейшем для фильтрации почты:
results = account_name.INBOX:select_all()
Теперь можно переходить непосредственно к правилам. Грубо говоря, обычное правило будет выглядеть примерно так:
res = results:contain_subject('hello')
res:move_messages(account_name.folder)
где:
- res — произвольное имя переменной, которая будет отвечать за письма, подходящие по условию;
- results:contain_subject('hello') — здесь осуществляется собственно процесс фильтрации;
- res:move_messages(account_name.folder) — действие, которое будет выполнено над письмами.
Можно фильтровать письма по отправителю (contain_from), по получателю (contain_to), по теме (contain_subject), по полю «Копия» (contain_cc), по размеру (is_larger и is_smaller), по дате (is_older, например, если письмо старше какого-то определенного количества дней) и по куче других параметров (см. ссылку внизу страницы).
После фильтрации письма можно копировать (copy_messages), перемещать (move_messages), помечать как прочитанное/непрочитанное/на удаление и пр., и удалять (delete_messages)
Ну и в качестве примера, рассмотрим случай, когда письма от пользователя user@domain.ru будут копироваться в папку «user» в каталоге «Inbox», письма с темой «Hello, world» будут перемещаться в папку «spam», а все письма в папке work, которые старше 10 дней, будут удалены.
res = results:contain_from('user@domain.ru')
res:copy_messages(account_name.user)
--
res = results:contain_subject('Hello, world')
res:move_messages(account_name.spam)
--
old = account_name.work:is_older(10)
account_name.work:delete_messages(old)
В процессе фильтрации можно использовать несколько условий одновременно, это реализуется с помощью логических операторов: "+" (логическое «ИЛИ»), "*" (логическое «И») и "-" (логическое «НЕ»):
res = results:contain_subject('Hello, world')+
results:contain_from('user@domain.ru')
res:move_messages(account_name.spam)
Думаю, дальнейшая аналогия понятна. Еще Imapfilter может работать с подкаталогами в Вашем почтовом ящике (например, Inbox/work/1 или Inbox/work/2). В этом случае при выполнении действия над письмом запись пути к этому подкаталогу будет немного другой:
res:move_messages(account_name['work/1'], results)
В принципе, этих знаний уже достаточно, чтобы сортировать почту для большинства задач. После завершения настроек нужно соответствующим образом установить права доступа: 700 на каталог .imapfilter и 600 на файл конфига:
$ chmod 700 ~/.imapfilter
$ chmod 600 ~/.imapfilter/config.lua
После завершения всех настроек запускаем imapfilter в режиме отладки и записью лога со следующими ключами:
imapfilter -l logfile.log -d
В домашней папке программы появится лог-файл с соответствующим названием, и файл с именем «Debug.*****», в котором будет вся информация по действиям программы — там можно посмотреть, какое правило и как сработало.
И, напоследок, добавим в crontab строку
* * * * * imapfilter
чтобы наш фильтр запускался каждую минуту и красиво раскладывал почту по нужным папкам.
Здесь можно ознакомиться со всеми опциями и параметрами, которые доступны в конфигурационном файле.
На этом все, спасибо за внимание.
Автор: dtm