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.