Gmail API и Rails - получайте электронные письма, метки и детали сообщений

  1. Метка, которая платит мне
  2. Получи свой знак, чувак
  3. Самая большая звезда на вашем лейбле
  4. Я получил небольшое сообщение
  5. Выглядывать рукопись
  6. Там будет текст от вас на моем телефоне
  7. Нужно что-то менять
  8. Положите это высоко в облаках
  9. Следующий эпизод

Я отключил уведомления Gmail на своем телефоне некоторое время назад, главным образом потому, что этот твит точно подытоживает мою ситуацию с электронной почтой:

этот твит

Но есть некоторые электронные письма, о которых вы хотите знать прямо сейчас. Например, скажем The Doggfather хочет инвестировать ваш стартап , Это письмо стоит прервать ужин. Текстовые сообщения отлично подходят для таких предупреждений. С GMail API и Twilio SMS вы можете отправлять уведомления, когда срочные письма попадают в ваш почтовый ящик.

Это учебник из двух частей. В первой части мы рассмотрели как использовать Omniauth для аутентификации приложения Rails с Gmail API , Во второй части мы получим ярлыки, сообщения и сведения о них с помощью API Gmail, а затем отправлять SMS-оповещения с помощью Twilio ,

Прежде чем мы начнем, нам нужно:

  • Аккаунт Gmail
  • Аккаунт Twilio
  • номер телефона с поддержкой SMS от Twilio
  • ngrok

Метка, которая платит мне

Какие письма заслуживают SMS-оповещений? Первым делом я хотел жестко закодировать эту логику, но Gmail уже дал нам фильтры и метки. Поэтому, прежде чем писать какой-либо код, давайте создадим новый фильтр для применения метки sms к определенным сообщениям. В Gmail:

  • Нажмите кнопку настройки в правом верхнем углу
  • Нажмите Фильтры
  • Нажмите Добавить новый фильтр внизу страницы.
  • Введите критерии поиска, которые важны для вас - в нашем случае электронные письма от «Snoop».
  • Нажмите Создать фильтр с этим поиском
  • Установите флажок Apply the Label и создайте новый ярлык под названием sms.

Нажмите Создать фильтр с этим поиском   Установите флажок Apply the Label и создайте новый ярлык под названием sms

После того, как мы отправили смс-уведомление, мы автоматически удалим ярлык, чтобы отправлять только одно оповещение по электронной почте. К сожалению, Snoop еще не отправил нам электронное письмо, так что давайте добавим ярлык SMS к любому сообщению в вашем почтовом ящике - так будет до тех пор, пока неизбежно не наступит наш важный день.

Получи свой знак, чувак

Чтобы получить доступ к Gmail API, нам нужно аутентифицировать наше приложение Rails и получить токен доступа OAuth. Это то, что Часть 1 этого поста, поэтому мы будем использовать его в качестве основы для этого поста.

Клонируем репо из части 1:

git clone git @ github. com: GregBaugues / gmail - оповещения. Git CD Gmail - оповещения

Если вы используете РВМ или же rbenv Настройте вашу .ruby-версию и .ruby-gemset сейчас. (А если нет, то следует.) Затем добавьте Google API Client а также Twilio драгоценные камни в Gemfile:

gem 'google-api-client',: require => 'google / api_client' gem 'twilio-ruby'

Google не придерживался соглашений Ruby, когда назвал свой гем (одна из многих вещей, которые он сделал, чтобы усложнить работу со своими API-интерфейсами), поэтому, если вы не включите этот параметр require, вы получите ошибку, которая выглядит следующим образом : NameError (неинициализированная константа SessionsController :: Google)

Установите гем, настройте базу данных и запустите сервер:

пакет установить грабли db: создать грабли db: перенести рельсы s

В другом терминале запустите ngrok указал на порт 3000 (нгрок более подробно описан в Часть 1 ):

, / ngrok - поддомен = пример 3000

Как только наш сервер запустится, зайдите на сайт example.ngrok.com в браузере, нажмите ссылку Аутентификация с Google и авторизуйте свою учетную запись. (Я внес изменения с тех пор, как изначально написал Часть 1, чтобы запросить токен изменения вместо токена только для чтения . Если в этом посте вы получите ошибку с недостаточными правами доступа, отмените свой токен доступа и повторите этот процесс). Если мы посмотрим в нашей базе данных через консоль Rails, мы найдем токен доступа, который позволит нам выполнять вызовы Gmail API:

рельсы c токеном. прошлой . access_token

Теперь, когда у нас есть токен доступа, давайте перейдем.

Самая большая звезда на вашем лейбле

Давайте найдем идентификатор нашей смс- метки. К сожалению, единственный способ сделать это - через API. Но это круто, это дает нам простую попытку сделать запросы API против Gmail.

Документы Google API для Ruby не очень хороши, но если вы ищете дополнительную информацию о том, откуда взялся весь этот код, вот отправная точка, которую я использовал:

С этого момента весь код, который мы напишем, будет в задачах rake, чтобы мы могли запускать их из командной строки. Создайте новый файл рейка:

коснитесь lib / tasks / list_labels. грабли

Затем вставьте это в этот файл:

Требуется задача 'pp': list_labels =>: среда выполнения client = Google :: APIClient. новый клиент авторизация access_token = токен. прошлой . Служба fresh_token = клиент. found_api ('gmail') result = client. execute (: api_method => служба. пользователи. метки. список,: параметры => {'userId' => 'me'},: headers => {'Content-Type' => 'application / json'}) pp JSON , анализ (результат. тело) конец

Что бы там ни было, это так просто, как получает запрос Google API. Мы создаем аутентифицированный клиент API, используя наш токен OAuth. Мы сообщаем Google, какой API использовать, какой метод вызывать и к какому пользователю обращаться. Google возвращает некоторый JSON, который мы превращаем в хеш, используя библиотеку Ruby JSON.

Вы увидите, как этот шаблон повторяется в следующих нескольких примерах. Если бы мы делали что-то более сложное, чем учебник, мы бы хотели высушить наш код. Для краткости я оставлю это как упражнение читателю, хотя Фил Нэш написал образец того, что абстрактный класс Gmail может выглядеть ,

Давайте запустим нашу задачу в терминале:

Мой идентификатор метки смс - Label_29. Что твое?

Что твое

Я получил небольшое сообщение

У нас есть идентификатор нашего ярлыка, давайте получим письма, соответствующие ему. Создайте другой файл рейка:

коснитесь lib / tasks / check_inbox. грабли

Вставьте этот код (и убедитесь, что вы изменили значение LABEL_ID ):

require 'pp' LABEL_ID = 'Label_29' task: check_inbox =>: среда выполнения client = Google :: APIClient. новый клиент авторизация access_token = токен. прошлой . Служба fresh_token = клиент. found_api ('gmail') result = client. execute (: api_method => служба. пользователи. сообщения. список,: параметры => {'userId' => 'me', 'labelIds' => ['INBOX', LABEL_ID]},: headers => {'Content- Введите '=>' application / json '}) pp JSON. анализ (результат. тело) конец

Этот код выглядит очень похоже на код, который мы использовали для удаления меток, за исключением того, что мы:

  • доступ к messages.list вместо ярлыков.list
  • добавление фильтра для сообщений с ярлыками входящих и смс

Запустите наше новое задание:

Вы заметите, что мы получаем минимальную информацию о каждом письме - только сообщения и идентификаторы потоков. Gmail даже не сообщает нам тему и отправителя каждого сообщения! Мы должны сделать еще один вызов API для этого.

Выглядывать рукопись

Давайте добавим два метода в этот файл rake:

  • запросить данные сообщения
  • разобрать запутанный JSON, возвращенный Google

Добавьте это в конец check_inbox.rake :

def get_details (id) client = Google :: APIClient. новый клиент авторизация access_token = токен. прошлой . Служба fresh_token = клиент. found_api ('gmail') result = client. выполнить (: api_method => сервис. пользователи. сообщения. получить,: параметры => {'userId' => 'me', 'id' => id},: заголовки => {'Content-Type' => 'приложение / json '}) data = JSON. parse (result. body) {subject: get_gmail_attribute (data, 'Subject'), from: get_gmail_attribute (data, 'From')} end def get_gmail_attribute (gmail_data, attribute) headers = gmail_data ['payload'] ['headers'] массив = заголовки. отклонить {| хэш | массив hash ['name']! = attribute}. первый ['значение'] конец

Наша задача check_inbox, которая просто печатала наши данные JSON: pp JSON.parse (result.body) Замените эту строку с кодом для итерации и напечатайте детали для каждого сообщения:

сообщения = JSON. parse (result. body) ['messages'] || [] Сообщения . каждый делает | сообщение | pp get_details (msg ['id']) end

Запустите rake check_inbox, и вы увидите список отправителя и тему каждого сообщения в вашем почтовом ящике. Boom!

Там будет текст от вас на моем телефоне

Мы приближаемся! У нас есть хэш с отправителем и темой нашего важного электронного письма, теперь нам просто нужно снять это текстовое сообщение. Перейдите на свою панель Twilio и запишите SID своей учетной записи и токен авторизации - они понадобятся нам для инициации исходящих SMS из нашего приложения.

Вы можете установить эти значения как константы в вашем файле rake, но они

  • может измениться между вашей разработки в производственной среде
  • не должен быть привязан к репозиторию GitHub.

Вместо этого мы установим их как переменные среды. Мы также установим переменные для вашего номера телефона Twilio и персонального мобильного телефона.

Из того же терминала, в котором вы запускаете свои грабли, запустите:

экспорт TWILIO_ACCOUNT_SID = xxxxx экспорт TWILIO_AUTH_TOKEN = xxxxx экспорт TWILIO_NUMBER = 13125555555 экспорт CELLPHONE = 13126666666

Затем добавьте метод в конец check_inbox.task для отправки этого SMS:

def send_sms (подробности) client = Twilio :: REST :: Client. новый клиент ENV ['TWILIO_ACCOUNT_SID'], ENV ['TWILIO_AUTH_TOKEN']. учетная запись . Сообщения . создать (для: ENV ['CELLPHONE'], из: ENV ['TWILIO_NUMBER'], тело: "# {details [: from]}: \ n # {details [: subject]}",) end

Наконец, обновите итератор, чтобы отправлять смс для каждого сообщения:

JSON. анализ (результат. тело) ['сообщения']. каждый делает | сообщение | details = get_details (msg ['id']) send_sms (подробности))

Запустите rake check_inbox снова. Ваш телефон загорелся?

Нужно что-то менять

Практически завершенный. Нам просто нужно убрать эту смс-метку, чтобы мы не взорвали наш телефон каждую минуту после того, как Snoop протянул руку (хотя это может быть уместно). Все наши запросы были только для чтения, но теперь мы собираемся изменить данные.

(Примечание: когда я впервые опубликовал Часть 1, я запросил токен только для чтения. С тех пор я изменил его и репозиторий github для запроса токена gmail.modify, но если вы работаете с проектом, который вы начали, когда первоначально вышла Часть 1 еще в августе 2014 года вам нужно будет внести изменения в инициализатор Omniauth, иначе вы получите ошибку с недостаточными правами доступа.)

Добавьте этот метод в конец check_inbox.rake :

def remove_label (id) client = Google :: APIClient. новый клиент авторизация access_token = токен. прошлой . Служба fresh_token = клиент. обнаруженный клиент ('gmail'). execute (: api_method => служба. пользователи. сообщения. изменить,: параметры => {'userId' => 'me', 'id' => id},: body_object => {'removeLabelIds' => [LABEL_ID]} ,: headers => {'Content-Type' => 'application / json'}) end

Затем мы добавим метод remove_label в наш итератор:

JSON. анализ (результат. тело) ['сообщения']. каждый делает | сообщение | details = get_details (msg ['id']) send_sms (подробности) remove_label (msg ['id']))

Большой! Теперь мы отправим одно и только одно оповещение для каждого тегового письма.

Положите это высоко в облаках

Чтобы этот скрипт был полезным, нам нужно развернуть и автоматизировать его. Я не буду вдаваться в подробности, потому что я уверен, что у вас есть свой предпочтительный метод развертывания. Если вы находитесь на Heroku, вы можете проверить Heroku Scheduler , Если вы запускаете свой собственный VPS, вы, вероятно, захотите добавить строку в ваш crontab, которая выглядит следующим образом:

* * * * / path / to / app / rake check_messages

Вы также можете проверить всякий раз, когда драгоценный камень это позволяет вам планировать задачи прямо в вашем файле rake.

Следующий эпизод

Это были длинные два поста, в которых рассматривается сложная концепция (OAuth) и не очень дружественный API (Gmail). Но теперь, когда вы получили эти две технологии за пояс, цифровой мир - ваша устрица. С OAuth вы можете подключиться к тысячам API, десятки из которых попадают под зонтик Google - теперь просто скопируйте / вставьте / отрегулируйте то, что вы только что написали. И, конечно же, с Twilio вы можете отправлять и получать текстовые сообщения на миллиарды устройств с помощью всего лишь нескольких строк кода.

Если вы нашли этот пост полезным, я бы хотел услышать об этом в Твиттере по адресу @greggyb , И если у вас есть какие-либо вопросы, напишите мне по электронной почте: [email protected] ,

Счастливого взлома!

29. Что твое?
Ваш телефон загорелся?