Mengelola Kotak Surat

Mengelola Rangkaian Pesan

Gmail API menggunakan Thread resource untuk mengelompokkan balasan email dengan pesan aslinya ke dalam satu percakapan atau rangkaian. Dengan begitu, Anda dapat mengambil semua pesan dalam percakapan, secara berurutan, sehingga lebih mudah mendapatkan konteks untuk suatu pesan atau menyaring hasil penelusuran.

Seperti pesan, rangkaian pesan juga dapat diberi label. Namun, tidak seperti pesan, rangkaian pesan tidak dapat dibuat, hanya dapat dihapus. Namun, pesan dapat disisipkan ke dalam rangkaian pesan.

Mengambil rangkaian pesan

Rangkaian pesan menyediakan cara sederhana untuk mengambil pesan dalam percakapan secara berurutan. Dengan mencantumkan serangkaian rangkaian pesan, Anda dapat memilih untuk mengelompokkan pesan menurut percakapan dan memberikan konteks tambahan. Anda dapat mengambil daftar rangkaian pesan menggunakan metode threads.list, atau mengambil rangkaian pesan tertentu dengan threads.get. Anda juga dapat memfilter rangkaian pesan menggunakan parameter kueri yang sama seperti untuk resource Message. Jika ada pesan dalam rangkaian pesan yang cocok dengan kueri, rangkaian pesan tersebut akan ditampilkan dalam hasil.

Contoh kode di bawah menunjukkan cara menggunakan kedua metode dalam contoh yang menampilkan rangkaian pesan yang paling aktif di kotak masuk Anda. Metode threads.list mengambil semua ID rangkaian pesan, lalu threads.get mengambil semua pesan di setiap rangkaian pesan. Untuk rangkaian pesan dengan 3 balasan atau lebih, kami mengekstrak baris Subject dan menampilkan baris yang tidak kosong beserta jumlah pesan dalam rangkaian pesan. Anda juga akan menemukan contoh kode ini yang ditampilkan dalam video DevByte yang sesuai.

import google.auth
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError


def show_chatty_threads():
  """Display threads with long conversations(>= 3 messages)
  Return: None

  Load pre-authorized user credentials from the environment.
  TODO(developer) - See https://developers.google.com/identity
  for guides on implementing OAuth2 for the application.
  """
  creds, _ = google.auth.default()

  try:
    # create gmail api client
    service = build("gmail", "v1", credentials=creds)

    # pylint: disable=maybe-no-member
    # pylint: disable:R1710
    threads = (
        service.users().threads().list(userId="me").execute().get("threads", [])
    )
    for thread in threads:
      tdata = (
          service.users().threads().get(userId="me", id=thread["id"]).execute()
      )
      nmsgs = len(tdata["messages"])

      # skip if <3 msgs in thread
      if nmsgs > 2:
        msg = tdata["messages"][0]["payload"]
        subject = ""
        for header in msg["headers"]:
          if header["name"] == "Subject":
            subject = header["value"]
            break
        if subject:  # skip if no Subject line
          print(f"- {subject}, {nmsgs}")
    return threads

  except HttpError as error:
    print(f"An error occurred: {error}")


if __name__ == "__main__":
  show_chatty_threads()

Menambahkan draf dan pesan ke rangkaian pesan

Jika Anda mengirim atau memigrasikan pesan yang merupakan respons terhadap email lain atau bagian dari percakapan, aplikasi Anda harus menambahkan pesan tersebut ke rangkaian pesan terkait. Hal ini memudahkan pengguna Gmail yang berpartisipasi dalam percakapan untuk menjaga pesan tetap dalam konteks.

Draf dapat ditambahkan ke rangkaian pesan sebagai bagian dari pembuatan, pembaruan, atau pengiriman pesan draf. Anda juga dapat menambahkan pesan ke rangkaian pesan sebagai bagian dari menyisipkan atau mengirim pesan.

Draf dapat ditambahkan ke rangkaian pesan sebagai bagian dari pembuatan, pembaruan, atau pengiriman pesan draf. Anda juga dapat menambahkan pesan ke rangkaian pesan sebagai bagian dari menyisipkan atau mengirim pesan.

Agar menjadi bagian dari rangkaian pesan, pesan atau draf harus memenuhi kriteria berikut:

  1. threadId yang diminta harus ditentukan pada Message atau Draft.Message yang Anda berikan bersama permintaan Anda.

  2. Header References dan In-Reply-To harus ditetapkan sesuai dengan standar RFC 2822.

  3. Header Subject harus cocok.

Lihat contoh membuat draf atau mengirim pesan. Dalam kedua kasus tersebut, Anda cukup menambahkan kunci threadId yang dipasangkan dengan ID thread ke metadata pesan, yaitu objek message.

Label

Anda dapat menggunakan label untuk memberi tag, mengatur, dan mengategorikan pesan dan rangkaian pesan di Gmail. Label memiliki hubungan many-to-many dengan pesan dan rangkaian pesan: Anda dapat menerapkan beberapa label ke satu pesan atau rangkaian pesan dan menerapkan satu label ke beberapa pesan atau rangkaian pesan.

Untuk mengetahui informasi tentang cara membuat, mendapatkan, mencantumkan, memperbarui, atau menghapus label, lihat Referensi label.

Untuk mengelola label, Anda harus menggunakan cakupan https://www.googleapis.com/auth/gmail.labels. Untuk mengetahui informasi selengkapnya tentang cakupan, lihat Informasi otorisasi dan autentikasi khusus Gmail API.

Jenis label

Label tersedia dalam dua jenis: label SYSTEM yang dipesan dan label USER kustom. Label sistem biasanya sesuai dengan elemen yang telah ditentukan sebelumnya di antarmuka web Gmail seperti kotak masuk. Nama label sistem sudah dicadangkan; tidak ada label USER yang dapat dibuat dengan nama yang sama dengan label SYSTEM. Tabel berikut mencantumkan beberapa label sistem Gmail yang paling umum:

Nama

Dapat diterapkan secara manual

Catatan

INBOX

ya

SPAM

ya

TRASH

ya

UNREAD

ya

STARRED

ya

IMPORTANT

ya

SENT

tidak

Diterapkan secara otomatis ke pesan yang dikirim dengan drafts.send atau messages.send, disisipkan dengan messages.insert dan email pengguna di header From, atau dikirim oleh pengguna melalui antarmuka web.

DRAFT

tidak

Diterapkan secara otomatis ke semua pesan draft yang dibuat dengan Gmail API atau antarmuka Gmail.

CATEGORY_PERSONAL

ya

Sesuai dengan pesan yang ditampilkan di tab Personal pada antarmuka Gmail.

CATEGORY_SOCIAL

ya

Sesuai dengan pesan yang ditampilkan di tab Sosial pada antarmuka Gmail.

CATEGORY_PROMOTIONS

ya

Sesuai dengan pesan yang ditampilkan di tab Promosi antarmuka Gmail.

CATEGORY_UPDATES

ya

Sesuai dengan pesan yang ditampilkan di tab Pembaruan pada antarmuka Gmail.

CATEGORY_FORUMS

ya

Sesuai dengan pesan yang ditampilkan di tab Forum pada antarmuka Gmail.

Catatan

Daftar di atas tidak lengkap dan ada nama label yang dicadangkan lainnya. Mencoba membuat label kustom dengan nama yang bertentangan dengan nama yang dicadangkan akan menghasilkan error HTTP 400 - Invalid label name.

Mengelola label pada pesan & rangkaian pesan

Label hanya ada pada pesan. Misalnya, jika Anda mencantumkan label pada rangkaian pesan, Anda akan mendapatkan daftar label yang ada pada pesan apa pun dalam rangkaian pesan tersebut. Label mungkin tidak ada di setiap pesan dalam rangkaian pesan. Anda dapat menerapkan beberapa label ke pesan, tetapi Anda tidak dapat menerapkan label ke pesan draf.

Menambahkan atau menghapus label ke rangkaian pesan

Saat Anda menambahkan atau menghapus label ke rangkaian pesan, Anda menambahkan atau menghapus label yang ditentukan pada semua pesan yang ada dalam rangkaian pesan.

Jika pesan ditambahkan ke rangkaian pesan setelah Anda menambahkan label, pesan baru tidak mewarisi label yang ada yang terkait dengan rangkaian pesan. Untuk menambahkan label ke pesan tersebut, tambahkan label ke rangkaian pesan lagi.

Untuk menambahkan atau menghapus label yang terkait dengan rangkaian pesan, gunakan threads.modify.

Menambahkan atau menghapus label ke pesan

Saat Anda menambahkan label ke pesan, label tersebut akan ditambahkan ke pesan tersebut dan dikaitkan dengan rangkaian pesan yang berisi pesan tersebut. Label tidak ditambahkan ke pesan lain dalam rangkaian pesan.

Jika Anda menghapus label dari pesan dan pesan tersebut adalah satu-satunya pesan dalam rangkaian pesan yang memiliki label tersebut, label juga akan dihapus dari rangkaian pesan.

Untuk menambahkan atau menghapus label yang diterapkan ke pesan, gunakan messages.modify.

Menelusuri Pesan

Anda dapat menelusuri atau memfilter file menggunakan metode messages.list dan threads.list. Metode ini menerima parameter q yang mendukung sebagian besar sintaksis penelusuran lanjutan yang sama dengan antarmuka web Gmail. Untuk mengetahui daftar perbedaan penelusuran dan filter antara UI Gmail dan Gmail API, lihat Perbedaan filter penelusuran: UI Gmail versus Gmail API.

Sintaksis lanjutan ini memungkinkan Anda menggunakan kueri penelusuran untuk memfilter pesan berdasarkan properti seperti pengirim, tanggal, atau label untuk menyebutkan beberapa kemungkinan. Misalnya, kueri berikut mengambil semua pesan yang dikirim oleh pengguna pada Januari 2014:

GET https://www.googleapis.com/gmail/v1/users/me/messages?q=in:sent after:2014/01/01 before:2014/02/01

Peringatan

Semua tanggal yang digunakan dalam kueri penelusuran ditafsirkan sebagai tengah malam pada tanggal tersebut dalam zona waktu PST. Untuk menentukan tanggal yang akurat untuk zona waktu lain, teruskan nilai dalam detik:

?q=in:sent after:1388552400 before:1391230800

Selain kueri penelusuran, Anda juga dapat memfilter pesan dan rangkaian pesan menurut label dengan parameter labelIds. Dengan demikian, Anda dapat menelusuri pesan dan rangkaian pesan dengan label sistem atau pengguna tertentu yang diterapkan. Untuk informasi selengkapnya, lihat referensi metode messages.list atau threads.list.

Perbedaan penelusuran dan pemfilteran: UI Gmail versus Gmail API

  • UI Gmail melakukan perluasan alias yang memungkinkannya menyimpulkan alias akun dari akun Google Workspace. Misalnya, Anda memiliki akun myprimary@mycompany.net dan admin Anda menyiapkan alias untuk akun tersebut, yaitu myalias@mycompany.net. Jika myalias@mycompany.net mengirim email, tetapi Anda menelusuri "from: myprimary@mycompany.net)", email yang dikirim oleh myalias@mycompany.net akan muncul sebagai hasil penelusuran di UI Gmail, tetapi tidak di respons API.

  • UI Gmail memungkinkan pengguna melakukan penelusuran di seluruh rangkaian pesan, tetapi API tidak memungkinkannya.

Membuat daftar pesan

Halaman ini menjelaskan cara memanggil metode users.messages.list Gmail API.

Metode ini menampilkan array resource Gmail Message yang berisi id dan threadId pesan. Untuk mengambil detail pesan lengkap, gunakan metode users.messages.get.

Prasyarat

Project Google Cloud dengan Gmail API yang diaktifkan. Untuk melihat langkah-langkahnya, selesaikan Panduan memulai cepat Gmail API Python.

Mencantumkan pesan

Metode users.messages.list mendukung beberapa parameter kueri untuk memfilter pesan:

  • maxResults: Jumlah maksimum pesan yang akan ditampilkan (defaultnya 100, maksimum 500).

  • pageToken: Token untuk mengambil halaman hasil tertentu.

  • q: String kueri untuk memfilter pesan, seperti from:someuser@example.com is:unread".

  • labelIds: Hanya menampilkan pesan dengan label yang cocok dengan semua ID label yang ditentukan.

  • includeSpamTrash: Menyertakan pesan dari SPAM dan TRASH dalam hasil.

Contoh kode berikut menunjukkan cara mencantumkan pesan untuk pengguna Gmail yang diautentikasi. Kode menangani penomoran halaman untuk mengambil semua pesan yang cocok dengan kueri.

import os.path
from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError

# If modifying these scopes, delete the file token.json.
SCOPES = ["https://www.googleapis.com/auth/gmail.readonly"]


def main():
    """Shows basic usage of the Gmail API.
    Lists the user's Gmail messages.
    """
    creds = None
    # The file token.json stores the user's access and refresh tokens, and is
    # created automatically when the authorization flow completes for the first
    # time.
    if os.path.exists("token.json"):
        creds = Credentials.from_authorized_user_file("token.json", SCOPES)
    # If there are no (valid) credentials available, let the user log in.
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file("credentials.json", SCOPES)
            creds = flow.run_local_server(port=0)
        # Save the credentials for the next run
        with open("token.json", "w") as token:
            token.write(creds.to_json())

    try:
        # Call the Gmail API
        service = build("gmail", "v1", credentials=creds)
        results = (
            service.users().messages().list(userId="me", labelIds=["INBOX"]).execute()
        )
        messages = results.get("messages", [])

        if not messages:
            print("No messages found.")
            return

        print("Messages:")
        for message in messages:
            print(f'Message ID: {message["id"]}')
            msg = (
                service.users().messages().get(userId="me", id=message["id"]).execute()
            )
            print(f'  Subject: {msg["snippet"]}')

    except HttpError as error:
        # TODO(developer) - Handle errors from gmail API.
        print(f"An error occurred: {error}")


if __name__ == "__main__":
    main()

Metode users.messages.list menampilkan isi respons yang berisi berikut:

  • messages[]: Array resource Message.

  • nextPageToken: Untuk permintaan dengan beberapa halaman hasil, token yang dapat digunakan dengan panggilan berikutnya untuk mencantumkan lebih banyak pesan.

  • resultSizeEstimate: Estimasi jumlah total hasil.

Untuk mengambil konten dan metadata pesan lengkap, gunakan kolom message.id untuk memanggil metode users.messages.get.

Referensi terkait

Menyinkronkan klien email

Menjaga sinkronisasi klien dengan Gmail penting untuk sebagian besar skenario aplikasi. Ada dua skenario sinkronisasi secara keseluruhan: sinkronisasi penuh dan sinkronisasi sebagian. Sinkronisasi penuh diperlukan saat pertama kali klien Anda terhubung ke Gmail dan dalam beberapa skenario langka lainnya. Jika klien Anda baru saja disinkronkan, sinkronisasi parsial adalah alternatif yang lebih ringan daripada sinkronisasi penuh. Anda juga dapat menggunakan notifikasi push untuk memicu sinkronisasi parsial secara real-time dan hanya jika diperlukan, sehingga menghindari polling yang tidak perlu.

Sinkronisasi penuh

Saat aplikasi Anda terhubung ke Gmail untuk pertama kalinya, atau jika sinkronisasi parsial tidak tersedia, Anda harus melakukan sinkronisasi penuh. Dalam operasi sinkronisasi penuh, aplikasi Anda harus mengambil dan menyimpan sebanyak mungkin pesan atau rangkaian pesan terbaru yang diperlukan untuk tujuan Anda. Misalnya, jika aplikasi Anda menampilkan daftar pesan terbaru, sebaiknya ambil dan cache cukup banyak pesan untuk memungkinkan antarmuka yang responsif jika pengguna men-scroll melewati beberapa pesan pertama yang ditampilkan. Prosedur umum untuk melakukan operasi sinkronisasi penuh adalah sebagai berikut:

  1. Panggil messages.list untuk mengambil ID pesan halaman pertama.

  2. Buat permintaan batch dari permintaan messages.get untuk setiap pesan yang ditampilkan oleh permintaan daftar. Jika aplikasi Anda menampilkan isi pesan, Anda harus menggunakan format=FULL atau format=RAW saat pertama kali aplikasi Anda mengambil pesan dan menyimpan hasilnya dalam cache untuk menghindari operasi pengambilan tambahan. Jika mengambil pesan yang sebelumnya di-cache, Anda harus menggunakan format=MINIMAL untuk mengurangi ukuran respons karena hanya labelIds yang dapat berubah.

  3. Gabungkan pembaruan ke dalam hasil yang di-cache. Aplikasi Anda harus menyimpan historyId pesan terbaru (pesan pertama dalam respons list ) untuk sinkronisasi parsial di masa mendatang.

Tip

Anda juga dapat melakukan sinkronisasi menggunakan metode Threads resource yang setara. Hal ini mungkin menguntungkan jika aplikasi Anda terutama bekerja dengan thread atau hanya memerlukan metadata pesan.

Sinkronisasi sebagian

Jika aplikasi Anda baru-baru ini disinkronkan, Anda dapat melakukan sinkronisasi sebagian menggunakan metode history.list untuk menampilkan semua catatan histori yang lebih baru dari startHistoryId yang Anda tentukan dalam permintaan Anda. Catatan histori memberikan ID pesan dan jenis perubahan untuk setiap pesan, seperti pesan ditambahkan, dihapus, atau label diubah sejak waktu startHistoryId. Anda dapat memperoleh dan menyimpan historyId pesan terbaru dari sinkronisasi penuh atau sebagian untuk diberikan sebagai startHistoryId untuk operasi sinkronisasi sebagian di masa mendatang.

Batasan

Catatan histori biasanya tersedia setidaknya selama satu minggu dan sering kali lebih lama. Namun, jangka waktu ketersediaan data mungkin jauh lebih singkat dan data terkadang tidak tersedia dalam kasus yang jarang terjadi. Jika startHistoryId yang diberikan oleh klien Anda berada di luar rentang data historis yang tersedia, API akan menampilkan respons error HTTP 404. Dalam hal ini, klien Anda harus melakukan sinkronisasi penuh seperti yang dijelaskan di bagian sebelumnya.

Notifikasi push

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

Catatan

Agar notifikasi dapat dikirim ke perangkat milik pengguna (yaitu aplikasi yang diinstal, perangkat seluler, atau browser), panduan sinkronisasi berbasis polling masih merupakan pendekatan yang direkomendasikan untuk mengambil update.

Penyiapan Awal Cloud Pub/Sub

Gmail API menggunakan Cloud Pub/Sub API untuk mengirimkan notifikasi push. Hal ini memungkinkan notifikasi melalui berbagai metode, termasuk webhook dan polling di satu endpoint langganan.

Prasyarat

Untuk menyelesaikan penyiapan ini, pastikan Anda memenuhi Prasyarat Cloud Pub/Sub, lalu menyiapkan klien Cloud Pub/Sub.

Membuat topik

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

Membuat langganan

Ikuti Panduan Pelanggan Cloud Pub/Sub untuk menyiapkan langganan ke topik yang Anda buat. Konfigurasi jenis langganan menjadi webhook push (yaitu callback HTTP POST) atau pull (yaitu dimulai oleh aplikasi Anda). Dengan cara ini, aplikasi Anda akan menerima notifikasi untuk pembaruan.

Memberikan hak publikasi atas topik Anda

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

Untuk melakukannya, Anda harus memberikan hak istimewa publish ke gmail-api-push@system.gserviceaccount.com. Anda dapat melakukannya menggunakan antarmuka izin Konsol Developer Cloud Pub/Sub dengan mengikuti petunjuk kontrol akses tingkat resource.

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

Mendapatkan info terbaru kotak surat Gmail

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

Permintaan tonton

Untuk mengonfigurasi akun Gmail agar mengirim notifikasi ke topik Cloud Pub/Sub Anda, cukup gunakan klien Gmail API untuk memanggil watch di kotak surat pengguna Gmail seperti panggilan Gmail API lainnya. Untuk melakukannya, berikan nama topik yang dibuat di atas dan opsi lainnya dalam permintaan watch Anda, seperti labels untuk memfilter. Misalnya, agar diberi tahu setiap kali ada perubahan pada Kotak Masuk:

POST "https://www.googleapis.com/gmail/v1/users/me/watch"
Content-type: application/json

{
  topicName: "projects/myproject/topics/mytopic",
  labelIds: ["INBOX"],
  labelFilterBehavior: "INCLUDE",
}
request = {
  'labelIds': ['INBOX'],
  'topicName': 'projects/myproject/topics/mytopic',
  'labelFilterBehavior': 'INCLUDE'
}
gmail.users().watch(userId='me', body=request).execute()

Menonton respons

Jika permintaan watch berhasil, Anda akan menerima respons seperti:

{
  historyId: 1234567890
  expiration: 1431990098200
}

dengan kotak surat historyId saat ini untuk pengguna. Semua perubahan setelah itu historyId akan diberi tahu kepada klien Anda. Jika Anda perlu memproses perubahan sebelum historyId ini, lihat panduan sinkronisasi.

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, yang 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 terkait masalah topik dan langganan.

Memperpanjang masa berlaku smartwatch kotak surat

Anda harus memanggil ulang watch setidaknya setiap 7 hari atau Anda akan berhenti menerima pembaruan untuk pengguna. Sebaiknya panggil watch sekali per hari. Respons watch juga memiliki kolom masa berlaku dengan stempel waktu untuk masa berlaku watch.

Menerima notifikasi

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

Jika Anda telah 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 tersebut 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"}

Anda kemudian dapat menggunakan history.list untuk mendapatkan detail perubahan pengguna sejak last known historyId-nya, sesuai dengan panduan sinkronisasi.

Misalnya, untuk menggunakan history.list guna mengidentifikasi perubahan yang terjadi antara panggilan watch awal dan penerimaan pesan notifikasi yang dibagikan dalam contoh sebelumnya, teruskan 1234567890 sebagai startHistoryId ke history.list. Setelah itu, 9876543210 dapat dipertahankan sebagai historyId terakhir yang diketahui untuk kasus penggunaan mendatang.

Jika Anda telah mengonfigurasi langganan pull, lihat contoh kode di Panduan Pull Pelanggan Cloud Pub/Sub untuk mengetahui detail selengkapnya tentang cara menerima pesan.

Merespons notifikasi

Semua notifikasi harus dikonfirmasi. Jika Anda menggunakan pengiriman push webhook, maka merespons dengan berhasil (misalnya, HTTP 200) akan mengonfirmasi notifikasi.

Jika menggunakan pengiriman pull (REST Pull, RPC Pull , atau RPC StreamingPull) , Anda harus menindaklanjutinya dengan panggilan konfirmasi (REST atau RPC). Lihat contoh kode dalam Panduan Pull Pelanggan Cloud Pub/Sub untuk mengetahui detail selengkapnya tentang cara mengonfirmasi pesan secara asinkron atau sinkron menggunakan library klien berbasis RPC resmi.

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