0,0
рейтинг
30 июня 2012 в 17:34

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

Увы, но этот способ перестанет работать с 27-го июня 2015, т.к. Google отключает функцию sms-оповещений для календаря.
support.google.com/calendar/answer/45351?hl=ru

Важно! SMS-оповещения будут отключены 27 июня
С 27 июня 2015 года вы больше не будете получать SMS-оповещения от Google Календаря. Функция SMS-оповещений была внедрена ещё до широкого распространения смартфонов. Однако современные мобильные устройства позволяют получать оповещения в более удобном формате и даже в офлайн-режиме.
Для просмотра оповещений вы можете использовать приложение календаря, которое было установлено на смартфоне по умолчанию, либо скачать Google Календарь для Android или iPhone. Подробнее об оповещениях…
Примечание. Это изменение не коснется пользователей Google Apps for Work, Education и Government.




Хочу поделиться с Харбра-обществом полезным, с моей точки зрения, лайвхаком: уведомления по SMS о новой почте в ящике Gmail. Реализуется это небольшим скриптом, который живет и работает в 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.


Шаг 4: В связи с тем, что при установке уведомлений прямо из кода, часто возможны ошибки вида

Calendar: Mismatch: etags

(детальнее тут: code.google.com/p/google-apps-script-issues/issues/detail?id=264)

Нужно создать доп. календарь и настроить SMS уведомления: установить по-умолчанию для всех новых встреч вот так:

Настройки->Календари->Уведомления->По умолчанию->SMS->%% мин

В этом примере имя календаря будет "email"

Приятно удивился, узнав, что теперь из интерфейса гуглодиска можно создавать скрипты как отдельные приложения, не встроенные в таблицу. Так что "Шаг 3" теперь можно свести к следующему:


Откроется новая страница с гугловской “скрипт-IDE”, вот тут и начинается самое интересное.

Полный текст кода находится под спойлером

Кликните эту надпись чтобы показать/скрыть код
function my_notification() 
{
  var calendar = CalendarApp.getOwnedCalendarsByName('email')[0]; //открываем календарь с именем "email"
  
  var threads = GmailApp.getUserLabelByName('SMSnotify').getThreads();  //переменная, в которой хранится коллекция цепочек с ярлыком SMSnotify
  var now = new Date();

  if(threads == 0) return; // прекращение выполнения, если новых цепочек нет
  
  for(i in threads) // создаем события
  {
    calendar.createEvent(threads[i].getFirstMessageSubject(),
        new Date(now.getTime()+60000),
        new Date(now.getTime()+60000));
  }
    
  GmailApp.getUserLabelByName('SMSnotify').removeFromThreads(threads); //снимаем метки "SMSnotify" с цепочек
}


После того, как вы ввели код, нужно создать триггер по которому и будет запускаться скрипт. Для этого кликаем на меню "Ресурсы", а в нем на "Триггеры текущего скрипта".



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



В процессе изменения условий срабатывания триггера или сохранения изменений в самом скрипте, будет появляться окошко авторизации. Смело авторизуем :)


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



Иногда вам могут приходить сообщения о неудачном выполнении скрипта (даже если код правильный и до этого все работало). Эти сообщения можно отключить (хотя я оставил): нужно кликнуть на «notifications» («уведомления») в окне редактора триггеров и появится вот такое окошко



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

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

Благодарности: Спасибо пользователям Yan169 и OlegT за проявленный интерес и советы!
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (72)

  • 0
    Супер! Огромное спасибо!
    • +3
      пожалуйста! :)
      • 0
        Вы пробывали получать подобным образом 20-30 SMS'ок-уведомлений в день?

        Дело в том, что подобное же решение у меня было реализовано год назад (чуть иначе сделанное технически, но суть такая же — через Google Calendar). Чисто эмпирически установлено, что Google Calendar начинает терять SMS'ки при большом их количестве в сутки, иначе говоря, если к вам приходит много почты — уведомлений будет приходить всё меньше и меньше.

        Лично я отказался от Google Calendar по этой причине. Тем более, что есть сервисы типа IfThisThenThat, которые позволяют легально связывать функциональность разных веб-сервисов (тот же Gmail и SMS) и надежно отправлять сколько-угодно SMS, при этом без всех этих хитрожопых скриптований.

        Более подробно как это сделать можно глянуть например здесь.

        • 0
          Да, действительно, мне не пишут так много. Максимум — это 4-5 за час (правда за день не более 15).
          Про IfThisThenThat я знаю, но немного смущает меня то, что используется сторонний сервис для отправки смс, у меня включается режим паранойи чуть-чуть. :)
  • 0
    Отличный лайфхак. А можно как-то сделать, чтобы еще и email отправителя был в SMS?
    • 0
      Да, можно. Но проблема в том, что длинна названия для встречи ограничена. К тому же, это не так просто, к сожалению. Нужно вытаскивать сообщение из цепочки (последнее, например), брать из него значение поля From, а оттуда вытаскивать сам e-mail. Но поле From может в себе содеражать еще и доп текст, типа From: Vasiliy Pupkin sales manager <pupkin@company.com>, следовательно надо как-то парсить это дело, так как тема + полный текст из From редко когда будет вмещаться в название задачи… В общем я пока «человеческого» способа не нашел :)
      Но если Вы захотите покопать, то милости прошу :)
      developers.google.com/apps-script/class_gmailmessage
      developers.google.com/apps-script/class_gmailmessage#getFrom
      • 0
        Действительно, было бы отлично видеть адрес отправителя вместо своего адреса. Да и текст СМС немного кривоват.
        Вообщем, спасибо огромнейшее. Надеюсь, на новые версии скрипта.
        • 0
          А могли бы подробнее про кривоватый текст смс? Где-то что-то сбоит? Скажите, пожалуйста, я бы исправил что в скрипте (если это возможно).
  • –1
    у моего ОПСОСа есть бесплатная услуга «email по sms», с ней достаточно настроить пересылку и не городить костылей. Может быть и у других операторов есть, просто мало кто знает
    • +1
      У моего (МТС Украина) — нет, у Киевстара нет, в общем туго у нас с этим :)
      • 0
        У киевстара вроде бы есть, но платное. Хотя цена смешная, если я правильно посчитал
        • +1
          У киевстара — 0.07грн/сутки. В месяц получается 2.1грн, что вполне сносно за своевременное уведомление о имэйлах. www.kyivstar.ua/ru/mm/mobile/services/messages/smsmmse-mail/#prepaid
          • 0
            О спасибо! Буду знать.
            Как же они глубоко закопали это…
          • 0
            Админам приходит больше 150 смс в месяц. :)
            Но в принципе если надо то и 21гривну можно заплатить
    • 0
      У нас тоже есть отдельный ящик для СМСок: 7<номер>(at)sms.bwc.ru, потому обхожусь простыми фильтрами на gmail.
  • 0
    А можно ли написать скрипт для оповещения о днях рождения из Gmail's contacts?
    • 0
      Во-первых, можно импортировать это в любой календарь, как встроенный календарь. В настройках календаря кликните по отмеченной на скриншоте ссылке и выберите вкладку «Дополнительно» на новой странице — увидите «Дни рождения и мероприятия контактов»


      Но уведомлений так не добиться.

      Конечно можно и скрипт. Хотя, если не ошибаюсь, то нужно будет скопировать событие из встроенного календаря в свой и уже в скопированном событии установить оповещение по SMS (а если их сделать оповещением «по умолчанию», то просто скопировать)
      developers.google.com/apps-script/service_calendar
      К сожалению, более конкретней ничего сказать пока не могу, так как в эту сторону еще не «копал»
      • 0
        Календарь «Дни рождения и мероприятия контактов» включен, но в нем действительно нельзя настроить оповещение. Поэтому и решил уточнить…
  • 0
    Аппараты на Android это поддерживают «Из коробки», но если таково нет, тогда можно использовать данный лайвхак.
    Гугл молодцы, что дают возможность улучшить сервис своими руками через данные скрипты.
    • +2
      Сейчас практически любой аппарат поддерживает email из коробки. Проблема в том, что не все подключают (платят/находятся в радиусе действия) мобильного интернета — тут на помощь придет скрипт. И заметьте, молодец elliadan, а не гугл :)
      • 0
        Несомненно что elliadan молодец что написал такой скрипт, но без возможности написания скриптов это не получилось бы.
        Напоминание о днях рождения Google контактов тоже поддерживается из коробки кстати.
        А так действительно, если нет интернета, то это самое удачное решение.
        • 0
          Расскажите каким образом поддерживается напоминание о днях рождениях в Google.
          Пока вижу только ручное копирование событий о Днях Рождениях в My Calendar (Мой Календарь), где уже можно настроить sms-оповещение…
          • 0
            Не задавался таким вопросом, но на маркете видел кучу приложений для этого…
            • 0
              А без приложений на «маркете», не у всех он есть…
              • 0
                4pda.ru Мне данная функция не нужна-в контактах дней рождения нет, нужных людей помню наизусть, для остальные есть vk.com, а контакты оттуда у меня все в календаре есть благодаря сервису, про который упоминалось на хабре.
    • –1
      Это как? Апарат по 3G/WiFi проверяет почту и если есть отправляет сам себе СМС? :)
      • 0
        Нет, проверяет почту и появляется уведомление. хотя можно написать приложение, дабы отправлял смс, но смысл?
    • +1
      Гугл были бы молодцы, если б в настройках почты можно было просто включить sms-уведомление о email, а так приходится использовать костыли. Когда ввели уведомления в календаре, я думал — круто, скоро и для email прикрутят. Ан нет, уже лет 5 прошло, а воз и ныне там. Ворча, полез прикручивать скрипт...
  • 0
    > P.S.: это только у меня в интерфейсе смесь английского и русского?
    У меня всё по русски.
    • 0
      Хех… Может если поставить Русский как единственный язык отображения для продуктов и результатов поиска, то получится… У Вас так?
  • 0
    А как можно сделать, чтобы отсылались уведомления только о письмах, тема которых начинается со строки «ALARM:»? :)
    • +1
      Настройте фильтр так, чтобы ярлык «SMSnotify» применялся только к таким письмам.
  • +2
    ifttt.com тоже так умеет если указать при подключении канала gmail label=unread.
    • 0
      А отправку смс в таком случае кто осуществляет: ifttt.com или все же google?
      • 0
        ifttt.
    • 0
      Мой провайдер (Tele2) не активируется на ifttt.com. Скорее всего потому, что их SMS провайдер работает не со всеми операторами. С Google все работает.
      • 0
        Могу вам только посочувствовать. Отличнейший сервис.
        • 0
          А у Вас какой оператор, если не секрет? В каком формате Вы вводили номер на ifttt?
          • 0
            Сейчас зарегистрировался там, номер (Билайн) вводил как в подсказке, 007905…
            По крайней мере пин-код пришёл от них для подтверждения
            • 0
              Ну тогда видимо Tele2 не поддерживается. Вводил и через 007904 и через +7904.
              • 0
                Не поддерживается TELE2, я пытался там зарегистрироваться ~месяц назад. С МТС тут же регнулось.
          • 0
            Беларуский МТС. Всё путём. Не скажу точно, как вводил(скорее всего это было +375, нежели 00375, который показывается в профиле). Но работает ок.
  • 0
    Было бы хорошо сделать, чтобы ночью смс не приходили, а утром, например, все за ночь и пришли )
    • +1
      Самый легко-реализуемый вариант — это изменить триггер, примерно вот таким образом:


      В этом случае скрипт запускается каждое утро с 8 до 9.
  • 0
    Подскажите, а как сделать, чтобы о том, что приходит в папку «Спам» не оповещало?
    • 0
      О как. У меня письма, которые падают в «Спам», не помечаются спец. ярлыком вообще. А как у вас фильтр настроен? Я вот для проверки сделал так:

      Совпадения: to:(*gmail.com) | Действия: Применить ярлык "SMSnotify"

      И все равно спам игнорируется и не помечается, следовательно и оповещений по нему нет.
      • 0
        Нужно в фильтре, в графе «Нет» вписать in:spam.
  • 0
    Ваш метод попроще чем gmail2sms.blogspot.com. Спасибо, что поделились.
  • 0
    Здорово придуманно! Спасибо, что поделились.
    Я для таких целей делал пересылку на майл.ру и там включал оповещение через СМС. У них эта функция «из коробки». Можно настроить, чтобы ночью и в выходные СМС не отправлялись.
  • 0
    UPD: немного изменил код, перечитав доки еще раз :) Функционал не изменился, прежняя версия так же рабочая, просто теперь используется на одну переменную меньше (label лишняя оказалась, смотри третью строку кода)

    Без label теперь не работает строчка
    label.removeFromThreads(threads);
    
    • +1
      Соответственно
      label.removeFromThreads(threads);
      

      надо заменить на
      GmailApp.getUserLabelByName('SMSnotify').removeFromThreads(threads); //снимаем метки "SMSnotify"
      

      • 0
        Вы совершенно правы! Вот знал же я, что не стоит делать изменений в 4 утра, точно что-нибудь можно упустиить… Спасибо! (в топике поправил код)
  • +1
    Мне не очень понравился вариант с приостановкой скрипта на 5 минут, поэтому я решил создавать события в отдельном, скрытом календаре, и его не очищать. Скрипт поставил на запуск с периодом 1 минута, пока работает отлично.
    Большое спасибо за наводку на API.
    function Notification() 
    {
      var calendar = CalendarApp.getOwnedCalendarsByName('SMS')[0];
      if (!calendar){
        calendar = CalendarApp.createCalendar('SMS');
        calendar.setHidden(true);
      }
      
      var label = GmailApp.getUserLabelByName('sms');
      var threads = label.getThreads();
      var now = new Date();
    
      if(threads == 0) return; // прекращение выполнения, если новых цепочек нет
      
      for(i in threads) // создаем события
      {
        calendar.createEvent('EMAIL '+threads[i].getFirstMessageSubject(),
            new Date(now.getTime()+60000),
            new Date(now.getTime()+60000)).addSmsReminder(0);
      }
        
      label.removeFromThreads(threads); //снимаем метки "sms"
    }
    

  • 0
    Кстати, господа, а нет ли в этом топике кого-то из гугла (либо приближённых к нему), чтобы протолкнуть в корпоративный багтреккер проблему productforums.google.com/forum/#!msg/gmail/tt6_qs4CgEY/hwjSyD84E4sJ

    Сам не смог продвинуть эту проблему сколь-нибудь далеко, а по факту целая страна подвержена проблеме (среди тех, кто переносил номер к другому оператору)
  • +1
    Люди, а объясните мне кто-нибудь зачем нужно получать оповещения по SMS когда современные телефоны прекрасно оповещают о почте и так?
    • +2
      В некоторых ситуациях время автономной работы большинства современных телефонов, на которых можно _комфортно_ работать с электронной почтой непростительно мало, в то время как не-современные телефоны иногда работают в режиме ожидания более трех недель.
      Также возможна ситуация, когда в виду каких либо причин использование мобильного интернета, через который современные телефоны получают информацию о содержимом почтового ящика, невозможно (плохое покрытие) или неоправданно (жуткий роуминг, etc).
      • 0
        В тех ситуациях, которые вы описали, вы всё равно не сможете почту прочитать. Так какой смысл тогда в оповещении?
        • +1
          Можно, например, начать [более активно] двигаться к автодому, где открыть ноутбук и заняться почтой.
          • 0
            Вот именно этим мне и помогает сервис. Была уже не одна ситуация, когда приходило важное письмо. А на важные письма я люблю отвечать без особых задержек :)
  • +1
    Надо сказать, работает весьма нестабильно. Часто возникает «Calendar: Mismatch: etags error» при попытке навесить sms-уведомление на событие в календаре. Есть соответствующий давний issue. В обсуждении предполагается, что только что созданное событие «не всегда готово» для выполнения над ним действий. Предлагают использовать try-catch и delay.
    Workaround: события создавать в календаре, для которого настроены sms-уведомления по-умолчанию (Настройки->Календари->Уведомления->По умолчанию->SMS->0 мин), а в скрипте просто создавать событие, не навешивая уведомление, и не выполняя других действий над новым событием.
    • 0
      Спасибо за наводку! Обязательно попробую и обновлю статью по результатам.
  • 0
    Сделал все, все работает, только приходит почему-то по три одинаковых SMS. Что с этим делать? Может, зависит от длительности события? Нельзя же длительность в ноль выставлять…
    • 0
      Проверьте, пожалуйста, в календаре, а количество встреч тоже утраивается?
      • 0
        В том-то и дело, что нет. Google рекомендует выключить-включить телефон support.google.com/calendar/bin/answer.py?hl=en&answer=37246, сделал, вроде только два уведомления пришло вместо трех. Там же Google рекомендует связаться с оператором, что тоже сделал — мне отключили-подключили услугу получения SMS. Снова отключил-включил телефон (простейшая трубка), пришло уже 4 одинаковых SMS. Чудеса…
  • 0
    Еще одна проблема обнаружилась спустя неделю использования скрипта: слетает авторизация и, соответственно, скрипт теряет доступ в Gmail и не может постить эвенты в календаре. Решил пока вручную — ручным запуском на выполнение и переавторизацией. Есть идеи, как это автоматизировать?
    • 0
      Авторизация слетает, если скрипт как-либо изменялся, тогда его нужно заново авторизовать. Возможно (я не уверен), слетит также если переименовать скрипт или переместить в другую папку внутри G-Drive. Может Вы делали что-то подобное?
      К сожалению, я с подобной проблемой не сталкивался, вот чтобы он «просто так» терял авторизацию, случай конечно интересный :)
  • 0
    что то я не пойму, смс как-то странно приходят, то сразу 2 по одному письму, то ни одного… вообще в день на гмайл больше 5 писем не заходит, по какому принципу смс идет — то есть, то нет…
    Да, и подскажите, можно как то сделать, чтобы ночью не отправлялись?
  • 0
    А как сделать, чтобы в смс приходил текст письма?
    • 0
      я сделал так:
      в тело письма вставляю ключевое слово (и тогда фильтр gmail настраивается на поиск нужного слова в теле письма),
      а в тему — нужный мне текст.
  • 0
    Этот метод больше не работает

    Важно! SMS-оповещения будут отключены 27 июня 2015 года

    С 27 июня 2015 года вы больше не будете получать SMS-оповещения от Google Календаря. Функция SMS-оповещений была внедрена ещё до широкого распространения смартфонов. Однако современные мобильные устройства позволяют получать оповещения в более удобном формате и даже в офлайн-режиме.
    Для просмотра оповещений вы можете использовать приложение календаря, которое было установлено на смартфоне по умолчанию, либо скачать Google Календарь для Android или iPhone. Подробнее об оповещениях…
    Это изменение не коснется пользователей Google Apps for Work, Education и Government.
    • 0
      Спасибо! Добавил инфо в публикацию.
      • 0
        Чтобы найти и остановить этот скрипт, нужно перейти по адресу drive.google.com/drive/search?q=type:script, потом кнопочка «Триггеры» и убрать триггер.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.