Perl-скрипт для уведомления о новых письмах

17 мая 2012

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

Готовые решения и что мне в них не понравилось

Первая программа называется PopTray Minus. При беглом ее изучении выяснилось, что она мне не подходит. Во-первых, минимальный интервал, с которым проверяется электронная почта, почему-то равен пяти минутам. Лично я хотел бы проверять почту каждую минуту. Во-вторых, в файле ~/.poptrayrc был обнаружен сохраненный пароль от почтового ящика в base64. Возможность шифровать пароли не предусмотрена.

Второе приложение — Mail Notification. Выглядит оно получше. Поддерживает все, что должно поддерживать, умеет проверять почту раз в минуту, хранит пароли в Gnome Keyring. К сожалению, у меня эта прога периодически падает. В багтрекере проекта я насчитал 15 тикетов со словами crash и fault в названии. Учитывая, что программа в общем-то довольно простая, а ее код, тем не менее, состоит из 50 тысяч непустых строк на языке Си (mother of god!), это не удивительно.

Еще меня беспокоит, что PopTray Minus и Mail Notification с легкостью определяют уникальность новых писем, получаемых по POP3, при условии, что обе программы не умеют удалять письма. Насколько я знаю протокол POP3, для этого нужно либо воспользоваться командой UIDL, либо получить заголовки всех сообщений с помощью команды TOP. Тем временем, многие почтовые сервисы позволяют удалять письма по POP3, оставляя при этом возможность прочитать их через веб-интерфейс.

Допустим, у меня в ящике 100 000 писем (вполне реальная цифра — по 10 писем ежедневно в течение трех лет) и мы хотим определить, сколько из них являются новыми, при условии, что старые письма не удаляются. В лучшем случае, то есть, если сервер поддерживает команду UIDL, на одно хождение по POP3 будет тратиться около 1 Мб трафика, а также сколько-то оперативной памяти, процессорного времени и обращений к диску. Не критично, конечно, но все же как-то расточительно. В общем, по-моему, галочка «удалять письма» должна быть обязательно.

Мой скрипт и как им пользоваться

Трудно сказать, что проще — пропатчить должным образом PopTray Minus (программа написана на Python, с которым я немного знаком) или нахреначить на Perl свой велосипед. Решил начать с велосипеда. Если он меня не устроит, буду ковырять PopTray Minus.

Последнюю версию скрипта можно скачать из репозитория на BitBucket. Если же вас интересует не последняя версия, а та, что была актуальна на момент написания этих строк, качайте ее отсюда.

После распаковки архива требуется установить зависимости скрипта. Сделать это можно либо вручную, посмотрев названия нужных модулей в начале скрипта, либо автоматически, запустив из под рута скрипт INSTALLDEPS.sh. Кстати, в последнее время я включаю скрипт для автоматической установки зависимостей во все свои проекты на Perl. Очень удобно! Идею я подглядел в блоге koorchik’a.

Помимо Perl-модулей также понадобятся утилиты zenity (для вывода уведомлений) и gpg (чтобы не светить пароли):

sudo apt-get install zenity gnupg

Создаем конфиг ~/.email_notifier примерно следующего содержания:

{
  "main": {
    "check_interval": 60
  },
  "pop3_list": [
    {
      "user": "user@yandex.ru",
      "password": "secret",
      "host": "pop.yandex.ru"
    },
    {
      "user": "user@gmail.com",
      "password": "secret",
      "host": "pop.gmail.com",
      "ssl": 1,
      "delete": 1
    },
    {
      "user": "user@mail.ru",
      "password": "secret",
      "host": "pop.mail.ru",
      "ssl": 1
    }
  ]  
}

Надеюсь, тут вопросов не возникнет. Только будьте осторожны с флагом delete! Если он установлен, скрипт скомандует POP3 серверу удалять все имеющиеся письма. Разные почтовые сервисы в этом случае ведут себя по-разному, о чем я еще упомяну ниже.

Конфиг создан, все зависимости установлены, теперь пробуем запустить скрипт:

./email-notifier.pl --no-master-password

Если видим уведомления вроде таких:

Уведомление о новом письме

… значит, все хорошо. В противном случае вы скорее всего увидите сообщения об ошибках, которые помогут вам разобраться в проблеме.

Наконец, шифруем конфигурационный файл:

gpg --cipher-algo AES256 --digest-algo SHA512 -o OUT -a --symmetric IN

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

gpg -o OUT --decrypt IN

Останавливаем скрипт и прописываем его куда-нибудь на автозапуск, на этот раз без флага --no-master-password. При запуске появится окошко с просьбой ввести мастер-пароль.

Тонкости настройки почты на GMail/Mail.ru/Yandex

Как я уже отметил, разные почтовые сервисы ведут себя по-разному при удалении писем по POP3. Например, GMail можно настроить так, чтобы письма становились невидимыми POP3 клиенту, но оставались доступными через веб-интерфейс:

Настройка POP3 в гуглопочте

Экспериментальным путем удалось установить, что Mail.ru всегда ведет себя таким образом и изменить это через настройки нельзя. А вот Яндекс.Почта при удалении письма по POP3 всегда помещает его в папку «Удаленные».

Обратите внимание, что описанное поведение Яндекса, Мейла и Джимейла может в любой момент измениться. Если вы привыкли хранить на почте ценную информацию, я бы рекомендовал сменить мозги ничего не удалять по POP3. Вместо этого, к примеру, можно создать папку, недоступную по POP3 и перекидывать в нее письма после прочтения.

Вопросы читателям

Во-первых, не фигня ли полнейшая этот мой скрипт? Если да, то почему? Если нет, тогда скажите мне, чего из перечисленного ниже на ваш взгляд ему в первую очередь не хватает:

  • Графического интерфейса и иконки в трее;
  • Открытия определенного URL при клике по уведомлению;
  • Поддержки IMAP и RSS;
  • Интернационализации;
  • Демонизации;
  • Хранения паролей в специализированных приложениях;
  • Определения уникальности писем с помощью UIDL и TOP;
  • Свой вариант;

Во-вторых, у меня не было возможности проверить, насколько zenity совместим с KDE и всякими там Awesome. Не могли бы вы это проверить? И в-третьих, по традиции, прочие комментарии (анекдоты по теме, случаи из жизни, объявления о продаже породистых котят) также приветствуются.

Метки: .

Понравился пост? Узнайте, как можно поддержать развитие этого блога.

Также подпишитесь на RSS, Facebook, ВКонтакте, Twitter или Telegram.