Некоторое время назад мне захотелось очень простой вещи — чтобы при получении новой электронной почты где-то в углу экрана появлялось уведомление об этом. Притом мне нужны были только уведомления, а не полноценный почтовый клиент, поскольку почту я предпочитаю читать через веб-интерфейс. После непродолжительного поиска мне удалось найти парочку соответствующих приложений.
Готовые решения и что мне в них не понравилось
Первая программа называется 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 (чтобы не светить пароли):
Создаем конфиг ~/.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 серверу удалять все имеющиеся письма. Разные почтовые сервисы в этом случае ведут себя по-разному, о чем я еще упомяну ниже.
Конфиг создан, все зависимости установлены, теперь пробуем запустить скрипт:
Если видим уведомления вроде таких:
… значит, все хорошо. В противном случае вы скорее всего увидите сообщения об ошибках, которые помогут вам разобраться в проблеме.
Наконец, шифруем конфигурационный файл:
Дважды вводим пароль и заменяем конфигурационный файл на зашифрованный. Убедитесь, что незашифрованный конфиг удален. Если что, его всегда можно будет получить из зашифрованного командой:
Останавливаем скрипт и прописываем его куда-нибудь на автозапуск, на этот раз без флага — -no-master-password . При запуске появится окошко с просьбой ввести мастер-пароль.
Тонкости настройки почты на GMail/Mail.ru/Yandex
Как я уже отметил, разные почтовые сервисы ведут себя по-разному при удалении писем по POP3. Например, GMail можно настроить так, чтобы письма становились невидимыми POP3 клиенту, но оставались доступными через веб-интерфейс:
Экспериментальным путем удалось установить, что Mail.ru всегда ведет себя таким образом и изменить это через настройки нельзя. А вот Яндекс.Почта при удалении письма по POP3 всегда помещает его в папку «Удаленные».
Обратите внимание, что описанное поведение Яндекса, Мейла и Джимейла может в любой момент измениться. Если вы привыкли хранить на почте ценную информацию, я бы рекомендовал сменить мозги ничего не удалять по POP3. Вместо этого, к примеру, можно создать папку, недоступную по POP3 и перекидывать в нее письма после прочтения.
Вопросы читателям
Во-первых, не фигня ли полнейшая этот мой скрипт? Если да, то почему? Если нет, тогда скажите мне, чего из перечисленного ниже на ваш взгляд ему в первую очередь не хватает:
- Графического интерфейса и иконки в трее;
- Открытия определенного URL при клике по уведомлению;
- Поддержки IMAP и RSS;
- Интернационализации;
- Демонизации;
- Хранения паролей в специализированных приложениях;
- Определения уникальности писем с помощью UIDL и TOP;
- Свой вариант;
Во-вторых, у меня не было возможности проверить, насколько zenity совместим с KDE и всякими там Awesome. Не могли бы вы это проверить? И в-третьих, по традиции, прочие комментарии (анекдоты по теме, случаи из жизни, объявления о продаже породистых котят) также приветствуются.