Mengonfigurasi notifikasi push dengan Gmail API

Dokumen ini menjelaskan cara mengelola notifikasi push dengan Gmail API.

Gmail API menyediakan notifikasi push server yang memungkinkan Anda memantau perubahan pada kotak surat Gmail. Gunakan fitur ini untuk meningkatkan performa aplikasi Anda. Hal ini menghilangkan biaya jaringan dan komputasi tambahan untuk melakukan polling resource guna menentukan apakah resource tersebut telah berubah. Setiap kali kotak surat berubah, Gmail API akan memberi tahu aplikasi server backend Anda.

Penyiapan awal Cloud Pub/Sub

Gmail API menggunakan Cloud Pub/Sub API untuk mengirimkan notifikasi push. Dengan begitu, Anda dapat menerima notifikasi menggunakan berbagai metode, termasuk webhook dan polling di satu endpoint langganan.

Prasyarat

Untuk menyelesaikan penyiapan ini, penuhi prasyarat Cloud Pub/Sub, lalu siapkan klien Cloud Pub/Sub.

Membuat topik

Dengan menggunakan klien Cloud Pub/Sub, buat topik yang akan digunakan Gmail API untuk mengirim notifikasi. Nama topik dapat berupa nama apa pun yang Anda pilih di project Anda (misalnya, cocok dengan projects/myproject/topics/*, dengan myproject adalah project ID yang tercantum untuk project Anda di konsol Google Cloud).

Membuat langganan

Untuk menyiapkan langganan ke topik yang Anda buat, ikuti panduan jenis langganan Cloud Pub/Sub. Konfigurasi jenis langganan menjadi webhook push (yaitu, callback HTTP POST) atau pull (yaitu, dimulai oleh aplikasi Anda). Berikut cara aplikasi Anda menerima notifikasi untuk update.

Memberikan hak publikasi atas topik Anda

Cloud Pub/Sub mengharuskan Anda memberikan hak istimewa kepada Gmail untuk memublikasikan notifikasi ke topik Anda.

Untuk melakukannya, berikan hak istimewa publish ke gmail-api-push@system.gserviceaccount.com. Anda dapat melakukannya menggunakan konsol izin Cloud Pub/Sub di konsol Google Cloud dengan mengikuti petunjuk kontrol akses ini.

Konfigurasi berbagi dengan batasan domain organisasi Anda mungkin mencegah Anda memberikan izin publikasi. Untuk mengatasi hal ini, Anda dapat mengonfigurasi pengecualian untuk akun layanan ini.

Mendapatkan info terbaru kotak surat Gmail

Setelah menyelesaikan penyiapan awal Cloud Pub/Sub, konfigurasikan akun Gmail untuk mengirim notifikasi pembaruan kotak surat.

Permintaan tonton

Untuk mengonfigurasi akun Gmail agar mengirim notifikasi ke topik Cloud Pub/Sub Anda, gunakan klien Gmail API Anda untuk memanggil metode watch di kotak surat pengguna Gmail. Hal ini serupa dengan panggilan Gmail API lainnya. Berikan nama topik yang Anda buat dan opsi lainnya dalam permintaan watch Anda, seperti labels untuk memfilter. Misalnya, gunakan permintaan berikut untuk mendapatkan notifikasi setiap kali ada perubahan di inbox:

Protokol

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

Tonton respons

Jika permintaan watch berhasil, Anda akan menerima respons seperti berikut:

{
  "historyId": "1234567890",
  "expiration": "1431990098200"
}

Respons berisi historyId kotak surat saat ini untuk pengguna. Klien Anda menerima notifikasi untuk semua perubahan setelah historyId. Jika Anda perlu memproses perubahan sebelum historyId ini, lihat Menyinkronkan klien dengan Gmail.

Selain itu, panggilan watch yang berhasil akan segera mengirimkan notifikasi ke topik Cloud Pub/Sub Anda.

Jika Anda menerima error dari panggilan watch, detailnya akan menjelaskan sumber masalah. Masalah ini biasanya terkait dengan penyiapan topik dan langganan Cloud Pub/Sub. Lihat dokumentasi Cloud Pub/Sub untuk mengonfirmasi bahwa penyiapan sudah benar dan untuk mendapatkan bantuan dalam men-debug masalah topik dan langganan.

Memperpanjang pemantauan kotak surat

Anda harus memanggil metode watch setidaknya sekali setiap 7 hari atau Anda akan berhenti menerima update untuk pengguna. Sebaiknya panggil watch sekali sehari. Respons metode watch juga memiliki kolom expiration dengan stempel waktu untuk masa berlaku watch.

Terima notifikasi

Setiap kali ada pembaruan kotak surat yang cocok dengan watch Anda, aplikasi Anda akan menerima pesan notifikasi yang menjelaskan perubahan tersebut.

Jika Anda mengonfigurasi langganan push, notifikasi webhook ke server Anda akan sesuai dengan 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"
}

Isi HTTP POST adalah JSON dan payload notifikasi Gmail yang sebenarnya ada di kolom message.data. Kolom message.data adalah string berenkode Base64URL yang didekode ke objek JSON yang berisi alamat email dan ID histori kotak surat baru untuk pengguna:

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

Kemudian, Anda dapat menggunakan metode history.list untuk mendapatkan detail perubahan pengguna sejak terakhir diketahui historyId, seperti yang dijelaskan dalam Menyinkronkan klien dengan Gmail.

Misalnya, gunakan metode history.list untuk mengidentifikasi perubahan yang terjadi antara permintaan watch awal Anda dan penerimaan pesan notifikasi yang dibagikan dalam contoh sebelumnya. Teruskan 1234567890 sebagai startHistoryId ke history.list. Setelah itu, Anda dapat mempertahankan 9876543210 sebagai terakhir diketahui historyId untuk kasus penggunaan mendatang.

Jika Anda mengonfigurasi langganan pull, lihat contoh kode dalam panduan langganan pull Cloud Pub/Sub untuk mengetahui detail selengkapnya tentang cara menerima pesan.

Menanggapi pemberitahuan

Anda harus mengonfirmasi semua notifikasi. Jika Anda menggunakan pengiriman push webhook, maka respons berhasil (misalnya, HTTP 200) akan mengonfirmasi notifikasi.

Jika Anda menggunakan pengambilan pengiriman (pengambilan REST, pengambilan RPC, atau pengambilan streaming RPC), Anda harus mengonfirmasi pesan menggunakan metode konfirmasi REST atau RPC. Lihat contoh kode dalam panduan pull subscriptions Cloud Pub/Sub untuk mengetahui detail selengkapnya tentang cara mengonfirmasi pesan secara asinkron atau sinkron menggunakan library klien berbasis RPC resmi.

Jika Anda tidak mengonfirmasi notifikasi (misalnya, jika callback webhook menampilkan error atau waktu tunggu habis), Cloud Pub/Sub akan mencoba lagi notifikasi di lain waktu.

Menghentikan pembaruan kotak surat

Untuk berhenti menerima update di kotak surat, panggil metode stop. Semua notifikasi baru akan berhenti dalam beberapa menit.

Batasan

Berikut adalah batasan saat menggunakan notifikasi push server:

Kecepatan notifikasi maksimum

Setiap pengguna Gmail yang dipantau memiliki kecepatan notifikasi maksimum satu peristiwa per detik. Layanan akan membatalkan notifikasi pengguna yang melebihi kecepatan tersebut. Saat menangani notifikasi, berhati-hatilah agar tidak memicu notifikasi lain, yang dapat memulai loop notifikasi.

Keandalan

Biasanya, Cloud Pub/Sub mengirimkan notifikasi dalam beberapa detik. Namun, dalam situasi tertentu, notifikasi mungkin tertunda atau tidak muncul. Tangani kemungkinan ini dengan baik sehingga aplikasi tetap disinkronkan meskipun aplikasi Anda tidak menerima pesan push. Misalnya, kembali ke pemanggilan metode history.list secara berkala setelah periode tanpa notifikasi untuk pengguna.

Batasan Cloud Pub/Sub

Cloud Pub/Sub API juga memiliki batasan sendiri, yang dijelaskan secara mendetail dalam dokumentasi harga dan kuota.