Powiadomienia push API Gmail: Kompletny przewodnik po Pub/Sub, Watch i historii (2026)

Przewodnik po Gmail API

Gmail API Powiadomienia push: Kompletny przewodnik po Pub/Sub, Watch i Historii (2026)

Skonfiguruj powiadomienia push Gmail API end-to-end: utwórz temat Pub/Sub, zarejestruj punkt końcowy watch, dekoduj ładunki webhook, uzgodnij zmiany z użytkownicy.historia.lista, zautomatyzować odnawianie watchy i pominąć całą konfigurację GCP dzięki ujednoliconej alternatywie webhook.

gmail-watch.js
// 1. Zarejestruj watch Gmail przez Unipile const res = czekać fetch('https://api8.unipile.com:13815/api/v1' + '/konta/{id}/obserwuj', { method: 'POST', headers: { 'Klucz API X': 'TWÓJ_KLUCZ_API', 'Content-Type': 'application/json' }, body: JSON.stringify({ webhook_url: 'https://app.you.com/webhooks/gmail' }) }); // 2. Odbierz ujednolicony ładunek webhook aplikacja.stanowisko('/webhooks/gmail', (req, res) => { const { zdarzenie, identyfikator_konta, adres_email } = req.body; // zdarzenie: "nowa_wiadomosc" | zhistoriid=abstrahowano obsłużNowyEmail(e-mail); });
Zdarzenia Gmail w czasie rzeczywistym - nie jest wymagany żaden konfiguracja GCP
Podstawowa Koncepcja

Powiadomienia push Gmail API to mechanizm informowania aplikacji klienckiej o zmianach w skrzynce odbiorczej Gmail użytkownika. Zamiast ciągłego odpytywania serwerów Google o nowe wiadomości (polling), aplikacje mogą zarejestrować się do otrzymywania powiadomień w czasie rzeczywistym, gdy tylko coś się zmieni.

Przed wdrożeniem powiadomień push API Gmail w środowisku produkcyjnym warto dokładnie zrozumieć, czym są, czym różnią się od prostego odpytywania oraz jaka infrastruktura jest wymagana.

Definicja

Powiadomienia push do interfejsu Gmail API to mechanizm dostarczania w czasie rzeczywistym, który wykorzystuje Google Cloud Pub/Sub do wysyłania zdarzeń zmian w skrzynce pocztowej do kontrolowanego przez dewelopera punktu końcowego HTTPS. Gdy przychodzi nowa wiadomość lub istniejąca wiadomość zostanie zmodyfikowana, Gmail publikuje powiadomienie zawierające zakodowane Identyfikator Historii do tematu Pub/Sub, który posiadasz, a następnie przekazuje to zdarzenie do Twojego webhooka. Twój serwer wywołuje użytkownicy.historia.lista aby pobrać faktyczne zmiany.

Zdarzeniowe, a nie oparte na odpytywaniu

Powiadomienia push Gmail API eliminują potrzebę wielokrotnego wywoływania Wiadomości.lista terminowo. Zdarzenia są dostarczane w ciągu kilku sekund od zmiany w skrzynce pocztowej, co zmniejsza opóźnienia i wykorzystanie limitu API.

Zasilane przez Google Pub/Sub

Kanał dostarczania to Google Cloud Pub/Sub, a nie bezpośrednie wywołanie zwrotne HTTP z Gmail. Zwiększa to trwałość: jeśli Twój punkt końcowy jest tymczasowo niedostępny, Pub/Sub może ponawiać próbę dostarczenia zgodnie z terminem potwierdzenia subskrypcji.

7-dniowy termin ważności zegarka

Punkt końcowy nasłuchiwania Gmail API wygasa po 7 dniach. Twoja aplikacja musi go proaktywnie odnawiać za pomocą codziennego zadania cron, aby uniknąć cichego pominięcia zdarzeń. Jest to kluczowy szczegół operacyjny omówiony w sekcji Odnawianie.

Wypchnięcie (Pub/Sub)

Powiadomienia push Gmail API dostarczają zdarzenia w ciągu 1-10 sekund od zmiany. Brak ciągłego odpytywania oznacza niższe zużycie limitów Gmail API i szybszy czas reakcji dla Twojej aplikacji. Idealne do każdego zastosowania w czasie rzeczywistym na poziomie skrzynki odbiorczej: synchronizacja CRM, systemy zgłoszeń, automatyzacja przepływu pracy.

Sondaż (głosowanie)

Sondaż Wiadomości.lista co 60 sekund jest prostsze w konfiguracji, ale wprowadza sztuczne opóźnienia, marnuje limit przy pustych odpowiedziach i słabo skaluje się przy dużej liczbie uwierzytelnionych kont użytkowników. Akceptowalne tylko dla prototypów o niskim natężeniu ruchu.

Architektura

Architektura: watch + Pub/Sub + historyId w jednym przepływie

Powiadomienia push interfejsu API Gmail obejmują cztery odrębne warstwy pracujące sekwencyjnie. Zrozumienie każdej warstwy przed napisaniem kodu pozwala uniknąć najczęstszych błędów implementacji.

Przepływ od początku do końca
1
Twoja aplikacja wywołujeużytkownicy.oglądaj

POSTujesz do https://gmail.googleapis.com/gmail/v1/users/me/watch z nazwą Twojego tematu Pub/Sub i opcjonalnie filtrem etykiet. Gmail zwraca Identyfikator Historii i a wygaśnięcie Znacznik czasu Unix. Przechowuj oba. Ten zegarek wygasa za 7 dni.

2
Gmail publikuje naTemat Pub/Sub

Gdy nastąpi jakakolwiek zmiana w obserwowany skrzynce pocztowej (nowa wiadomość, zmiana etykiety, przełączenie odczytu/nieodczytu), Gmail publikuje powiadomienie JSON w twoim temacie Cloud Pub/Sub. Ładunek to zakodowany w base64 obiekt zawierający adres e-mail użytkownika i nowy Identyfikator Historii.

3
Pub/Sub wysyła dane do twojegowebhook

Twoja subskrypcja Pub/Sub przekazuje wiadomość do zarejestrowanego punktu końcowego push HTTPS. Jest to Twój adres URL webhook, który musi odpowiedzieć kodem HTTP 200-299 w ciągu terminu potwierdzenia (domyślnie 10-600 sekund). Odpowiedź inna niż 2xx spowoduje automatyczne ponowienia.

4
Twój webhook wyodrębniaIdentyfikator Historii

Zdekoduj dane wiadomości Pub/Sub z bazy64. Wyodrębnij nowe Identyfikator Historii. Porównaj to z ostatniIdHistorii przechowywane w Twojej bazie danych dla tego użytkownika.

5
Zadzwońużytkownicy.historia.listapogodzić się

Zadzwoń użytkownicy.historia.lista z startIdHistorii ustawiona na wartość przechowywaną. Gmail zwraca wszystkie zmiany (nowe wiadomości, dodane etykiety, usunięcia) między tymi dwoma identyfikatorami. Zaktualizuj przechowywany ostatniIdHistorii do nowej wartości. Nigdy nie używaj historyId z powiadomienia Pub/Sub jako startIdHistorii bezpośrednio.

6
Przedłuż ważność zegarka przed wygaśnięciem

Zaplanuj codzienne zadanie cron, które wywoła użytkownicy.oglądaj ponownie dla każdego uwierzytelnionego konta użytkownika. Monitorowanie odnowienia jest idempotentne: kolejne wywołanie zastępuje poprzednią datę wygaśnięcia. Zwrócony Identyfikator Historii staje się twoją nową podstawą.

Identyfikator Historii

Monotonicznie rosnąca liczba całkowita przypisana przez Gmail do każdej zmiany skrzynki pocztowej. Jest to Twój kursor do synchronizacji przyrostowej. Zawsze przechowuj najnowszy `historyId` dla każdego użytkownika w swojej bazie danych.

użytkownicy.oglądaj

Punkt końcowy API Gmail, który rejestruje subskrypcję powiadomień push dla skrzynki pocztowej. Zwraca bazowy identyfikator historii i sygnaturę czasową wygaśnięcia w milisekundach Unix. Musi zostać odnowiony w ciągu 7 dni.

użytkownicy.historia.lista

Punkt końcowy pojednania. Podając `startHistoryId`, zwraca wszystkie dodania, usunięcia i zmiany etykiet wiadomości, które nastąpiły po tym punkcie. Tutaj uzyskasz rzeczywiste dane wiadomości.

Konfiguracja

Wymagania wstępne: projekt GCP, temat Pub/Sub, uprawnienie IAM

Powiadomienia push Gmail API wymagają trzech zasobów po stronie GCP przed pierwszymi użytkownicy.oglądaj Największa część błędów implementacyjnych wynika z braku uprawnień IAM do tematu Pub/Sub, co jest krokiem, który programiści najczęściej pomijają.

1
Projekt GCP z włączonym Gmail API

W Konsoli Google Cloud utwórz lub wybierz istniejący projekt. Przejdź do API i usługi > Biblioteka i włącz Gmail API. Również potrzebujesz API Cloud Pub/Sub włączone w tym samym projekcie. Upewnij się, że poświadczenia klienta OAuth 2.0 zawierają https://www.googleapis.com/auth/gmail.readonly zakres (lub szerszy zakres, jeśli potrzebujesz uprawnień do zapisu). W przypadku aplikacji wieloużytkownikowych, zobacz nasz przewodnik dotyczący Integracja Gmail OAuth 2.0 i Weryfikacja aplikacji Google OAuth wymagania.

2
Utwórz temat Cloud Pub/Sub

W konsoli GCP w obszarze Pub/Sub > Tematy, kliknij Utwórz temat. Nadaj mu nazwę, taką jak powiadomienia gmail. Pełna nazwa tematu będzie projects/TWOJE_ID_PROJEKTU/topics/powiadomienia-gmail. Przekażesz ten dokładny ciąg znaków do użytkownicy.oglądaj w NazwaTematu pole.

3
Nadaj rolę Wydawca dla gmail-api-push@system.gserviceaccount.com

To jest krok, który większość programistów przeocza. Gmail używa zarządzanego przez Google konta usługi (gmail-api-push@system.gserviceaccount.comAby publikować powiadomienia w temacie Pub/Sub. Bez przyznania temu kontu Wydawca Pub/Sub rola w twoim temacie, użytkownicy.oglądaj zostanie pomyślnie wdrożony, ale żadne powiadomienia nigdy nie zostaną dostarczone. W Konsoli: Tematy > wybierz swój temat > Uprawnienia > Dodaj podmiot > wpisz gmail-api-push@system.gserviceaccount.com przypisać rolę Wydawca Pub/Sub.

4
Utwórz subskrypcję wypychanych powiadomień (Push subscription) wskazującą Twój webhook

Pod swoim tematem Pub/Sub utwórz Subskrypcja push. Ustaw punkt końcowy push na adres URL swojego webhooku HTTPS (wymagany ważny certyfikat TLS, certyfikaty samopodpisane są odrzucane). Opcjonalnie skonfiguruj nagłówek walidacji tokenu, aby punkt końcowy mógł weryfikować, czy żądania pochodzą z Google. Zanotuj nazwę subskrypcji, może być ona potrzebna do monitorowania metryk dostarczania w Cloud Monitoring.

Limit 100 użytkowników dla zweryfikowanych aplikacji: Jeśli Twój ekran zgody OAuth ma status "W trakcie testowania", tylko 100 kont Gmail może autoryzować Twoją aplikację. Ten limit dotyczy wszystko Zakresy OAuth, w tym punkt końcowy watch. W przypadku wdrożeń produkcyjnych z ponad 100 użytkownikami musisz przejść proces weryfikacji Google. Zobacz nasz pełny przewodnik na temat Limit 100 użytkowników i ścieżka weryfikacji.

Pomiń całkowicie konfigurację GCP

Brak tematu Pub/Sub. Brak uprawnienia IAM. Brak zadania cron odnawiającego obserwację co 7 dni. Zbuduj powiadomienia push Gmail za pomocą jednego adresu URL webhook.

Buduj teraz
Krok po kroku

Krok po kroku: utwórz temat, subskrypcja i użytkownik.watch

Posiadając spełnione wymagania GCP, oto kompletny kod do zarejestrowania punktu końcowego Gmail API watch w Node.js i Python, przy użyciu biblioteki klienta Google API.

Node.js
Python
watch.js
const { google } = require('googleapis'); // Zakłada, że klient OAuth2 jest już autoryzowany ważnym tokenem dostępu // Zobacz: https://www.unipile.com/gmail-oauth-20-integration-complete-guide/ async function zarejestrujGmailWatch(auth, userId = 'ja') { const gmail = google.gmail({ wersja: 'v1', auth }); const response = czekać gmail.uzytkownicy.zegarek({ idUżytkownika, requestBody: { // Pełna nazwa Twojego tematu Pub/Sub NazwaTematu: 'projects/TWOJE_ID_PROJEKTU/topics/powiadomienia-gmail', // Opcjonalnie: filtrowanie do konkretnych etykiet labelIds: ['SKRZYNKA'], zachowaniefiltraetykiety 'ZAŁĄCZ' } }); const { historiaId, waznosc } = odpowiedz.dane; // Przechowuj to na użytkownika w swojej bazie danych czekać baza danych.upsert({ idUżytkownika, lastHistoryId: historyId, // wygaśnięcie to sygnatura czasowa Unix w milisekundach watchExpiry: nowy Data(parseInt(wygaśnięcie) }); konsola.log(`Obserwacja zarejestrowana. historyId: ${historyId}, wygasa: ${expiration}`); return response.data; }
watch.py
z googleapiclient.discovery import budować z google.oauth2.credentials import Poświadczenia def zarejestruj_gmail_obserwuj(dane logowania: Dane logowania, id_użytkownika: str = 'ja') -> dict: "Zarejestruj powiadomienia push API Gmail dotyczące oglądania dla uwierzytelnionego użytkownika." usługa = budować('gmail', 'v1', dane_uwierzytelniające=dane_uwierzytelniające) ciało = { 'nazwaTematu': 'projects/TWOJE_ID_PROJEKTU/topics/powiadomienia-gmail', 'identyfikatoryEtykiet': ['SKRZYNKA'], 'zachowanieFiltrowaniaEtykiet': 'ZAŁĄCZ' } wynik = service.users().zegarek(userId=user_id, body=body).wykonaj() # Przechowuj dane poszczególnych użytkowników w bazie danych db_upsert(user_id=user_id, last_history_id=wynik['identyfikatorHistorii'], watch_expiry=int(wynik['wygaśnięcie']) // 1000) return wynik
Implementacja

Obsługa ładunku powiadomień push Gmail API

Kiedy Gmail wysyła powiadomienie push, Twój punkt końcowy HTTPS otrzymuje komunikat push Pub/Sub. Rzeczywiste dane zmian Gmaila są podwójnie zakodowane: koperta Pub/Sub zawiera zakodowany w formacie base64 ciąg JSON, który sam w sobie zawiera adres e-mail użytkownika i identyfikator historii.

webhook.js (Express)
Node.js - Obsługa Express
aplikacja.stanowisko('/webhooks/gmail', async (req, res) => { // Potwierdź natychmiast: Pub/Sub ponawia próby w przypadku odpowiedzi innych niż 2xx rez.status(200).koniec(); próbuj { const wiadomosc = req.body.wiadomosc; jeśli if (!message?.data) return; // Dekodowanie pola danych Pub/Sub zakodowanego w Base64 const odkodowano = Bufor.z(dane.wiadomości, 'base64').toString('utf-8'); const ładunek JSON.parsować(odkodowane); // ładunek = { adresEmail: "user@gmail.com", identyfikatorHistorii: "12345" } const { emailAddress, historyId } = payload; // Roz pogodzenie kolejki (nie blokuj potwierdzenia) czekać kolejka.dodać do kolejki({ emailAddress, historyId }); } catch (err) { // Loguj, ale nie rzucaj ponownie: potwierdzenie zostało już wysłane konsola.błąd('Błąd parsowania webhooka', err); } });
webhook.py (Flask)
Python - Obsługa Flask
import base64, json z kieliszek import Flask, request, jsonify aplikacja = Flaszka(__name__) @aplikacja.trasa('/webhooks/gmail', methods=['POST']) def gmail_webhook(): # Potwierdzić natychmiast dane = żądanie.get_json(cichy=True) lub {} wiadomosc = dane.uzyskać('wiadomość', {}) jeśli 'dane' w wiadomość: # – Dekodowanie base64 i parsowanie JSON surowe = base64.b64decodeWiadomość'dane'] + '==') ładunek json.obciążenia(surowe) # { "emailAddress": "user@gmail.com", "historyId": "12345" } email = ładunek.uzyskać('adres email') id_historii = ładunek.uzyskać('identyfikatorHistorii') # – Dodanie do kolejki asynchronicznej synchronizacji dodaj_do_kolejki_i_zsynchronizuj(email, identyfikator_historii) return jsonify({}), 200
Pojednanie

Pogodzenie zmian z users.history.list

Powiadomienie Pub/Sub informuje Cię tylko coś się zmieniło. Nie mówi ci, czego. Musisz zadzwonić użytkownicy.historia.lista z twoimi zapisanymi ostatniIdHistorii jako kursor, aby uzyskać faktyczną deltę.

reconcile.js
async function zgodaHistorii(autor, adresEmail, nowyIdHistorii) { const gmail = google.gmail({ wersja: 'v1', auth }); // Pobierz nasz ostatni zapisany identyfikator historii dla tego użytkownika const użytkownik = czekać baza danych.znajdźPoAdresieEmail(adresEmail); const startHistoryId = user.ostatniIdHistorii; próbuj { const response = czekać gmail.users.history.list({ userId: 'ja', // Użyj ZAPISANEGO IDENTYFIKATORA jako kursora: NIE nowego historyId powiadomienia identyfikatorPoczątkuHistorii, // Filtruj tylko do dodanych wiadomości (opcjonalnie) typHistorii: ['wiadomośćDodana'] }); const historie = response.data.history || []; dla (const kronika dziejów) { dla (const added of (record.messagesAdded || [])) { // dodano.wiadomość = { id, threadId, labelIds } czekać przetwarzajNowąWiadomość(auth, added.message.id); } } // Zaktualizuj kursor do nowego historyId z powiadomienia czekać baza danych.aktualizujIdOstatniejHistorii(adresEmail, nowyIdHistorii); } catch (err) { jeśli (err.code === 404) { // historyId jest za stary (> 7 dni). Zainicjuj ponownie z messages.list czekać zainicjalizujPonownieZKomunikatów(autoryzacja, adresEmail); } w przeciwnym razie { rzucić błąd; } } }
Zawsze używaj zapisanego kursora, a nie historii powiadomieńId

historyId w powiadomieniu Pub/Sub to aktualny stan. startIdHistorii musi być poprzedni wartość, którą zapisałeś. Użycie bezpośrednio identyfikatora historii powiadomień jako identyfikatora historii początkowej oznacza pominięcie wszystkich zmian, które zaszły między ostatnim przetworzonym punktem a teraźniejszością.

Obsługuj powtarzające się powiadomienia w sposób idempotentny

Pub/Sub może dostarczyć to samo powiadomienie więcej niż raz. Twoja logika uzgadniania musi być idempotentna: przetwarzanie tego samego identyfikatora wiadomości dwukrotnie nie powinno wywoływać żadnych efektów. Użyj unikalnego ograniczenia na identyfikatory wiadomości w swojej bazie danych lub sprawdź istnienie przed wstawieniem.

Obsłuż błąd 404, gdy historyId jest za stary

Jeśli podasz identyfikator historii `startHistoryId` starszy niż 7 dni, interfejs API zwróci kod 404. W takim przypadku należy zastosować mechanizm wycofywania (fallback) do Wiadomości.lista aby zsynchronizować od nowa, następnie zadzwoń użytkownicy.oglądaj ponownie, aby uzyskać świeżą podstawę dla historyId.

Striceuj wyniki history.list

Jeśli między Twoim ostatnim identyfikatorem historii a bieżącym momentem zaszło wiele zmian, odpowiedź `history.list` może być stronicowana. Zawsze postępuj zgodnie z tokenNastępnejStrony do wyczerpania przed aktualizacją zapamiętanego kursora.

Operacje

Strategia odnawiania subskrypcji: problem 7-dniowego terminu ważności

Ustawienie Gmail API typu "watch" wygasa po 7 dniach bez żadnego powiadomienia. Nie ma automatycznego odnowienia ani ostrzeżenia. Jeśli Twój cron ulegnie awarii, nowe wiadomości e-mail nadal przychodzą, ale Twoja aplikacja nic nie otrzymuje - bez żadnych błędów po obu stronach. To sprawia, że odnowienie jest kluczowym elementem operacyjnym każdej implementacji powiadomień push Gmail.

Odnowić codziennie, nie co 7 dni. Uruchamiaj automatyczne odnawianie co 24 godziny (nie co 6 lub 7 dni). Monitorowanie odnowienia jest idempotentne - wywołanie użytkownicy.oglądaj ponownie po prostu resetuje 7-dniowy licznik. Dzienna częstotliwość zapewnia 6-dniowy bufor bezpieczeństwa przed przejściowymi awariami.

odnowić-zegarki.js
// Daily cron: 0 3 * * * (runs at 3am daily) async function renewAllWatches() { // Get all authenticated users from your database const users = await db.getAllActiveUsers(); for (const user of users) { try { // Refresh the access token if needed const auth = await getAuthClient(user.id); const gmail = google.gmail({ version: 'v1', auth }); const res = await gmail.users.watch({ userId: 'me', requestBody: { topicName: 'projects/YOUR_PROJECT_ID/topics/gmail-notifications', labelIds: ['INBOX'] } }); // Update historyId baseline : new watch returns a fresh historyId await db.update(user.id, { lastHistoryId: res.data.historyId, watchExpiry: new Date(parseInt(res.data.expiration)) }); } catch (err) { if (err.code === 401) { // Refresh token revoked : user needs to re-authorize await db.markUserDisconnected(user.id); } else if (err.code === 404) { // Watch expired : call watch again (already doing this, so 404 = retry next run) console.warn(`Watch already expired for ${user.email}, will retry`); } else { // Log and continue : don't abort the entire cron for one user console.error(`Watch renewal failed for ${user.email}`, err); } } } }
Zsynchronizuj Gmail w czasie rzeczywistym za pomocą jednego webhooka

Unipile automatycznie obsługuje odnowienie zegarka w imieniu każdego uwierzytelnionego użytkownika. Nie potrzeba zadania cron.

Zbuduj to z Unipile
Rozwiązywanie problemów

Rozwiązywanie problemów z powiadomieniami push Gmail API

Oto cztery klasy błędów, które odpowiadają za prawie wszystkie błędy powiadomień push Gmail. Większość ma jedno podstawowe źródło, gdy już wiesz, czego szukać.

Błąd / Objaw Pierwotna przyczyna Naprawić Waga
403 na users.watch Konto usługi Gmail gmail-api-push@system.gserviceaccount.com nie przyznano roli wydawcy Pub/Sub dla tego tematu. W konsoli GCP: Pub/Sub > Tematy > Twój temat > Uprawnienia. Dodaj konto usługi z rolą Pub/Sub Publisher. Bloker
zegarek działa, ale powiadomienia nie docierają URL punktu końcowego wypychającego subskrypcji Pub/Sub nie jest zarejestrowany, odrzucony przez Google (nieprawidłowy TLS) lub typ subskrypcji wypychającej to "Pull" zamiast "Push". Zweryfikuj, czy Twoja subskrypcja jest typu "Push", a adres URL webhooka jest punktem końcowym. Upewnij się, że certyfikat TLS jest ważny (nie jest podpisany samodzielnie). Punkt końcowy testowy zwraca 200. Bloker
404 na history.list - historyId zbyt stare Twój magazyn ostatniIdHistorii jest starszy niż 7 dni. Gmail przechowuje historię tylko przez 7 dni. Cofnij się do Wiadomości.lista aby zsynchronizować ponownie. A następnie zadzwoń użytkownicy.oglądaj dla nowej historiiId jako podstawy. Do odzyskania
Token walidacji punktu końcowego skrótu odrzucony Google wysyła nagłówek X-Goog-Channel-Token. Jeśli punkt końcowy go zweryfikuje, a token się nie zgadza, zwraca wynik inny niż 2xx, a Pub/Sub ponawia próbę w nieskończoność. Wyłącz walidację tokenów podczas początkowej konfiguracji lub skonfiguruj tę samą wartość tokenu w ustawieniach subskrypcji GCP i w konfiguracji aplikacji. Do odzyskania
403 na users.watch
Brak IAM: gmail-api-push@system.gserviceaccount.com nie przyznano roli Pub/Sub Publisher.
Dodaj konto usługi jako Wydawcę w GCP Console > Pub/Sub > Tematy > Uprawnienia.
Zegarek działa, ale brak powiadomień
Subskrypcja jest typu Pull, lub adres URL punktu końcowego push jest nieprawidłowy/odrzucono TLS.
Ustaw typ subskrypcji na Push. Upewnij się, że punkt końcowy HTTPS ma ważny certyfikat TLS. Sprawdź odpowiedź 200.
404 HistoriaId jest za stara
Kursor jest starszy niż 7 dni.
Synchronizuj ponownie za pomocą messages.list, a następnie ponownie zarejestruj zegarek dla nowego historyId.
Token walidacyjny odrzucony
Niezgodność tokenów między konfiguracją subskrypcji Pub/Sub a konfiguracją aplikacji.
Dopasuj wartości tokenów w ustawieniach subskrypcji GCP i w kodzie aplikacji.
Limity

Limity i limity szybkości dla powiadomień push Gmail API

Powiadomienia push Gmail API mają specyficzne ograniczenia kwot, które różnią się od standardowych zasobników kwot Gmail API. Kluczowym ograniczeniem jest przepustowość zdarzeń na użytkownika.

1 zdarzenie/sek

Maksymalna częstotliwość powiadomień Pub/Sub na uwierzytelnionego użytkownika. Krótkoterminowe skoki mogą tymczasowo przekroczyć ten limit, ale są ograniczane w czasie. Jeśli skrzynka pocztowa otrzymuje więcej niż 1 zmianę na sekundę przez dłuższy czas, powiadomienia zostaną połączone w partie lub opóźnione, a nie odrzucone.

7 dni

Maksymalny termin wygaśnięcia zegarków. Wszystkie zegarki muszą zostać odnowione przed tym terminem. Gmail przechowuje historia.lista dane dla tego samego 7-dniowego okna - identyfikator historii starszy niż 7 dni zwraca 404.

1 milion sztuk/dzień

Domyślny dzienny limit Gmail API na projekt. użytkownicy.historia.lista połączenie kosztuje 5 jednostek. użytkownicy.oglądaj kosztuje 100 jednostek za połączenie. Dostosuj odpowiednio swój wolumen uzgodnień.

Aby uzyskać bardziej szczegółowe informacje na temat limitów na metodę, limitów na użytkownika i procedur ubiegania się o zwiększenie limitów, zobacz naszą stronę dedykowaną Limitowanie żądań i limity kwot dla Gmail API.

Porównanie

Kompromisy: Pub/Sub vs IMAP IDLE vs polling vs zunifikowane webhooki

Wybór odpowiedniej strategii powiadomień push w Gmailu zależy od ograniczeń infrastrukturalnych, potrzeb w zakresie zasięgu dostawcy i tolerancji operacyjnej. Oto bezpośrednie porównanie czterech podejść.

Podejście Opóźnienie Złożoność konfiguracji Wielu dostawców Narzut operacyjny
Monitorowanie Gmail Pub/Sub 1-10s Wysokie - GCP, IAM, cron Tylko Gmail 7-dniowe odnowienie cron
IMAP IDLE 1-30s Średnio - trwałe TCP gmail + serwery IMAP Zarządzanie połączeniem "keep-alive"
Sondaż 30-300s opóźnienia Niski Każdy dostawca Wysoki limit spalania
Ujednolicony webhook (Unipile) 1-10s Niski - 1 adres URL webhooka Gmail + Outlook + IMAP Nie dotyczy - zarządzany
Monitorowanie Gmail Pub/Sub
Opóźnienie1-10s
KonfiguracjaWysoka (GCP + IAM + cron)
DostawcyTylko Gmail
IMAP IDLE
Opóźnienie1-30s
KonfiguracjaŚrednie (trwałe TCP)
DostawcyGmail + IMAP
Sondaż
Opóźnienie30-300s opóźnienia
KonfiguracjaNiski
DostawcyJakikolwiek
Ujednolicony webhook (Unipile)
Opóźnienie1-10s
KonfiguracjaNiski (1 webhook)
DostawcyGmail + Outlook + IMAP
Zjednoczona Alternatywa

Zunifikowana Alternatywa dla Webhooków: Gmail + Outlook + IMAP z jednym endpointem

Jeśli potrzebujesz powiadomień push przez Gmail API plus zdarzeń w czasie rzeczywistym ze skrzynek pocztowych Outlook i IMAP – ze ujednoliconym formatem ładunku i bez infrastruktury GCP – Unipile's Gmail API abstrahuje całą warstwę Pub/Sub. Jako niezależny pośrednik techniczny, Unipile działa w imieniu każdego uwierzytelnionego użytkownika, dostarczając zdarzenia poczty e-mail za pośrednictwem jednego adresu URL webhooka, nad którym Twoja aplikacja już sprawuje kontrolę.

Brak konfiguracji GCP

Brak tematu Pub/Sub do utworzenia, brak uprawnień IAM do skonfigurowania, brak projektu GCP do utrzymania. Rejestracja i odnawianie obserwacji odbywa się w infrastrukturze Unipile, a nie Twojej.

Odnowienie zegarka jest zarządzane

7-dniowe wygaśnięcie zegarka jest obsługiwane w imieniu każdego połączonego konta. Nigdy nie potrzebujesz zadania cron do odnawiania. Jeśli token odświeżania zostanie unieważniony, Unipile zamiast cicho pomijać zdarzenia, wyświetla webhook stanu konta.

rekoncyliacja zidentyfikowanej historii abstrakcyjnej

Otrzymujesz sparsowany, znormalizowany obiekt wiadomości e-mail - nie surowy identyfikator historii. Nie ma potrzeby wywoływania użytkownicy.historia.lista albo zarządzać kursorami dla poszczególnych użytkowników. Unipile rozwiązuje deltę i dostarcza ustrukturyzowane dane wiadomości.

Gmail + Outlook + IMAP w jednej paczce

Ten sam punkt końcowy webhooka i ten sam schemat zdarzeń obejmują Gmail, Outlook (w tym Microsoft 365/Exchange Online) i IMAP. Brak logiki integracji specyficznej dla dostawcy, brak oddzielnych webhooków dla subskrypcji Microsoft Graph w porównaniu do powiadomień publikuj/subskrybuj Gmaila.

unified-webhook.js
// 1. Połącz konto Gmail użytkownika (OAuth w imieniu uwierzytelnionego użytkownika) // Zobacz: https://developer.unipile.com/docs/getting-started // 2. Skonfiguruj swój webhook raz const konfiguracja = czekać fetch('https://api8.unipile.com:13815/api/v1/webhooks', { method: 'POST', nagłówki: { 'Klucz API X': 'TWÓJ_KLUCZ_API', 'Content-Type': 'application/json' }, body: JSON.stringify({ adres url 'https://app.you.com/webhooks/email', wydarzenia: ['email.nowy'] }) }); // 3. Obsłuż ujednoliconą strukturę danych: taki sam kształt dla Gmail, Outlook, IMAP aplikacja.stanowisko('/webhooks/email', (req, res) => { const { zdarzenie, identyfikator_konta, adres_email } = req.body; // zdarzenie: "email.nowy" // email.provider: "gmail" | "outlook" | "imap" // temat_emaila, .od, .do, .html_treści... // Brak historyId. Brak base64. Brak kursora do zarządzania. przetwarzajEmailPrzychodzący(e-mail); rez.status(200).koniec(); });
Działa z kontami Gmail, Outlook i IMAP
Uwaga dotycząca przetwarzania danych

Unipile nie tworzy równoległego archiwum poczty e-mail ani nie przechowuje treści wiadomości niezależnie. Dostęp jest ograniczony do sesji każdego uwierzytelnionego użytkownika. Unipile pobiera dane poczty e-mail w imieniu każdego połączonego konta i dostarcza je do Twojego punktu końcowego webhook w czasie rzeczywistym. Żadne dane nie są przechowywane poza tym, co jest niezbędne do dostarczenia ładunku webhook.

Jak Działa Unipile

Unipile jest niezależnym pośrednikiem technicznym. Działa w imieniu każdego uwierzytelnionego użytkownika, który autoryzował aplikację za pomocą OAuth. Unipile nie jest powiązany, wspierany ani sponsorowany przez Google. Korzysta z tych samych punktów końcowych Gmail API opisanych w tym przewodniku, na użytkownika, w ramach autoryzacji OAuth danego użytkownika. Dane uwierzytelniające nigdy nie są udostępniane między kontami. Wszystkie operacje są decyzją po stronie klienta delegowaną do infrastruktury Unipile.

Ograniczenia platformy i odpowiedzialne korzystanie

Unipile przekazuje limity szybkości i ograniczenia kwotowe API Gmail do Twojej aplikacji poprzez własną warstwę zarządzania kwotami. Decyzje dotyczące liczby zdarzeń, częstotliwości odpytywania i obsługi wiadomości pozostają decyzją klienta. Unipile udostępnia błędy kwotowe API Gmail jako ustrukturyzowane zdarzenia webhook, dzięki czemu Twoja aplikacja może odpowiednio zareagować.

Zacznij tworzyć za pomocą ujednoliconych webhooków

Połącz swoje pierwsze konto Gmail w kilka minut. Bez projektu GCP. Bez rozliczeń Pub/Sub. Bez resetowania odnowienia przez cron. Zobacz nasze Przewodnik po integracji z Gmail API i Przegląd dostawców API e-mail aby poznać wszystkich obsługiwanych dostawców.

Zbuduj to z Unipile

Powiadomienia Push Gmail API - FAQ

Odpowiedzi na najczęstsze pytania dotyczące powiadomień push API Gmail, konfiguracji Pub/Sub, identyfikatora historycznego, odnawiania usługi "watch" oraz alternatyw dla synchronizacji wiadomości e-mail w czasie rzeczywistym.

Powiadomienia push w Gmail API Google Cloud Pub/Sub aby dostarczać zdarzenia zmiany skrzynki pocztowej w czasie rzeczywistym do Twojego webhooka HTTPS. Rejestrujesz punkt końcowy obserwacji za pośrednictwem użytkownicy.oglądaj, łącząca skrzynkę Gmail z należącym do Ciebie tematem Pub/Sub. Gdy wystąpi zmiana - nowa wiadomość, zmiana etykiety - Gmail publikuje powiadomienie w tym temacie, który przekazuje je do Twojego webhooka push. Twój webhook następnie wywołuje użytkownicy.historia.lista z zapisanym Identyfikator Historii kursor do pobrania faktycznej delty wiadomości. Sama powiadomienie Pub/Sub zawiera jedynie adres e-mail użytkownika i nowy identyfikator historii — brak treści wiadomości.

użytkownicy.oglądaj rejestruje subskrypcję powiadomień push dla skrzynki pocztowej Gmail i zwraca identyfikator historii jako bazę. Jest to punkt wejścia, który łączy Gmail z Twoim tematem Pub/Sub. użytkownicy.historia.lista endpoint uzgadniania, który wywołujesz po otrzymaniu powiadomienia push z Gmaila, aby uzyskać faktyczne zmiany (dodania, usunięcia wiadomości, zmiany etykiet), które nastąpiły od czasu ostatniego zapisanego kursora historyId. Watch mówi Gmailowi, gdzie wysyłać alerty. History mówi ci, co faktycznie się zmieniło.

kończą ważność po 7 dni. Najlepszą praktyką jest uruchomienie codzienny cron job zamiast co 6 lub 7 dni, zapewniając tym samym wielodniowy bufor przed przejściowymi awariami. Odnowienie zasobu jest idempotentne: nowe użytkownicy.oglądaj Wywołanie po prostu resetuje licznik i zwraca nowy identyfikator historii (historyId) jako punkt odniesienia. Wygasanie odbywa się bezszelestnie - nie ma powiadomienia ostrzegawczego, więc nieudane zadanie cron oznacza pominięte zdarzenia bez żadnych błędów po żadnej ze stron.

Najczęstszą przyczyną jest brak uprawnienia IAM. Gmail korzysta z konta usługi gmail-api-push@system.gserviceaccount.com aby opublikować w wątku Pub/Sub. Bez Wydawca Pub/Sub rola na Twój temat dla tego konta, użytkownicy.oglądaj powodzenia, ale żadne powiadomienia nigdy nie są dostarczane. Inne przyczyny: typ subskrypcji to "Pull" zamiast "Push", nieprawidłowy certyfikat TLS w punkcie końcowym webhooka lub punkt końcowy zwraca odpowiedzi inne niż 2xx, powodując zaprzestanie dostarczania przez Pub/Sub.

The Identyfikator Historii jest monotonicznie rosnącą liczbą całkowitą, którą Gmail przypisuje do każdego zdarzenia zmiany skrzynki pocztowej. Działa ona jako przyrostowy kursor synchronizacji. Kiedy rejestrujesz użytkownicy.oglądaj, Gmail zwraca identyfikator historii (historyId) jako punkt odniesienia reprezentujący bieżący stan. Kolejne powiadomienia push z Gmaila zawierają nowy identyfikator historii. Przekazujesz swój zapisany (poprzedni) identyfikator historii jako startIdHistorii do użytkownicy.historia.lista aby uzyskać wszystkie zmiany między dwoma punktami. Musisz przechowywać najnowszy identyfikator historii na uwierzytelnionego użytkownika w swojej bazie danych. Identyfikatory historii starsze niż 7 dni zwracają błąd 404.

Nie bezpośrednio przez Gmail API – Pub/Sub to wymagany kanał dostarczania dla powiadomień push Gmail. Możesz jednak całkowicie pominąć infrastrukturę GCP, korzystając z jednolitego API poczty e-mail, takiego jak Unipile, która działa jako niezależny pośrednik techniczny w imieniu każdego uwierzytelnionego użytkownika, abstrahuje warstwę Pub/Sub i dostarcza powiadomienia push z Gmaila do Twojego webhooka ze znormalizowanym ładunkiem. Nie jest wymagany żaden projekt GCP, żadne uprawnienie IAM ani odnawianie zadań cron.

Uruchom codzienny cron job że woła użytkownicy.oglądaj dla wszystkich aktywnych uwierzytelnionych użytkowników. Zapisz zwrócone historyId jako nową bazę i zaktualizuj zapisany znacznik czasu wygaśnięcia. Obsłuż błędy dla poszczególnych użytkowników bez przerywania zadania wsadowego: kod 401 oznacza, że token odświeżania OAuth został unieważniony (użytkownik musi ponownie autoryzować), kod 404 oznacza, że obserwacja już wygasła. Nigdy nie czekaj do 7-dniowego terminu wygaśnięcia, aby odnowić – traktuj codzienny bieg jako konserwację, a nie reaktywną poprawkę.

Powiadomienia push Gmail API są ograniczone do około 1 zdarzenie na sekundę na uwierzytelnionego użytkownika. Przebicia powyżej tego progu są grupowane lub opóźniane, nie odrzucane. użytkownicy.historia.lista połączenie kosztuje 5 jednostek kwoty i użytkownicy.oglądaj kosztuje 100 jednostek za wywołanie. Domyślny dzienny limit Google Workspace API wynosi 1 milion jednostek na projekt. Pełne zestawienie limitów dla poszczególnych metod i procedury zwiększania kwot można znaleźć w naszej dokumentacji. Przewodnik po limitach użycia Gmail API.

Potrzebujesz pomocy w skonfigurowaniu powiadomień push dla Gmail API w Twojej aplikacji? Nasz zespół może Ci w tym pomóc.

Porozmawiaj z ekspertem
pl_PLPL