Хочу поделиться с Харбра-обществом полезным, с моей точки зрения, лайвхаком: уведомления по SMS о новой почте в ящике Gmail. Реализуется это небольшим скриптом, который живет и работает в электронной таблице (Spreadsheet) в Google Drive (бывшие Google Docs).
Принцип работы следующий: скрипт по таймеру проверяет папку «Входящие» в почтовом ящике и если обнаруживает новые письма, то создает в google calendar событие с именем, как тема письма, и включает для него SMS уведомление. В результате вам приходит SMS сообщение следующего содержания:
Напоминание: Тема письма @ дата и время
Подробности реализации, как всегда, под «катом».
Итак, что нужно для начала: у вас должен быть привязан телефонный номер к Google Calendar, как это сделать написано вот тут — Регистрация мобильного телефона:
support.google.com/calendar/bin/answer.py?hl=ru&hlrm=en&answer=45351
Следующие несколько шагов необходимо выполнить, что бы скрипт мог корректно обрабатывать новую почту.
Шаг 1: Создайте новый ярлык в Gmail с именем, например, SMSnotify (или любым другим, по вашему усмотрению). Как это сделать написано вот тут – Использование ярлыков:
support.google.com/mail/bin/answer.py?hl=ru&hlrm=ru&answer=118708#0
Шаг 2: Создайте фильтр, который будет применять ярлык SMSnotify ко всем входящим ( To: <ваше-имя> @ gmail.com
). Как это сделать, написано вот тут – Использование фильтров:
support.google.com/mail/bin/answer.py?hl=ru&hlrm=ru&answer=6579#0
Таким образом, все новые письма будут отмечаться этим ярлыком.
Шаг 3: Войдите в Google Drive (или Docs, если еще не переключились) и создайте новую электронную таблицу (Spreadsheet). Откройте созданную таблицу и в верхнем меню выберите Tools > Script Editor.
Откроется новая страница с гугловской “скрипт-IDE”, вот тут и начинается самое интересное.
Полный текст кода:
function Notification()
{
var label = GmailApp.getUserLabelByName('SMSnotify');
var threads = label.getThreads();
var now = new Date();
if(threads == 0) return; // прекращение выполнения, если новых цепочек нет
for(i in threads) // создаем события
{
CalendarApp.createEvent(threads[i].getFirstMessageSubject(),
new Date(now.getTime()+60000),
new Date(now.getTime()+60000)).addSmsReminder(0).setDescription('this-is-sms_notification-mark');
}
label.removeFromThreads(threads); //снимаем метки "SMSnotify"
Utilities.sleep(300000);
var TodaysEvents = CalendarApp.getDefaultCalendar().getEventsForDay(now);
for (i in TodaysEvents) // очистка после рассылки
{
if (TodaysEvents[i].getDescription()=='this-is-sms_notification-mark')
TodaysEvents[i].deleteEvent();
}
}
Google Apps Script предоставляет очень много возможностей и поэтому требует отдельных статей для описания, так что здесь я не буду подробно описывать каждый объект или метод, а просто расскажу что и для чего нужно.
Переменная label хранит в себе ссылки на цепочки (threads) помеченные тем или иным ярлыком. Переменная threads хранит в себе массив тех самых цепочек, помеченных label-ом.
После проверки количества цепочек (если новых нет, программа прекращает свое выполнение) приступаем к циклическому созданию событий. Здесь хочу обратить внимание на присвоение «метки» всем новым событиям, для того чтобы потом можно было за собой подчистить.
if(threads == 0) return; // прекращение выполнения, если новых цепочек нет
for(i in threads) // создаем события
{
CalendarApp.createEvent(threads[i].getFirstMessageSubject(),
new Date(now.getTime()+60000),
new Date(now.getTime()+60000)).addSmsReminder(0).setDescription('this-is-sms_notification-mark');
}
После того, как события созданы и настроены на уведомления, нужно снять label с обработанных писем.
label.removeFromThreads(threads);
Я решил, что засорять календарь уведомлениями о почте не хочу, поэтому нужно его чистить. Для этого приостанавливаем выполнение скрипта на 5 минут (максимально возможное время, указывается в миллисекундах) и выполняем очистку.
Utilities.sleep(300000);
for (i in TodaysEvents) // очистка после рассылки
{
if (TodaysEvents[i].getDescription()=='this-is-sms_notification-mark')
TodaysEvents[i].deleteEvent();
}
Последнее, что осталось — это создать триггер по которому и будет запускаться скрипт. Для этого кликаем на меню "Ресурсы", а в нем на "Триггеры текущего скрипта".
Нам нужен time-driven триггер с частотой повторения, например, один час.
В процессе изменения условий срабатывания триггера или сохранения изменений в самом скрипте, будет появляться окошко авторизации. Смело авторизуем :)
После всех манипуляций, в качестве теста, пробуем запустить скрипт на выполнение.
Спасибо, что дочитали до конца, надеюсь, ничего не забыл :) Буду очень рад, если кому-то это пригодиться.
Любые замечания, дополнения, критика приветствуются! Совсем недавно открыл для себя этот замечательный API и только начал с ним знакомиться.
Ссылки по теме:
Документация по стандартным службам (только англ) — developers.google.com/apps-script/defaultservices
Различные руководства (только англ) — developers.google.com/apps-script/articles
P.S.: это только у меня в интерфейсе смесь английского и русского?
Автор: elliadan