Configurare le notifiche push nell'API Gmail

Questo documento spiega come gestire le notifiche push nell'API Gmail.

L'API Gmail fornisce notifiche push del server che consentono di controllare le modifiche alle caselle di posta di Gmail. Utilizza questa funzionalità per migliorare il rendimento della tua applicazione. Elimina i costi di rete e di calcolo aggiuntivi delle risorse di polling per determinare se sono state modificate. Ogni volta che una casella di posta viene modificata, l'API Gmail invia una notifica all'applicazione del server di backend.

Configurazione iniziale di Cloud Pub/Sub

L'API Gmail utilizza l'API Cloud Pub/Sub per inviare notifiche push. Ciò consente di inviare notifiche utilizzando vari metodi, tra cui webhook e polling su un singolo endpoint di sottoscrizione.

Prerequisiti

Per completare questa configurazione, soddisfa i prerequisiti di Cloud Pub/Sub e poi configura un client Cloud Pub/Sub.

Crea un argomento

Utilizzando il client Cloud Pub/Sub, crea l' argomento a cui l' API Gmail deve inviare le notifiche. Il nome dell'argomento può essere qualsiasi nome tu scelga nel tuo progetto (ad esempio, corrispondente a projects/myproject/topics/*, dove myproject è l'ID progetto elencato per il tuo progetto nella console Google Cloud).

Crea una sottoscrizione

Per configurare una sottoscrizione all'argomento che hai creato, segui la guida al tipo di sottoscrizione Cloud Pub/Sub. Configura il tipo di sottoscrizione in modo che sia un push webhook (ovvero un callback HTTP POST) o un pull (ovvero avviato dalla tua app). In questo modo, la tua applicazione riceve notifiche per gli aggiornamenti.

Concedi i diritti di pubblicazione sull'argomento

Cloud Pub/Sub richiede che tu conceda a Gmail i privilegi per pubblicare le notifiche nel tuo argomento.

Per farlo, concedi i privilegi publish a gmail-api-push@system.gserviceaccount.com. Puoi farlo utilizzando la console delle autorizzazioni Cloud Pub/Sub nella console Google Cloud seguendo queste istruzioni per il controllo dell'accesso.

La configurazione di condivisione con limitazioni di dominio della tua organizzazione potrebbe impedirti di concedere le autorizzazioni di pubblicazione. Per risolvere il problema, puoi configurare un' eccezione per questo account di servizio.

Ricevi gli aggiornamenti della casella di posta di Gmail

Una volta completata la configurazione iniziale di Cloud Pub/Sub, configura gli account Gmail in modo che inviino notifiche per gli aggiornamenti della casella di posta.

Richiesta di monitoraggio

Per configurare gli account Gmail in modo che inviino notifiche all'argomento Cloud Pub/Sub, utilizza il client API Gmail per chiamare il watch metodo nella casella di posta dell'utente Gmail. È simile a qualsiasi altra chiamata API Gmail. Fornisci il nome dell'argomento che hai creato e qualsiasi altra opzione nella richiesta watch, ad esempio labels per filtrare. Ad esempio, utilizza la seguente richiesta per ricevere una notifica ogni volta che viene apportata una modifica alla posta in arrivo:

Protocollo

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

Risposta di monitoraggio

Se la richiesta watch ha esito positivo, riceverai una risposta simile alla seguente:

{ historyId: 1234567890 expiration: 1431990098200 }

La risposta contiene l'historyId della casella di posta corrente dell'utente. Il client riceve notifiche per tutte le modifiche successive a questo historyId. Se devi elaborare le modifiche precedenti a questo historyId, consulta Sincronizzare i client con l'API Gmail.

Inoltre, una chiamata watch riuscita fa sì che una notifica venga inviata immediatamente all'argomento Cloud Pub/Sub.

Se ricevi un errore dalla chiamata watch, i dettagli dovrebbero spiegare l'origine del problema. In genere, si tratta di un problema di configurazione dell'argomento e della sottoscrizione Cloud Pub/Sub. Consulta la documentazione di Cloud Pub/Sub per verificare che la configurazione sia corretta e per ricevere assistenza per il debug dei problemi relativi ad argomenti e sottoscrizioni.

Rinnova il monitoraggio della casella di posta

Devi chiamare watch almeno una volta ogni 7 giorni, altrimenti non riceverai più aggiornamenti per l'utente. Ti consigliamo di chiamare watch una volta al giorno. La risposta del metodo watch ha anche un expiration campo con il timestamp della scadenza di watch.

Ricevere notifiche

Ogni volta che si verifica un aggiornamento della casella di posta che corrisponde a watch, la tua applicazione riceve un messaggio di notifica che descrive la modifica.

Se hai configurato una sottoscrizione push, una notifica webhook al tuo server è conforme a 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"
}

Il corpo HTTP POST è JSON e il payload di notifica di Gmail effettivo si trova nel campo message.data. Il campo message.data è una stringa con codifica Base64URL che viene decodificata in un oggetto JSON contenente l'indirizzo email e il nuovo ID cronologia della casella di posta dell'utente:

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

Puoi quindi utilizzare il history.list metodo per ottenere i dettagli delle modifiche apportate dall'utente dall'ultimo conosciuto historyId, come descritto in Sincronizzare i client con l'API Gmail.

Ad esempio, utilizza il history.list metodo per identificare le modifiche apportate tra la richiesta watch iniziale e la ricezione del messaggio di notifica condiviso nell'esempio precedente. Trasmetti 1234567890 come startHistoryId a history.list. Dopodiché, puoi conservare 9876543210 come historyId più recente conosciuto per i casi d'uso futuri.

Se hai configurato una sottoscrizione pull, consulta gli esempi di codice nella guida alle sottoscrizioni pull di Cloud Pub/Sub per ulteriori dettagli sulla ricezione dei messaggi.

Risposta alle notifiche

Tutte le notifiche devono essere riconosciute. Se utilizzi la consegna push webhook, la risposta riuscita (ad esempio, HTTP 200) riconosce la notifica.

Se utilizzi la consegna pull (REST Pull, RPC Pull, o RPC StreamingPull), devi seguire una chiamata di riconoscimento (REST o RPC). Consulta gli esempi di codice nella guida alle sottoscrizioni pull di Cloud Pub/Sub per ulteriori dettagli sul riconoscimento dei messaggi in modo asincrono o sincrono utilizzando le librerie client ufficiali basate su RPC.

Se non riconosci le notifiche (ad esempio, se il callback webhook restituisce un errore o si verifica un timeout), Cloud Pub/Sub riprova a inviare la notifica in un secondo momento.

Interrompi gli aggiornamenti della casella di posta

Per interrompere la ricezione degli aggiornamenti di una casella di posta, chiama il stop metodo. Tutte le nuove notifiche dovrebbero essere interrotte entro pochi minuti.

Limitazioni

Di seguito sono riportate le limitazioni relative all'utilizzo delle notifiche push del server:

Frequenza massima delle notifiche

Ogni utente Gmail monitorato ha una frequenza massima di notifica di un evento al secondo. Le notifiche utente che superano questa frequenza vengono eliminate. Quando gestisci le notifiche, fai attenzione a non attivare un'altra notifica, che può avviare un loop di notifiche.

Affidabilità

In genere, tutte le notifiche vengono inviate in modo affidabile entro pochi secondi; tuttavia, in alcune situazioni estreme, le notifiche potrebbero subire ritardi o essere eliminate. Gestisci questa possibilità in modo che l'applicazione si sincronizzi anche se non vengono ricevuti messaggi push. Ad esempio, torna a chiamare periodicamente il history.list metodo dopo un periodo senza notifiche per un utente.

Limitazioni di Cloud Pub/Sub

Anche l'API Cloud Pub/Sub ha le sue limitazioni, descritte in dettaglio nella documentazione relativa a prezzi e quote.