กำหนดค่าข้อความ Push ด้วย Gmail API

เอกสารนี้อธิบายวิธีจัดการการแจ้งเตือนแบบพุชด้วย Gmail API

Gmail API มีการแจ้งเตือนแบบพุชจากเซิร์ฟเวอร์ที่ช่วยให้คุณดูการเปลี่ยนแปลงในกล่องจดหมาย Gmail ได้ ใช้ฟีเจอร์นี้เพื่อปรับปรุงประสิทธิภาพของ แอปพลิเคชัน ซึ่งช่วยลดต้นทุนด้านเครือข่ายและการประมวลผลเพิ่มเติมของ การสำรวจทรัพยากรเพื่อดูว่ามีการเปลี่ยนแปลงหรือไม่ เมื่อใดก็ตามที่กล่องจดหมายมีการเปลี่ยนแปลง Gmail API จะแจ้งเตือนแอปพลิเคชันเซิร์ฟเวอร์แบ็กเอนด์ของคุณ

การตั้งค่า Cloud Pub/Sub เริ่มต้น

Gmail API ใช้ Cloud Pub/Sub API เพื่อส่งการแจ้งเตือนแบบพุช ซึ่งจะช่วยให้คุณได้รับการแจ้งเตือนโดยใช้วิธีต่างๆ รวมถึง Webhook และการสำรวจที่ปลายทางการสมัครใช้บริการเดียว

ข้อกำหนดเบื้องต้น

หากต้องการตั้งค่านี้ให้เสร็จสมบูรณ์ ให้ทำตามข้อกำหนดเบื้องต้นของ Cloud Pub/Sub แล้วตั้งค่าไคลเอ็นต์ Cloud Pub/Sub

สร้างหัวข้อ

ใช้ไคลเอ็นต์ Cloud Pub/Sub เพื่อสร้างหัวข้อที่ Gmail API ควรส่งการแจ้งเตือนไปให้ ชื่อหัวข้อจะเป็นชื่อใดก็ได้ ที่คุณเลือกภายใต้โปรเจ็กต์ (เช่น matching projects/myproject/topics/* โดยที่ myproject คือรหัสโปรเจ็กต์ที่แสดงสำหรับ โปรเจ็กต์ของคุณในคอนโซล Google Cloud)

สร้างการสมัครใช้บริการ

หากต้องการตั้งค่าการสมัครใช้บริการหัวข้อที่คุณสร้างขึ้น ให้ทำตามคำแนะนำประเภทการสมัครใช้บริการ Cloud Pub/Sub กำหนดค่าประเภทการสมัครใช้บริการให้เป็นแบบพุชของ Webhook (นั่นคือการเรียกกลับ HTTP POST) หรือแบบดึง (นั่นคือแอปของคุณเป็นผู้เริ่ม) แอปพลิเคชันของคุณจะได้รับการแจ้งเตือนเกี่ยวกับข้อมูลอัปเดตด้วยวิธีนี้

ให้สิทธิ์ในการเผยแพร่ในหัวข้อ

Cloud Pub/Sub กำหนดให้คุณต้องให้สิทธิ์แก่ Gmail ในการเผยแพร่ การแจ้งเตือนไปยังหัวข้อของคุณ

โดยให้สิทธิ์ publish แก่ gmail-api-push@system.gserviceaccount.com คุณทำได้โดยใช้คอนโซลสิทธิ์ Cloud Pub/Sub ใน คอนโซล Google Cloud โดยทำตามวิธีการควบคุมการเข้าถึงเหล่านี้

การกำหนดค่าการแชร์ที่จำกัดโดเมนขององค์กรอาจทำให้คุณไม่สามารถให้สิทธิ์เผยแพร่ได้ หากต้องการแก้ไขปัญหานี้ คุณสามารถกำหนดค่าข้อยกเว้นสำหรับบัญชีบริการนี้ได้

รับข้อมูลอัปเดตกล่องจดหมาย Gmail

หลังจากตั้งค่า Cloud Pub/Sub เริ่มต้นเสร็จแล้ว ให้กำหนดค่าบัญชี Gmail เพื่อส่งการแจ้งเตือนสำหรับการอัปเดตกล่องจดหมาย

คำขอรับชม

หากต้องการกำหนดค่าบัญชี Gmail ให้ส่งการแจ้งเตือนไปยังหัวข้อ Cloud Pub/Sub ให้ใช้ไคลเอ็นต์ Gmail API เพื่อเรียกใช้เมธอด watch ในกล่องจดหมายของผู้ใช้ Gmail ซึ่งคล้ายกับการเรียก Gmail API อื่นๆ ระบุชื่อหัวข้อที่สร้างขึ้นและตัวเลือกอื่นๆ ในคำขอ watch เช่น labels เพื่อกรอง เช่น ใช้คำขอต่อไปนี้เพื่อรับการแจ้งเตือนเมื่อมีการเปลี่ยนแปลงในกล่องจดหมาย

โปรโตคอล

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

ดูคำตอบ

หากคำขอ watch สำเร็จ คุณจะได้รับการตอบกลับดังต่อไปนี้

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

การตอบกลับมีกล่องจดหมาย historyId ปัจจุบันของผู้ใช้ ไคลเอ็นต์จะได้รับการแจ้งเตือนสำหรับการเปลี่ยนแปลงทั้งหมดหลังจากวันที่ historyId หากต้องการ ประมวลผลการเปลี่ยนแปลงก่อนhistoryId โปรดดู ซิงค์ไคลเอ็นต์กับ Gmail

นอกจากนี้ การเรียกใช้ watch ที่สำเร็จจะส่งการแจ้งเตือนไปยังหัวข้อ Cloud Pub/Sub ของคุณทันที

หากได้รับข้อผิดพลาดจากwatch รายละเอียดควรจะอธิบายถึง แหล่งที่มาของปัญหา โดยปกติแล้วปัญหานี้เกิดจากการตั้งค่าหัวข้อและการสมัครใช้บริการ Cloud Pub/Sub โปรดดูเอกสารประกอบของ Cloud Pub/Sub เพื่อยืนยันว่าการตั้งค่า ถูกต้อง และขอรับความช่วยเหลือในการแก้ไขข้อบกพร่องของปัญหาเกี่ยวกับหัวข้อและการสมัครใช้บริการ

ต่ออายุการดูกล่องจดหมาย

คุณต้องเรียกใช้เมธอด watch อย่างน้อย 1 ครั้งทุกๆ 7 วัน มิเช่นนั้นคุณจะไม่ได้รับการอัปเดตสำหรับผู้ใช้ เราขอแนะนำให้เรียกใช้ watch วันละครั้ง การตอบกลับของเมธอด watch ยังมีฟิลด์ expiration พร้อมการประทับเวลาสำหรับการหมดอายุของ watch ด้วย

รับการแจ้งเตือน

ทุกครั้งที่มีการอัปเดตกล่องจดหมายที่ตรงกับ watch แอปพลิเคชันของคุณ จะได้รับการแจ้งเตือนที่อธิบายการเปลี่ยนแปลง

หากกำหนดค่าการสมัครรับข้อมูลแบบพุช การแจ้งเตือนเว็บฮุคไปยังเซิร์ฟเวอร์ จะเป็นไปตาม 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"
}

เนื้อหาของ HTTP POST เป็น JSON และเพย์โหลดการแจ้งเตือน Gmail จริงจะอยู่ในฟิลด์ message.data ฟิลด์ message.data คือสตริงที่เข้ารหัส Base64URL ซึ่งถอดรหัสเป็นออบเจ็กต์ JSON ที่มีอีเมลและรหัสประวัติกล่องจดหมายใหม่สำหรับผู้ใช้

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

จากนั้นคุณจะใช้วิธี history.list เพื่อดูรายละเอียดการเปลี่ยนแปลงของผู้ใช้ได้ เนื่องจากข้อมูลล่าสุด historyIdของผู้ใช้ตามที่อธิบายไว้ใน ซิงค์ไคลเอ็นต์กับ Gmail

เช่น ใช้เมธอด history.list เพื่อระบุการเปลี่ยนแปลงที่เกิดขึ้นระหว่างคำขอ watch เริ่มต้นกับ การรับข้อความแจ้งเตือนที่แชร์ในตัวอย่างก่อนหน้า ส่ง 1234567890 เป็น startHistoryId ไปยัง history.list หลังจากนั้น คุณจะ บันทึก 9876543210 เป็น ล่าสุดที่ทราบ historyIdสําหรับกรณีการใช้งานในอนาคตได้

หากคุณกำหนดค่าการสมัครใช้บริการแบบดึงแทน โปรดดูรายละเอียดเพิ่มเติมเกี่ยวกับการรับข้อความในตัวอย่างโค้ดในคู่มือการสมัครใช้บริการแบบดึงของ Cloud Pub/Sub

ตอบสนองต่อการแจ้งเตือนต่างๆ

คุณต้องรับทราบการแจ้งเตือนทั้งหมด หากคุณใช้ push delivery ของ Webhook การตอบกลับ สำเร็จ (เช่น HTTP 200) จะเป็นการรับทราบการแจ้งเตือน

หากใช้การส่งแบบดึง (REST pull, RPC pull หรือ RPC streaming pull) คุณต้องรับทราบข้อความโดยใช้วิธีการรับทราบของ REST หรือ RPC ดูรายละเอียดเพิ่มเติมเกี่ยวกับการรับทราบข้อความแบบไม่พร้อมกันหรือแบบพร้อมกันโดยใช้ไลบรารีไคลเอ็นต์อย่างเป็นทางการที่อิงตาม RPC ได้ในตัวอย่างโค้ดในคู่มือการสมัครใช้บริการแบบดึงของ Cloud Pub/Sub

หากคุณไม่รับทราบการแจ้งเตือน (เช่น หาก Webhook Callback แสดงข้อผิดพลาดหรือหมดเวลา) Cloud Pub/Sub จะลองส่งการแจ้งเตือนอีกครั้ง ในภายหลัง

หยุดการอัปเดตกล่องจดหมาย

หากต้องการหยุดรับข้อมูลอัปเดตในกล่องจดหมาย ให้เรียกใช้เมธอด stop การแจ้งเตือนใหม่ทั้งหมด ควรหยุดทำงานภายในไม่กี่นาที

ข้อจำกัด

ข้อจำกัดในการทำงานกับข้อความพุชจากเซิร์ฟเวอร์มีดังนี้

อัตราการแจ้งเตือนสูงสุด

ผู้ใช้ Gmail แต่ละรายที่กำลังดูอยู่จะมีการแจ้งเตือนสูงสุด 1 เหตุการณ์ต่อวินาที บริการจะทิ้งการแจ้งเตือนของผู้ใช้ที่เกินอัตราดังกล่าว เมื่อจัดการการแจ้งเตือน โปรดระมัดระวังไม่ให้ทริกเกอร์การแจ้งเตือนอื่น ซึ่งอาจทำให้เกิดลูปการแจ้งเตือน

ความน่าเชื่อถือ

โดยปกติแล้ว Cloud Pub/Sub จะส่งการแจ้งเตือนภายในไม่กี่วินาที อย่างไรก็ตาม ในบางกรณีที่เกิดขึ้นไม่บ่อยนัก การแจ้งเตือนอาจล่าช้าหรือถูกทิ้ง จัดการความเป็นไปได้นี้อย่างเหมาะสมเพื่อให้แอปพลิเคชันยังคงซิงค์ได้แม้ว่าแอปของคุณจะไม่ได้รับข้อความพุชก็ตาม เช่น กลับไปเรียกใช้เมธอด history.list เป็นระยะๆ หลังจากที่ผู้ใช้ไม่ได้รับการแจ้งเตือนเป็นระยะเวลาหนึ่ง

ข้อจำกัดของ Cloud Pub/Sub

นอกจากนี้ Cloud Pub/Sub API ยังมีข้อจำกัดของตัวเอง ซึ่งมีรายละเอียดอยู่ในเอกสารประกอบราคาและโควต้า