Powiadomienia push

Przegląd

Interfejs Gmail API udostępnia powiadomienia push serwera, które umożliwiają monitorowanie zmian w skrzynkach pocztowych Gmaila. Możesz użyć tej funkcji, aby zwiększyć wydajność aplikacji. Pozwala to wyeliminować dodatkowe koszty sieciowe i obliczeniowe związane z odpytywaniem zasobów w celu sprawdzenia, czy uległy zmianie. Za każdym razem, gdy skrzynka pocztowa ulegnie zmianie, interfejs Gmail API powiadamia aplikację serwera backendu.

Początkowa konfiguracja Cloud Pub/Sub

Interfejs Gmail API używa interfejsu Cloud Pub/Sub API do dostarczania powiadomień push. Umożliwia to powiadamianie różnymi metodami, w tym za pomocą webhooków i sondowania w jednym punkcie końcowym subskrypcji.

Wymagania wstępne

Aby dokończyć konfigurację, upewnij się, że spełniasz wymagania wstępne dotyczące Cloud Pub/Sub, a następnie skonfiguruj klienta Cloud Pub/Sub.

Tworzenie tematu

Za pomocą klienta Cloud Pub/Sub utwórz temat, do którego interfejs Gmail API będzie wysyłać powiadomienia. Nazwa tematu może być dowolną nazwą wybraną w ramach projektu (np. pasującą do wzorca projects/myproject/topics/*, gdzie myproject to identyfikator projektu podany w Google Developers Console).

Tworzenie subskrypcji

Postępuj zgodnie z przewodnikiem po subskrybentach Cloud Pub/Sub, aby skonfigurować subskrypcję utworzonego tematu. Skonfiguruj typ subskrypcji jako push webhooka (czyli wywołanie zwrotne HTTP POST) lub pull (czyli inicjowany przez Twoją aplikację). W ten sposób aplikacja będzie otrzymywać powiadomienia o aktualizacjach.

Przyznawanie praw do publikowania w temacie

Cloud Pub/Sub wymaga, aby przyznać Gmailowi uprawnienia do publikowania powiadomień w Twoim temacie.

Aby to zrobić, musisz przyznać publish uprawnienia do gmail-api-push@system.gserviceaccount.com. Możesz to zrobić za pomocą interfejsu uprawnień w konsoli deweloperskiej Cloud Pub/Sub, postępując zgodnie z instrukcjami dotyczącymi kontroli dostępu na poziomie zasobów.

Otrzymywanie aktualizacji skrzynki pocztowej Gmail

Po zakończeniu wstępnej konfiguracji Cloud Pub/Sub skonfiguruj konta Gmail, aby wysyłać powiadomienia o aktualizacjach skrzynki pocztowej.

Prośba o obejrzenie

Aby skonfigurować konta Gmail tak, aby wysyłały powiadomienia do tematu Cloud Pub/Sub, użyj klienta Gmail API, aby wywołać watch w skrzynce pocztowej użytkownika Gmaila, podobnie jak w przypadku każdego innego wywołania interfejsu Gmail API. Aby to zrobić, podaj nazwę tematu utworzoną powyżej i inne opcje w żądaniu watch, np. labels, aby filtrować. Jeśli na przykład chcesz otrzymywać powiadomienia o każdej zmianie w skrzynce odbiorczej:

Protokół

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()

Odpowiedź na zegarku

Jeśli żądanie watch zostanie zrealizowane, otrzymasz odpowiedź podobną do tej:

{
  historyId: 1234567890
  expiration: 1431990098200
}

z bieżącą skrzynką pocztową historyId użytkownika. O wszystkich zmianach wprowadzonych po tym terminiehistoryId poinformujemy Twojego klienta. Jeśli musisz przetworzyć zmiany przed tym terminem historyId, zapoznaj się z przewodnikiem po synchronizacji.

Dodatkowo udane wywołanie watch powinno spowodować natychmiastowe wysłanie powiadomienia do tematu Cloud Pub/Sub.

Jeśli wywołanie watch zwróci błąd, szczegóły powinny wyjaśniać źródło problemu, które zwykle jest związane z konfiguracją tematu i subskrypcji Cloud Pub/Sub. Aby sprawdzić, czy konfiguracja jest prawidłowa, i uzyskać pomoc w rozwiązywaniu problemów z tematami i subskrypcjami, zapoznaj się z dokumentacją Cloud Pub/Sub.

Odnowienie zegarka skrzynki pocztowej

Musisz ponownie wywołać funkcję watch co najmniej co 7 dni, w przeciwnym razie przestaniesz otrzymywać aktualizacje dotyczące użytkownika. Zalecamy wywoływanie funkcji watch raz dziennie. Odpowiedź watch zawiera też pole ważności z sygnaturą czasową wygaśnięcia watch.

Otrzymywanie powiadomień

Gdy w skrzynce pocztowej pojawi się aktualizacja zgodna z Twoimi watch, aplikacja otrzyma wiadomość z powiadomieniem opisującą zmianę.

Jeśli masz skonfigurowaną subskrypcję push, powiadomienie webhook do Twojego serwera będzie zgodne z tym 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"
}

Treść żądania HTTP POST jest w formacie JSON, a rzeczywisty ładunek powiadomienia Gmaila znajduje się w polu message.data. Pole message.data to ciąg znaków zakodowany w standardzie base64url, który po zdekodowaniu staje się obiektem JSON zawierającym adres e-mail i nowy identyfikator historii skrzynki pocztowej użytkownika:

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

Następnie możesz użyć history.list, aby uzyskać szczegóły zmian użytkownika od czasu jego ostatniego znanego identyfikatora historii, zgodnie z przewodnikiem synchronizacji.

Na przykład, aby użyć history.list do identyfikowania zmian, które zaszły między początkowym wywołaniem watch a otrzymaniem wiadomości z powiadomieniem udostępnionej w poprzednim przykładzie, przekaż 1234567890 jako startHistoryId do history.list. Następnie9876543210 można zapisać jako ostatni znany identyfikator historyId do wykorzystania w przyszłości.

Jeśli zamiast tego skonfigurowano subskrypcję typu pull, zapoznaj się z przykładowymi kodami w przewodniku po pobieraniu wiadomości przez subskrybenta Cloud Pub/Sub, aby dowiedzieć się więcej o odbieraniu wiadomości.

Odpowiadanie na powiadomienia

Wszystkie powiadomienia muszą zostać potwierdzone. Jeśli używasz dostarczania typu push za pomocą webhooka, potwierdzeniem powiadomienia będzie pomyślna odpowiedź (np. HTTP 200).

Jeśli używasz pobierania typu pull (REST Pull, RPC Pull lub RPC StreamingPull), musisz wykonać wywołanie potwierdzające (REST lub RPC). Więcej informacji o potwierdzaniu wiadomości asynchronicznie lub synchronicznie przy użyciu oficjalnych bibliotek klienta opartych na RPC znajdziesz w przykładach kodu w przewodniku po pobieraniu wiadomości przez subskrybenta Cloud Pub/Sub.

Jeśli powiadomienia nie zostaną potwierdzone (np. wywołanie zwrotne webhooka zwróci błąd lub przekroczy limit czasu), Cloud Pub/Sub ponowi próbę wysłania powiadomienia w późniejszym czasie.

Zatrzymywanie aktualizacji skrzynki pocztowej

Aby przestać otrzymywać aktualizacje dotyczące skrzynki pocztowej, zadzwoń pod numer stop. Wszystkie nowe powiadomienia powinny przestać przychodzić w ciągu kilku minut.

Ograniczenia

Maksymalna liczba powiadomień

Każdy obserwowany użytkownik Gmaila może otrzymywać maksymalnie 1 powiadomienie na sekundę. Powiadomienia powyżej tego limitu zostaną odrzucone. Zachowaj ostrożność podczas obsługi powiadomień, aby nie wywołać kolejnego powiadomienia i tym samym nie rozpocząć pętli powiadomień.

Niezawodność

Zazwyczaj wszystkie powiadomienia powinny być dostarczane niezawodnie w ciągu kilku sekund. W niektórych ekstremalnych sytuacjach mogą jednak być opóźnione lub pominięte. Zadbaj o to, aby aplikacja radziła sobie z taką sytuacją i nadal synchronizowała dane, nawet jeśli nie otrzymuje powiadomień push. Na przykład po pewnym czasie, w którym użytkownik nie otrzymywał powiadomień, można okresowo wywoływać funkcję history.list.

Ograniczenia Cloud Pub/Sub

Interfejs Cloud Pub/Sub API ma też własne ograniczenia, które są szczegółowo opisane w dokumentacji dotyczącej cenlimitów.