Push-уведомления

Обзор

API Gmail предоставляет push-уведомления сервера, позволяющие отслеживать изменения в почтовых ящиках Gmail. Вы можете использовать эту функцию для повышения производительности своего приложения. Она позволяет исключить дополнительные сетевые и вычислительные затраты, связанные с опросом ресурсов для определения изменений. При каждом изменении почтового ящика API Gmail уведомляет ваше серверное приложение.

Первоначальная настройка Cloud Pub/Sub

API Gmail использует API Cloud Pub/Sub для доставки push-уведомлений. Это позволяет отправлять уведомления различными способами, включая веб-перехваты и опросы на одной конечной точке подписки.

Предпосылки

Чтобы завершить остальную часть настройки, убедитесь, что вы выполнили предварительные условия Cloud Pub/Sub, а затем настройте клиент Cloud Pub/Sub .

Создать тему

Используя клиент Cloud Pub/Sub, создайте тему , в которую API Gmail будет отправлять уведомления. Название темы может быть любым, выбранным вами в рамках вашего проекта (например, в формате projects/myproject/topics/* , где myproject — это идентификатор вашего проекта, указанный в консоли разработчика Google).

Создать подписку

Следуйте руководству для подписчиков Cloud Pub/Sub , чтобы настроить подписку на созданную вами тему. Выберите тип подписки: push-уведомление через веб-перехват (т.е. обратный вызов HTTP POST) или pull-уведомление (т.е. инициированное вашим приложением). Таким образом, ваше приложение будет получать уведомления об обновлениях.

Предоставьте права на публикацию по вашей теме

Cloud Pub/Sub требует предоставления прав Gmail для публикации уведомлений по вашей теме.

Для этого необходимо предоставить права publish для gmail-api-push@system.gserviceaccount.com . Это можно сделать через интерфейс управления разрешениями в консоли разработчика Cloud Pub/Sub, следуя инструкциям по управлению доступом на уровне ресурсов .

Получение обновлений почтового ящика Gmail

После завершения первоначальной настройки Cloud Pub/Sub настройте учетные записи Gmail для отправки уведомлений об обновлениях почтового ящика.

Запрос на просмотр

Чтобы настроить учётные записи Gmail для отправки уведомлений в тему Cloud Pub/Sub, просто используйте API-клиент Gmail для вызова функции watch для почтового ящика пользователя Gmail, как и для любого другого вызова API Gmail. Для этого укажите название темы, созданной выше, и любые другие параметры в запросе watch , например, labels для фильтрации. Например, чтобы получать уведомления обо всех изменениях в папке «Входящие»:

Протокол

POST "https://www.googleapis.com/gmail/v1/users/me/watch"
Content-type: application/json

{
  topicName: "projects/myproject/topics/mytopic",
  labelIds: ["INBOX"],
  labelFilterBehavior: "INCLUDE",
}

Питон

request = {
  'labelIds': ['INBOX'],
  'topicName': 'projects/myproject/topics/mytopic',
  'labelFilterBehavior': 'INCLUDE'
}
gmail.users().watch(userId='me', body=request).execute()

Смотреть ответ

Если запрос watch будет успешным, вы получите ответ следующего вида:

{
  historyId: 1234567890
  expiration: 1431990098200
}

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

Кроме того, успешный вызов watch должен привести к немедленной отправке уведомления в вашу тему Cloud Pub/Sub.

Если вы получили сообщение об ошибке при вызове watch , необходимо указать причину проблемы. Обычно она связана с настройкой темы и подписки Cloud Pub/Sub. Чтобы убедиться в правильности настройки и получить помощь по устранению проблем с темой и подпиской, обратитесь к документации Cloud Pub/Sub.

Обновление наблюдения за почтовым ящиком

Вам необходимо повторно вызывать watch как минимум каждые 7 дней, иначе вы перестанете получать обновления для пользователя. Мы рекомендуем вызывать watch один раз в день. В ответе watch также есть поле с указанием даты истечения срока watch .

Получение уведомлений

Всякий раз, когда происходит обновление почтового ящика, совпадающее с вашими watch , ваше приложение получит уведомление с описанием изменения.

Если вы настроили push-подписку, уведомление webhook на ваш сервер будет соответствовать PubsubMessage :

POST https://yourserver.example.com/yourUrl
Content-type: application/json

{
  message:
  {
    // This is the actual notification data, as base64url-encoded JSON.
    data: "eyJlbWFpbEFkZHJlc3MiOiAidXNlckBleGFtcGxlLmNvbSIsICJoaXN0b3J5SWQiOiAiMTIzNDU2Nzg5MCJ9",

    // This is a Cloud Pub/Sub message id, unrelated to Gmail messages.
    "messageId": "2070443601311540",

    // This is the publish time of the message.
    "publishTime": "2021-02-26T19:13:55.749Z",
  }

  subscription: "projects/myproject/subscriptions/mysubscription"
}

Тело HTTP-запроса POST представляет собой JSON-код, а фактическая полезная нагрузка уведомления Gmail находится в поле message.data . Это поле message.data представляет собой строку в кодировке base64url, которая декодируется в JSON-объект, содержащий адрес электронной почты и новый идентификатор истории почтового ящика пользователя:

{"emailAddress": "user@example.com", "historyId": "9876543210"}

Затем вы можете использовать history.list для получения сведений об изменениях для пользователя с момента его последнего известного historyId, согласно руководству по синхронизации .

Например, чтобы использовать history.list для отслеживания изменений, произошедших между первым вызовом watch и получением уведомления, представленного в предыдущем примере, передайте 1234567890 в качестве startHistoryId в history.list . После этого значение 9876543210 можно сохранить как последний известный historyId для использования в будущем.

Если вместо этого вы настроили подписку по запросу, обратитесь к примерам кода в руководстве Cloud Pub/Sub Subscriber Pull для получения более подробной информации о получении сообщений.

Ответ на уведомления

Все уведомления должны быть подтверждены. Если вы используете push-доставку через webhook, то успешный ответ (например, HTTP 200) будет означать подтверждение получения уведомления.

При использовании доставки методом pull ( REST Pull , RPC Pull или RPC StreamingPull ) необходимо выполнить последующий вызов подтверждения ( REST или RPC ). Подробнее об асинхронном и синхронном подтверждении сообщений с использованием официальных клиентских библиотек на основе RPC см. примеры кода в руководстве Cloud Pub/Sub Subscriber Pull.

Если уведомления не подтверждены (например, обратный вызов webhook возвращает ошибку или истекает время ожидания), Cloud Pub/Sub повторит попытку отправки уведомления позднее.

Остановка обновлений почтового ящика

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

Ограничения

Максимальная частота уведомлений

Для каждого отслеживаемого пользователя Gmail максимальная частота уведомлений составляет 1 событие в секунду. Любые уведомления, превышающие эту частоту, будут удалены. Будьте осторожны при работе с уведомлениями, чтобы не вызвать другие уведомления и не запустить цикл уведомлений.

Надежность

Обычно все уведомления должны доставляться стабильно в течение нескольких секунд, однако в некоторых экстремальных ситуациях уведомления могут задерживаться или отсутствовать. Убедитесь, что эта возможность корректно обрабатывается, чтобы приложение продолжало синхронизироваться даже при отсутствии push-уведомлений. Например, можно периодически вызывать history.list после определённого периода отсутствия уведомлений для пользователя.

Ограничения Cloud Pub/Sub

API Cloud Pub/Sub также имеет свои ограничения, подробно описанные в документации по ценам и квотам .