email-notifier/

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

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

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

EnglishRussianUkrainian