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. Полную версию исходников посту можно скачать здесь.

После распаковки архива требуется установить зависимости скрипта. Сделать это можно либо вручную, посмотрев названия нужных модулей в начале скрипта, либо автоматически, запустив из под рута скрипт 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. Не могли бы вы это проверить? И в-третьих, по традиции, прочие комментарии (анекдоты по теме, случаи из жизни, объявления о продаже породистых котят) также приветствуются.

Метки: .


Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.