Почта, сэр!

Это была одна из задач, реализовать которые у меня не получалось очень давно. А именно – сообщение о новой почте. Да, разумеется, существует множество программок, которые сидят в трее и выполняют эту функцию. Однако, ни одна из них меня не устраивала. А те, что устраивали по функциональности, занимали много места в оперативке. Я видел программу, которая весила около 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 со вложениями, не проверял. Также не знаю, что будет, если вы храните копии сообщений на сервере и не удаляете их. Вероятно, он сперва их все загрузит (для него-то они новые), потом скрипт их удалит, а потом все будет работать, как и задумано.

3 коммент. to this post.

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

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

    Ответить

  2. Опубликовал Starlite на 18 Ноябрь, 2007 в 12:10 дп

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

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

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

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

    Ответить

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

    Ответить

Ответить на запись