Почта, сэр!


Это была одна из задач, реализовать которые у меня не получалось очень давно. А именно — сообщение о новой почте. Да, разумеется, существует множество программок, которые сидят в трее и выполняют эту функцию. Однако, ни одна из них меня не устраивала. А те, что устраивали по функциональности, занимали много места в оперативке. Я видел программу, которая весила около 15 mb, выполняя при этом одну-единственную функцию — уведомление о приходе почты! Это совершенно никуда не годится. Хотя сейчас у меня вполне достаточно оперативки, долгие годы, проведенные на слабых машинах приучили меня бережно относится к таким вещам.

И вот, я наконец-то смог решить эту проблему, написав свой скрипт, который посылает уведомление по dbus через libnotify и проигрывает музыку. Можно и другие действия прикрутить. Итак:

1. Сперва нам нужно установить пакеты libnotify-bin, fetchmail и sox. Последний — не обязательно, он нужен для воспроизведения звукового эффекта и, скорее всего, уже у вас установлен.

2. Теперь нужно настроить fetchmail, который будет проверять ваш почтовый ящик. Это можно сделать при помощи графической утилиты fetchmailconf (устанавливается отдельно), либо вручную:
Создайте файл ~/.fetchmailrc и напишите там примерно следующее: .fetchmailrc
Обратите внимание на строку «set daemon 15» — это означает, что fetchmail будет запущен как демон и будет лазить за почтой каждые 15 минут. Возможно указать несколько почтовых ящиков. Есть поддержка ssl, так что gmail тоже можно прикрутить. Только порт не прописывайте. За подробностями обратитесь к мануалу fetchmail — занятная штука, надо заметить =) Проверить, все ли настройки правильны, можно командой fetchmail -c.

3. Если все настроено и работает, запускаем демона:

fetchmail -k

Опция «-k» необходима, чтобы fetchmail не удалял сообщения с сервера, чтобы вы смогли получить их вашим любимым почтовым клиентом. В дальнейшем эту команду нужно будет прописать в автозагрузку.

4. Берем вот тут сам скрипт: newmail. Стираем расширение .txt и делаем исполняемым. Куда-нибудь запихиваем. В самом скрипте в строке «user=starlite» подставьте свой username. Его можно узнать, выполнив команду whoami Хорошая, кстати, команда. Еще не хватает «whereami» и «whatthehellishappening» =)))

Далее смотрим вниз. Видим строку «notify-send -i ~/stamp.png бла-бла-бла». Так вот, опция «-i» позволяет показвыать картинку во всплывающем сообщении. Я ее не выкладываю, сами найдете. Относительные пути опция не понимает, увы. Заодно изучите мануал notify-send. Обратите внимание на опцию «-t».

Смотрим еще ниже. Видим строку «play newmail.ogg > /dev/null 2>&1» Как вы могли догадаться, она проигрывает звуковой эффект. Который я тоже не выкладываю.

5. После адаптации скрипта, самое время его проверить, просто запустив. Если все работает, выполните команду «crontab -e» и засуньте туда скрипт. Например, такое задание будет запускать скрипт каждый час:

0 */1 * * * /путь/к/скрипту

Подробности, как всегда, в мануале =)

6. Получаем удовольствие от настраиваемой уведомлялки, к которой можно прикрутить _любое_ действие, на которое только способен баш. Кстати, это все дело занимает в оперативке 500 kb — именно столько весит демон fetchmail!

7. Если что-то не работает, удостоверьтесь, что:

  • запущен демон fetchmail
  • он настроен правильно
  • вы нигде не напутали с путями
  • и с кроном

А теперь немного теории. Как это все работает?

Каждые 15 минут демон fetchmail, спохватившись, залезает в почтовый ящег. Если есть новые письма, он их скачивает (но не удаляет с сервера. Помните про опцию «-k»?) и кладет в файл /var/mail/username.
Каждый час (у меня — каждые 15 минут) крон запускает скрипт, который смотрит — а нету ли чего в /var/mail/username? Если там что-то есть, значит, пришел новый спам! Ура! С этими мыслями скрипт посылает сообщение libnotify, которое вылезает у вас в углу экрана.

P.S. Не трогайте экспорт экрана, без него не найдется нужная сессия dbus, по крайней мере, в убунте.
P.P.S. Я не знаю, как будет вести себя fetchmail со вложениями, не проверял. Также не знаю, что будет, если вы храните копии сообщений на сервере и не удаляете их. Вероятно, он сперва их все загрузит (для него-то они новые), потом скрипт их удалит, а потом все будет работать, как и задумано.

  • Trackback are closed
  • Комментарии (3)
  1. Интересная штука, но мне о новых сообщениях говорит жаббер, т.к. гмыл аккаунт юзаю и с этой стороны. Но твой способ ессно универсальней =)

    Хех, мнеб доку номаную про D-Bus и C++ найти. А то тож хочу накодить кой-чё, а как с этой д-шиной общаться представляю весьма отдалённо.

  2. Ну, с сями как там — не знаю, но встречал несколько примеров для питона.

    Кстати, libnotify оказался замечательной штукой для всяких напоминалок. Вот, например:

    sleep 7m; notify-send «Хозяин, пойди, поешь» «Твои пельмени уже сварились!»

    Единственное, что не очень удобно — если отходишь от компьютера, то напоминание не видишь. Надо тогда ставить опцию «-t 0»

  3. Для питона я и сам видел, и из сей могу вызывать сторонню прогу типа тогож либнотифи, но согласись — это изврат, лучше юзать напрямую.

Обсуждение закрыто.
%d такие блоггеры, как: