Omówienie
Interfejs Gmail API udostępnia powiadomienia push z serwera, które pozwalają śledzić zmiany w skrzynkach pocztowych Gmaila. Dzięki tej funkcji możesz poprawić wydajność aplikacji. Pozwala to wyeliminować dodatkowe koszty sieci i przetwarzania związane z zapytaniem o zasoby w celu sprawdzenia, czy uległy zmianie. Gdy nastąpi zmiana skrzynki pocztowej, interfejs Gmail API powiadomi Twoją aplikację serwera.
Początkowa konfiguracja Cloud Pub/Sub
Interfejs Gmail API używa interfejsu Cloud Pub/Sub API do dostarczania powiadomień push. Umożliwia to wysyłanie powiadomień na różne sposoby, w tym za pomocą webhooków i sondowania w pojedynczym punkcie końcowym subskrypcji.
Wymagania wstępne
Aby dokończyć konfigurację, spełnij wymagania w sekcji 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 (czyli pasującą do projects/myproject/topics/*
, gdzie myproject
jest identyfikatorem projektu wymienionym w Twoim projekcie w Google Developers Console).
Ze względu na limity Cloud Pub/Sub dotyczące liczby tematów zalecamy używanie jednego tematu do wszystkich powiadomień push Gmail API w aplikacji.
Tworzenie subskrypcji
Aby skonfigurować subskrypcję utworzonego tematu, postępuj zgodnie z przewodnikiem dla subskrybentów Cloud Pub/Sub. Skonfiguruj typ subskrypcji jako push webhooka (np. wywołanie zwrotne HTTP POST) lub pull (np. inicjowany przez Twoją aplikację). Dzięki temu 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 temacie.
Aby to zrobić, musisz przyznać uprawnienia publish
do gmail-api-push@system.gserviceaccount.com
. Możesz to zrobić, korzystając z interfejsu uprawnień w Konsoli programisty Cloud Pub/Sub zgodnie z instrukcjami dotyczącymi kontroli dostępu na poziomie zasobu.
Otrzymywanie powiadomień o zmianach w skrzynce pocztowej Gmail
Po zakończeniu początkowej konfiguracji Cloud Pub/Sub skonfiguruj konta Gmail, aby wysyłać powiadomienia o aktualizacjach skrzynki pocztowej.
Prośba o obejrzenie
Aby skonfigurować konta Gmail na potrzeby wysyłania powiadomień do tematu Cloud Pub/Sub, wystarczy użyć klienta Gmail API do wywołania watch
w skrzynce pocztowej użytkownika Gmaila, tak jak w przypadku każdego innego wywołania Gmail API.
Aby to zrobić, podaj nazwę tematu utworzonego powyżej oraz inne opcje w prośbie watch
, np. labels
, aby włączyć filtr. Aby na przykład 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ź
Jeśli żądanie watch
się powiedzie, otrzymasz odpowiedź podobną do tej:
{
historyId: 1234567890
expiration: 1431990098200
}
z bieżącą skrzynką pocztową historyId
użytkownika. Wszystkie zmiany wprowadzone po tym terminie
historyId
będą wysyłane do Twojego klienta. Jeśli chcesz przetworzyć zmiany przed historyId
, zapoznaj się z przewodnikiem po synchronizacji.
Ponadto pomyślnie wykonane wywołanie watch
powinno spowodować natychmiastowe wysłanie powiadomienia do tematu Cloud Pub/Sub.
Jeśli w wyniku wywołania funkcji watch
wystąpi błąd, w szczegółach powinien być wyjaśniony jego powód, który zwykle wiąże się z konfiguracją tematu i subskrypcji Cloud Pub/Sub. Aby sprawdzić, czy konfiguracja jest prawidłowa, i rozwiązać problemy z tematem i subskrypcją, zapoznaj się z dokumentacją Cloud Pub/Sub.
Odnawianie zegara skrzynki pocztowej
Musisz ponownie wywołać funkcję watch
co najmniej raz na 7 dni, w przeciwnym razie przestaniesz otrzymywać aktualizacje dotyczące tego użytkownika. Zalecamy
wybieranie numeru watch
raz dziennie. Odpowiedź watch
zawiera też pole z sygnaturą czasową ważności watch
.
Otrzymywanie powiadomień
Gdy nastąpi zmiana skrzynki pocztowej odpowiadająca Twoim watch
, aplikacja otrzyma powiadomienie z opisem tej zmiany.
Jeśli masz skonfigurowaną subskrypcję push, powiadomienie webhooka wysyłane na serwer będzie zgodne z formatem 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 formacie base64url, który po dekodowaniu tworzy obiekt JSON zawierający adres e-mail i nowy identyfikator historii skrzynki pocztowej użytkownika:
{"emailAddress": "user@example.com", "historyId": "9876543210"}
Następnie możesz użyć parametru history.list
, aby uzyskać szczegóły zmian wprowadzonych przez użytkownika od czasu użycia przez niego ostatnio znanego parametru historyId, zgodnie z przewodnikiem po synchronizacji.
Jeśli masz skonfigurowaną subskrypcję typu „pull”, więcej informacji o odbieraniu wiadomości znajdziesz w przykładach kodu w przewodniku po subskrypcji typu „pull” w Cloud Pub/Sub.
Odpowiadanie na powiadomienia
Wszystkie powiadomienia muszą być potwierdzone. Jeśli używasz webhooka do przesyłania danych w trybie push, pomyślna odpowiedź (np. HTTP 200) potwierdzi powiadomienie.
Jeśli używasz dostawy typu pull (REST Pull, RPC Pull lub RPC StreamingPull), musisz wykonać wywołanie potwierdzenia (REST lub RPC). Więcej informacji o potwierdzaniu wiadomości w sposób asynchroniczny lub synchroniczny znajdziesz w oficjalnych bibliotekach klienta opartych na RPC. Przykłady kodu znajdziesz w przewodniku po subskrypcji 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 spróbuje ponownie wysłać powiadomienie w późniejszym terminie.
Zatrzymywanie aktualizacji skrzynki pocztowej
Aby przestać otrzymywać powiadomienia o poczcie, zadzwoń pod numer stop
. Po kilku minutach nie będziesz już otrzymywać nowych powiadomień.
Ograniczenia
Maksymalna częstotliwość powiadomień
Każdy obserwowany użytkownik Gmaila ma maksymalną częstotliwość powiadomień wynoszącą 1 zdarzenie/s. Wszystkie powiadomienia o użytkownikach, które przekraczają tę częstotliwość, zostaną odrzucone. Podczas obsługi powiadomień zachowaj ostrożność, aby nie wywołać kolejnego powiadomienia i w ten sposób nie rozpocząć pętli powiadomień.
Niezawodność
Zazwyczaj wszystkie powiadomienia powinny być dostarczane w ciągu kilku sekund, ale w niektórych ekstremalnych sytuacjach mogą być opóźnione lub nie dotrzeć.
Zadbaj o to, aby aplikacja nadal synchronizowała się, nawet jeśli nie otrzyma żadnych powiadomień push. Może to być na przykład okresowe wywoływanie funkcji history.list
po okresie bez powiadomień dla użytkownika.
Ograniczenia Cloud Pub/Sub
Interfejs Cloud Pub/Sub API ma też własne ograniczenia, które są szczegółowo opisane w dokumentacji dotyczącej cen i limitów.