プッシュ通知

概要

Gmail API は、Gmail メールボックスの変更を監視できるサーバー プッシュ通知を提供します。この機能を使用すると、アプリケーションのパフォーマンスを改善できます。これにより、リソースが変更されたかどうかを判断するためのポーリングに関連する余分なネットワーク コストとコンピューティング コストを省くことができます。メールボックスが変更されるたびに、Gmail API がバックエンド サーバー アプリケーションに通知します。

Cloud Pub/Sub の初期設定

Gmail API は、Cloud Pub/Sub API を使用してプッシュ通知を配信します。これにより、1 つの定期購入エンドポイントでの Webhook やポーリングなど、さまざまな方法による通知が可能になります。

前提条件

このセットアップの残りを完了するには、Cloud Pub/Sub の前提条件を満たしていることを確認し、Cloud Pub/Sub クライアントを設定します。

トピックを作成する

Cloud Pub/Sub クライアントを使用して、Gmail API からの通知送信先のトピックを作成します。トピック名には、プロジェクトで選択した任意の名前を使用できます(たとえば、projects/myproject/topics/* に一致します。myproject は、Google Developers Console でプロジェクトに対して一覧表示されているプロジェクト ID です)。

トピック数に Cloud Pub/Sub の制限があるため、アプリケーションの Gmail API プッシュ通知にはすべて 1 つのトピックを使用することをおすすめします。

サブスクリプションを作成する

Cloud Pub/Sub サブスクライバー ガイドに沿って、作成したトピックへのサブスクリプションを設定します。サブスクリプション タイプを Webhook push(HTTP POST コールバック)または pull(アプリによって開始)のいずれかに設定します。これは、アプリケーションが更新の通知を受信する方法です。

トピックに関する公開権限の付与

Cloud Pub/Sub では、トピックに通知をパブリッシュする権限を Gmail に付与する必要があります。

これを行うには、publish 権限を gmail-api-push@system.gserviceaccount.com に付与する必要があります。これを行うには、Cloud Pub/Sub デベロッパー コンソールの権限インターフェースを使用して、リソースレベルのアクセス制御の手順を行います。

Gmail メールボックスの更新の取得

Cloud Pub/Sub の初期設定が完了したら、メールボックスの更新の通知を送信するように Gmail アカウントを構成します。

ウォッチリクエスト

Cloud Pub/Sub トピックに通知を送信するように Gmail アカウントを構成するには、他の Gmail API 呼び出しと同様に、Gmail API クライアントを使用して Gmail ユーザーのメールボックスで watch を呼び出すだけです。そのためには、上記で作成したトピック名と、フィルタする他のオプション(labels など)を watch リクエストで指定します。たとえば、受信トレイに変更が加えられたときに通知を受け取るには、次のように指定します。

プロトコル

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

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

Python

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 のドキュメントを参照して、設定が正しいことを確認し、トピックとサブスクリプションの問題をデバッグしてください。

メールボックスの監視を更新しています

少なくとも 7 日ごとに watch を呼び出してください。そうしないと、ユーザーへの最新情報を受け取れなくなります。watch は 1 日に 1 回呼び出すことをおすすめします。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 でエンコードされた文字列で、ユーザーのメールアドレスと新しいメールボックス履歴 ID を含む JSON オブジェクトにデコードされます。

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

次に history.list を使用して、同期ガイドに沿って、最後に確認された historyId 以降のユーザーの変更の詳細を取得します。

pull サブスクリプションを構成している場合は、Cloud Pub/Sub サブスクライバー pull ガイドのコードサンプルでメッセージの受信の詳細をご覧ください。

通知への対応

すべての通知は確認応答する必要があります。Webhook push 配信を使用する場合、正常に応答(HTTP 200 など)すると通知の確認応答が行われます。

pull 配信(REST pullRPC pull、または RPC StreamingPull)を使用している場合は、確認応答呼び出し(REST または RPC)でフォローアップする必要があります。正式な RPC ベースのクライアント ライブラリを使用してメッセージの確認を非同期または同期で行う方法の詳細については、Cloud Pub/Sub サブスクライバー pull ガイドのコードサンプルをご覧ください。

通知が確認応答されない場合(Webhook コールバックがエラーを返した場合やタイムアウトした場合など)、Cloud Pub/Sub は後で通知を再試行します。

メールボックスの更新を停止しています

メールボックスでの更新の受信を停止するには、stop を呼び出します。すべての新しい通知が数分以内に停止します。

制限事項

最大通知レート

監視対象の Gmail ユーザーごとに最大通知速度は 1 イベント/秒です。この速度を超えるユーザー通知はすべて破棄されます。通知を処理するときは、別の通知をトリガーして通知ループが発生しないように注意してください。

信頼性

通常、すべての通知は数秒以内に確実に配信される必要があります。ただし、極端な状況では、通知が遅延したり破棄されたりすることがあります。 プッシュ メッセージを受信しなくてもアプリが同期するように、この可能性に適切に対処してください。たとえば、ユーザーへの通知がない期間の後で history.list を定期的に呼び出すようにフォールバックします。

Cloud Pub/Sub の制限事項

Cloud Pub/Sub API には独自の制限事項もあります。具体的には、pricingquotasに関するドキュメントをご覧ください。