Dokumen ini menjelaskan cara mengelola notifikasi push di 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. Fitur ini menghilangkan biaya jaringan dan komputasi tambahan untuk sumber daya polling guna menentukan apakah sumber daya 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 push notifikasi. Hal ini memungkinkan 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 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, yang 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 push webhook (yaitu, callback HTTP POST) atau pull (yaitu, dimulai oleh aplikasi Anda). Dengan cara ini, aplikasi Anda akan 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 yang dibatasi domain organisasi Anda mungkin mencegah Anda memberikan izin publikasi. Untuk mengatasinya, Anda dapat mengonfigurasi pengecualian untuk akun layanan ini.
Mendapatkan update kotak surat Gmail
Setelah penyiapan awal Cloud Pub/Sub selesai, konfigurasi akun Gmail untuk mengirim notifikasi update kotak surat.
Memantau permintaan
Untuk mengonfigurasi akun Gmail agar mengirim notifikasi ke topik Cloud
Pub/Sub Anda, gunakan klien Gmail API untuk memanggil metode
watch di kotak surat pengguna
Gmail. Hal ini mirip 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 perubahan dilakukan pada kotak masuk:
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()
Memantau 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 akan menerima notifikasi untuk semua perubahan setelah historyId tersebut. Jika Anda perlu me
mproses perubahan sebelum historyId, lihat Sinkronkan klien
dengan Gmail API.
Selain itu, panggilan watch yang berhasil akan menyebabkan notifikasi segera dikirim ke topik Cloud Pub/Sub Anda.
Jika Anda menerima error dari panggilan watch, detailnya akan menjelaskan sumber masalah. Hal ini biasanya merupakan masalah pada 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 watch
setidaknya sekali setiap 7 hari atau Anda akan berhenti menerima update untuk pengguna. Sebaiknya panggil watch sekali per hari. Respons metode watch juga memiliki kolom
expiration
dengan stempel waktu untuk masa berlaku watch.
Menerima notifikasi
Setiap kali update kotak surat terjadi yang cocok dengan watch, 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 sebenarnya ada di kolom message.data. Kolom message.data adalah string yang dienkode 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 bagi pengguna sejak terakhir yang diketahui
historyId, seperti yang dijelaskan dalam Sinkronkan klien dengan
Gmail API.
Misalnya, gunakan metode
history.list
untuk mengidentifikasi perubahan yang terjadi antara permintaan
watchawal Anda dan
penerimaan pesan notifikasi yang dibagikan dalam contoh sebelumnya. Teruskan 1234567890 sebagai startHistoryId ke history.list. Setelah itu, Anda dapat mempertahankan 9876543210 sebagai historyId terakhir yang diketahui untuk kasus penggunaan di masa mendatang.
Jika Anda mengonfigurasi langganan pull, lihat contoh kode di panduan langganan pull Cloud Pub/Sub untuk mengetahui detail selengkapnya tentang cara menerima pesan.
Menanggapi pemberitahuan
Semua notifikasi harus dikonfirmasi. Jika Anda menggunakan pengiriman push webhook, respons yang berhasil (misalnya, HTTP 200) akan mengonfirmasi notifikasi.
Jika Anda menggunakan pengiriman pull (REST Pull, RPC Pull, atau RPC StreamingPull), Anda harus menindaklanjuti dengan panggilan konfirmasi (REST atau RPC). Lihat contoh kode di panduan langganan pull 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 Anda menampilkan error atau waktu tunggu habis), Cloud Pub/Sub akan mencoba kembali notifikasi tersebut di lain waktu.
Menghentikan update 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:
Laju notifikasi maksimum
Setiap pengguna Gmail yang dipantau memiliki laju notifikasi maksimum satu peristiwa per detik. Notifikasi pengguna yang melebihi laju tersebut akan dihentikan. Saat menangani notifikasi, berhati-hatilah agar tidak memicu notifikasi lain, yang dapat memulai loop notifikasi.
Keandalan
Biasanya, semua notifikasi dikirimkan dengan andal dalam beberapa detik; namun, dalam beberapa situasi ekstrem, notifikasi mungkin tertunda atau dihentikan.
Tangani kemungkinan ini dengan baik sehingga aplikasi tetap disinkronkan meskipun tidak ada pesan push yang diterima. Misalnya, kembali ke panggilan secara berkala
history.list
metode setelah periode tanpa notifikasi untuk pengguna.
Batasan Cloud Pub/Sub
Cloud Pub/Sub API juga memiliki batasannya sendiri, yang dijelaskan dalam dokumentasi harga dan kuotanya.