Lua*

Разработка → ImapFilter — мощный инструмент для сортировки почты

из песочницы
dtm 18 ноября 2012 в 20:54 6,1k
По работе мне приходится ежедневно работать с большим количеством писем, и чтобы не упускать из виду важную информацию, их нужно сортировать. Первое время с этой задачей вполне себе справлялся настроенный 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

чтобы наш фильтр запускался каждую минуту и красиво раскладывал почту по нужным папкам.

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

На этом все, спасибо за внимание.
Проголосовать:
+4
Сохранить: