Оповещение о новых письмах в Gmail по SMS средствами Google Calendar + Google Apps Script

в 13:34, , рубрики: DIY, gmail, Google API, google apps script, programming, sms, Программирование, метки: , , , , ,

Хочу поделиться с Харбра-обществом полезным, с моей точки зрения, лайвхаком: уведомления по 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.
Оповещение о новых письмах в Gmail по SMS средствами Google Calendar + Google Apps Script

Откроется новая страница с гугловской “скрипт-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();
  }

Последнее, что осталось — это создать триггер по которому и будет запускаться скрипт. Для этого кликаем на меню "Ресурсы", а в нем на "Триггеры текущего скрипта".
Оповещение о новых письмах в Gmail по SMS средствами Google Calendar + Google Apps Script

Нам нужен time-driven триггер с частотой повторения, например, один час.

Оповещение о новых письмах в Gmail по SMS средствами Google Calendar + Google Apps Script

В процессе изменения условий срабатывания триггера или сохранения изменений в самом скрипте, будет появляться окошко авторизации. Смело авторизуем :)
Оповещение о новых письмах в Gmail по SMS средствами Google Calendar + Google Apps Script

После всех манипуляций, в качестве теста, пробуем запустить скрипт на выполнение.

Оповещение о новых письмах в Gmail по SMS средствами Google Calendar + Google Apps Script

Спасибо, что дочитали до конца, надеюсь, ничего не забыл :) Буду очень рад, если кому-то это пригодиться.
Любые замечания, дополнения, критика приветствуются! Совсем недавно открыл для себя этот замечательный API и только начал с ним знакомиться.

Ссылки по теме:
Документация по стандартным службам (только англ) — developers.google.com/apps-script/defaultservices
Различные руководства (только англ) — developers.google.com/apps-script/articles

P.S.: это только у меня в интерфейсе смесь английского и русского?

Автор: elliadan

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js