понедельник, 18 апреля 2011 г.

Бесплатные СМС-уведомления о почте

Решил написать как я сделал бесплатные смс-уведомления о входящей почте. Для этого мне понадобился мой домашний сервер, почтовый сервер Postfix, почтовый фильтр Procmail и, самый главный компонент, скрипт GoogleCL, использующий Google Data API, позволяющий работать с гуглом из командной строки. Кто не в курсе, можно вести блог, заливать видео на ютуб, вести календарь, вести альбом (и прочее) на Гугле прямо из командной строки. Про это можно, и нужно, прочесть в статье на хабре.
Для отправки бесплатных СМС используется гугл-календарь с уведомлениями по СМС :)

Вообще говоря, всё перечисленное необходимо для уведомлений о почте, но сама отправка бесплатных СМС довольно проста, и можно применить её для других целей, например уведомления о нештатных ситуациях на сервере.
В принципе, теперь вы можете пойти, и самостоятельно настроить всё это под себя, а я далее напишу то, как это делал я. Предупреждаю что это сделано далеко не идеально, а лишь бы оно работало. За прошедшее время (уже пол года пользуюсь этим) я забыл как это реализовывал, поэтому мой пост нельзя считать инструкцией, а лишь наброском возможной реализации.

Фундамент
Для начала, установите и настройте базовые компоненты:
  • Любой почтовый сервер, лишь бы умел принимать почту и пропускать его через procmail. Я почему то смог настроить Postfix и его и оставил. Как я его настроил, и почему только его - не помню, оставляю с этим вас мучиться самим, извините.
  • Убедитесь что почта доходит до того пользователя сервера, который будет посылать СМС-уведомления.
  • Ставите procmail.
  • Ставите GoogleCL,не забывая о Google Data API
 Google
Вам необходим аккаунт Гугла. Я завёл новый. Ух и намучился же я с нииим!
man google

и пытаетесь выполнить хоть какое-нибудь действие. Например

google calendar add "16:00 блаблабла"

Естественно гугл первый раз попросит регистрации, и если вам повезёт, то она пройдёт в одно действие. Мне не повезло, я смог пройти "сопряжение" раза с 100го, по-моему потому что GoogleCL не верил в существование почты с "тире". В любом случае, в итоге вы должны в календаре увидеть "блаблабла" в 16 часов.
Потом вам нужно настроить календарь на оповещении по СМС, это делается в настройках гугл-календаря, на сайте.


Скрипт
Пишем такой скрипт:

#!/bin/bash

export LC_ALL=ru_RU.UTF-8
export PYTHONIOENCODING='utf-8'  #питонокостыли

read line

HOUR_MIN="10"    #минимальный час оповещения (утро)
HOUR_MAX="22"    #максимальный час оповещения (вечер)

NOW=`date +%-H`

if [ "$NOW" -ge "$HOUR_MAX" ] || [ "$NOW" -lt "$HOUR_MIN" ]    #в промежутке от HOUR_MAX до HOUR_MIN
then
    google calendar add "$HOUR_MIN:02 $line" --reminder=1m    #переносим все оповещения на HOUR_MIN
    exit
fi

TIME=`date -d +3min +%-H:%M`

google calendar add "$TIME $line" --reminder=1m

exit 0
 пусть он будет называться например /usr/bin/gsms  (не забудьте сделать его исполняемым)
Проверка:

echo блаблабла | gsms 
Через минуту на телефон приходит СМСка с "напоминанием" "блаблабла". Задержка доставки 1-2 минуты, связана с тем, что нельзя добавить сообщение в календарь, и тут же заставить календарь уведомить тебя об этом :D Можно уведомлять о будущих событиях, поэтому необходимо делать уведомление на одну минуту позже текущего времени, и ставить уведомление за минуту до указанного времени. Но так как текущая минута уже идёт, делая уведомление на неё же, гугл посчитает уведомление просроченным, нужно накинуть ещё минуту. Ну и наконец, довольно часто бывает что текущая минута заканчивается, пока отправляется уведомление и из-за возможной разницы времени серверов, гугл опять посчитает уведомление просроченным. Пример: сейчас 13:25:57, вычисляем время: 13:27, отправляем его в гугл календарь, с указанием уведомить в 13:26 СМСкой. Но пока всё это происходило, обрабатывалось, отправлялось, уже и так наступило 13:26. Гугл не отправит СМС. Что бы уведомление точно доставилось, вводится суммарное смещение времени 3 минуты.
Тестовое сообщение вам не придёт если вы посылаете его после 22х часов, или раньше 10ти. Дело в том, что мне надоело когда ночью или утром приходят СМСки и будят меня, поэтому по-быстрому накатал небольшой фильтр, который работает так:
Если время, от нуля часов до HOUR_MIN (по-умолчанию 10 часов)
ИЛИ
время от HOUR_MAX (по-умолчанию 22 часа) до 24х
ТО
переносим уведомление на HOUR_MIN (10 часов утра).
Константы моего алгоритма конечно можно менять, но если вы не хотите крутиться возле нуля часов ночи, то придётся переделать сам алгоритм. Для моих потребностей достаточно и то, что есть.


Почта
Вам необходимо настроить перенаправление почты с ваших почтовых ящиков на сервер. Допустим что пользователь, который будет обрабатывать почту и посылать уведомления, в системе под именем sms. Сервер допустим имеет доменный адрес server.ru. Тогда вам нужно настроить перенаправление на адрес sms@server.ru.
Из-за необходимости декодировать письма из разных кодировок, и для безопасности (зачем хранить на сервере копии всех писем со всех ящиков?), было решено воспользоваться функцией Яндекс.Почты, по отправке уведомлений о входящей почте на определённых адрес.

Я указал адрес сервера, и туда успешно приходят уведомления от Яндекса о пришедшем сообщении, с указанием темы сообщения, и каких то других полезных данных (по-моему адрес отправителя), которые я просто отфильтровываю из-за ограничения по количеству символов гугловских СМСок.


Procmail
Создаём в домашней папке пользователя sms файл .procmailrc - это и есть наш фильтр, который будет вытаскивать тему сообщения и отправлять СМС:

:0b
| cut -d\" -f2 |  gsms
В зависимости от того, что вам нужно, вторая строчка будет выглядеть по-разному. В данном случае, я выдёргиваю тему сообщения из приходящих уведомлений от Яндекса.

Окончательное тестирование


Всё работает.
Очевидно правда, что приходит сообщение с ненужными нам дополнительными словами, да ещё и имеет определённое ограничение
Но для того, что бы уведомлять о каких то событиях когда вы не в сети, вполне годится.


Вывод
Теперь то вы точно поняли что мой пост не инструкция, а лишь пример реализации, по которому вы можете сделать бесплатные СМС-уведомления о любом событии, не только о почте, под себя, и возможно даже лучше чем это сделано у меня. Удачи :)

Комментариев нет:

Отправить комментарий