คู่มือ · sendgrid api

ทีมผลิตภัณฑ์ควรใช้ SendGrid API อย่างปลอดภัยอย่างไร

ใช้ SendGrid API หลังบริการอีเมลฝั่งเซิร์ฟเวอร์ โดยใช้โดเมนผู้ส่งที่ผ่านการยืนยันตัวตนและ API key ที่จำกัดเฉพาะสิทธิ์ Mail Send ตรวจสอบทุกข้อความก่อนเรียก `POST /v3/mail/send` บันทึกเรคคอร์ดการส่งของคุณเอง และเก็บ `X-Message-ID` จากการตอบกลับ ประมวลผล payload ของ Event Webhook ที่ลงลายเซ็นจากไบต์ดิบ ตัดอีเวนต์ซ้ำ และเคารพอีเมลตีกลับ รายงานสแปม และการยกเลิกการรับ ถือว่า `202 Accepted` การส่งถึงเซิร์ฟเวอร์ผู้รับ และการเข้ากล่องจดหมาย เป็นสถานะที่แยกกัน โดยลองใหม่แบบมีขอบเขตเฉพาะความล้มเหลวชั่วคราวเท่านั้น

กำหนดงานส่งที่แคบและถูกต้อง

Mail Send API v3 ของ SendGrid เป็น endpoint ของผู้ให้บริการสำหรับอีเมลขาออก ไม่ใช่กล่องจดหมายผู้ใช้ทั่วไป ให้วางไว้หลังบริการของแอปพลิเคชันที่เชื่อถือได้หรือ queue worker และกำหนดว่าอีเวนต์ของผลิตภัณฑ์ใดสร้างข้อความได้ เช่น การยืนยันบัญชี ใบเสร็จ ประกาศด้านความปลอดภัย หรือการแจ้งเตือนที่ร้องขอ อย่าเปิดเผย key ของผู้ให้บริการต่อเบราว์เซอร์ ไคลเอนต์มือถือ เทมเพลต prompt หรือบันทึก แยกข้อความ transactional ออกจากแคมเปญที่ขึ้นกับความยินยอมในระดับโมเดลข้อมูล เพื่อให้ความคาดหวังของผู้รับ การจัดการการตั้งค่า และชื่อเสียงดำเนินการได้อย่างอิสระ ก่อนพัฒนา ให้ตัดสินใจว่าใครเป็นเจ้าของโดเมนผู้ส่ง ใครอนุมัติเทมเพลต สภาพแวดล้อมใดส่งออกภายนอกได้ และผู้รับรายใดอนุญาตในการพัฒนา ขอบเขตนี้กลายเป็นเส้นแบ่งสำหรับสิทธิ์ของ API key การตั้งค่าโดเมน บันทึกการตรวจสอบ การแจ้งเตือน และการตอบสนองต่อเหตุการณ์ผิดปกติ และทำให้ย้ายผู้ให้บริการได้ เพราะโค้ดผลิตภัณฑ์ขอการดำเนินการอีเมลที่ได้รับอนุมัติ แทนที่จะสร้างคำขอ SendGrid ตามอำเภอใจกระจายทั่วแอปพลิเคชัน

ยืนยันตัวตนโดเมนผู้ส่งเฉพาะ

ตั้งค่า SendGrid Domain Authentication สำหรับโดเมนหรือซับโดเมนตามวัตถุประสงค์ที่คุณควบคุม จากนั้นเผยแพร่เรคคอร์ด DNS ที่สร้างขึ้นสำหรับตัวตนนั้นอย่างตรงตัว และยืนยันใน SendGrid เอกสารของผู้ให้บริการระบุว่าซับโดเมนไม่สืบทอดตัวตนของโดเมนหลักที่ผ่านการยืนยันตัวตน จึงต้องยืนยันโดเมนที่ใช้จริงในที่อยู่ From ตรวจสอบเรคคอร์ด SPF และ DMARC ที่มีอยู่ก่อนเปลี่ยน DNS อย่าสร้างนโยบาย SPF ที่สองสำหรับชื่อโฮสต์เดียวกัน หรือแทนที่นโยบาย DMARC ที่มีอยู่ขององค์กรโดยไม่ได้รับอนุญาตจากเจ้าของ แยกทราฟฟิก transactional และโปรโมชันไว้บนตัวตนที่เลือกอย่างตั้งใจเมื่อกลุ่มผู้รับและความเสี่ยงต่างกัน ยืนยันที่อยู่ From ที่มองเห็น return path โดเมนลงลายเซ็น DKIM เส้นทางตอบกลับ และพฤติกรรมการทำแบรนด์ลิงก์ในข้อความทดสอบที่ได้รับ การยืนยันตัวตนกำหนดตัวตนที่ได้รับอนุญาตและสัญญาณ alignment แต่ไม่ได้กำหนดโฟลเดอร์สุดท้ายของระบบปลายทาง ให้เฝ้าติดตามอีเมลตีกลับ การร้องเรียน ความคาดหวังของผู้รับ และเนื้อหาต่อไปแม้การยืนยัน DNS สำเร็จแล้ว

ออก API key ที่มีสิทธิ์น้อยที่สุดต่อสภาพแวดล้อม

สร้าง Custom Access API key ที่มีเฉพาะสิทธิ์ที่ปริมาณงานต้องการ โดยปกติคือสิทธิ์ Mail Send สำหรับ worker ที่ส่ง อย่าให้ผู้ส่งตามปกติมี Full Access ต่อเทมเพลต การระงับการส่ง เพื่อนร่วมทีม สถิติ การตั้งค่า IP หรือการดูแลบัญชี ใช้ key แยกสำหรับ development, staging และ production โดยตั้งชื่อให้ระบุบริการเจ้าของและวัตถุประสงค์การหมุนเวียน SendGrid แสดง key ใหม่เพียงครั้งเดียว จึงควรวางลงใน secret manager ของสภาพแวดล้อมโดยตรง และอย่าคัดลอกลงระบบควบคุมซอร์สหรือเอกสารที่แชร์ ขณะรันไทม์ ให้อ่านจากการตั้งค่าที่มี secret รองรับ และส่งเฉพาะในเฮดเดอร์ `Authorization: Bearer` ผ่าน HTTPS ทดสอบการหมุนเวียน key เป็นลำดับการปฏิบัติงาน คือสร้าง key ทดแทนที่มีสิทธิ์แคบเทียบเท่ากัน deploy key ทดแทน ตรวจสอบทราฟฟิกแบบควบคุมที่สำเร็จ แล้วจึงเพิกถอน key เก่า ตั้งการแจ้งเตือนเมื่อได้รับการตอบกลับ 401 หรือ 403 ที่ไม่คาดคิด เพราะอาจบ่งบอกว่า key หายไป ข้อมูลรับรองถูกเพิกถอน สิทธิ์ไม่ตรงกัน หรือการเปลี่ยนแปลงการตั้งค่าที่ไม่ปลอดภัย

สร้างและบันทึกคำขอ Mail Send แต่ละรายการ

สร้างเรคคอร์ดขาออกภายในหนึ่งรายการก่อนติดต่อ SendGrid ให้มี event key ของแอปพลิเคชันที่คงที่ ผู้เช่า ตัวตนผู้ส่ง ผู้รับที่ได้รับอนุมัติ ประเภทข้อความ เวอร์ชันเทมเพลต และสถานะ สร้าง payload ของผู้ให้บริการจากเรคคอร์ดนั้นโดยใช้ `personalizations`, `from`, `subject` และส่วนเนื้อหาที่รองรับอย่างน้อยหนึ่งส่วนหรือ dynamic template ที่ได้รับอนุมัติ ตรวจสอบไวยากรณ์ที่อยู่ จำนวนผู้รับ ขนาดไฟล์แนบ ข้อมูลเทมเพลต และเฮดเดอร์กำหนดเองก่อนเรียกผ่านเครือข่าย ภาพรวม Mail Send ปัจจุบันของ SendGrid จำกัดขนาดคำขอรวมไฟล์แนบให้น้อยกว่า 30 MB และผู้รับรวมทั้ง To, Cc และ Bcc ไม่เกิน 1,000 คำขอที่เล็กและมีวัตถุประสงค์เฉพาะตรวจสอบและกู้คืนได้ง่ายกว่า เมื่อได้รับการตอบกลับ `202 Accepted` ให้เก็บเฮดเดอร์ `X-Message-ID` และแนบกับเรคคอร์ดขาออก อย่าใส่ข้อมูลส่วนบุคคลใน categories หรือ unique arguments SendGrid เตือนว่าค่าเหล่านั้นอาจถูกเก็บและดูได้นอกการคุ้มครองที่คาดไว้สำหรับเนื้อหาข้อความ

ยืนยันและประมวลผล Event Webhook

ตั้งค่า SendGrid Event Webhook บน endpoint HTTPS ที่เก็บเนื้อหาคำขอดิบได้ เปิดใช้การลงลายเซ็นเข้ารหัส OAuth 2.0 หรือทั้งสองอย่าง สำหรับการส่งที่ลงลายเซ็น ให้ตรวจสอบ timestamp และ `X-Twilio-Email-Event-Webhook-Signature` กับไบต์ดิบที่ตรงตัวก่อนแยกวิเคราะห์ JSON Twilio เตือนว่าการ serialize payload ใหม่อาจเปลี่ยนไบต์และทำให้การยืนยันเป็นโมฆะ ปฏิเสธอินพุตที่ไม่ผ่านการยืนยันตัวตน ใช้ขีดจำกัดขนาดคำขอที่สมเหตุสมผล และป้องกันการเล่นซ้ำตามนโยบาย timestamp ที่ทีมเลือก หลังการยืนยัน ให้ใส่คิวหรือจัดเก็บชุดอีเวนต์อย่างคงทนก่อนตอบสถานะสำเร็จ ตัดข้อมูลซ้ำด้วย `sg_event_id` จากนั้นเชื่อมโยง `sg_message_id` `X-Message-ID` ที่เก็บไว้ และค่าเชื่อมโยงภายในที่ไม่อ่อนไหว ทำให้การเปลี่ยนสถานะเป็นทิศทางเดียว เพื่อไม่ให้อีเวนต์ processed ที่ล่าช้าเขียนทับผล delivered หรือ bounce ที่เกิดทีหลัง เก็บอีเวนต์ต้นฉบับของผู้ให้บริการไว้ในที่จัดเก็บที่จำกัดสิทธิ์เพื่อแก้ไขปัญหา แต่ลดการเก็บรักษาที่อยู่ ข้อความตอบกลับ และข้อมูลการมีส่วนร่วมให้เหลือเท่าที่ผลิตภัณฑ์และนโยบายต้องการจริง

จำลองการยอมรับ การส่งถึง และการเข้ากล่องอย่างแม่นยำ

HTTP `202 Accepted` ของ SendGrid หมายความว่าคำขอได้รับการยอมรับและเข้าคิวเพื่อประมวลผล ไม่ได้บอกว่าปลายทางยอมรับข้อความ อีเวนต์ webhook `processed` หมายความว่า SendGrid ยอมรับข้อความและพยายามส่งได้ อีเวนต์ `delivered` หมายความว่า SendGrid รายงานว่าเมลเซิร์ฟเวอร์ผู้รับยอมรับ ซึ่งมักมาพร้อมการตอบกลับ SMTP นั่นก็ยังไม่พิสูจน์การเข้ากล่องจดหมาย เพราะระบบปลายทางอาจจัดหมวดหมู่เมลที่ยอมรับไปยังแท็บกล่องจดหมาย กักกัน โฟลเดอร์ขยะ หรือที่อื่น ให้แยกสถานะเหล่านี้ออกจากกันในที่จัดเก็บและอินเทอร์เฟซผู้ใช้ ได้แก่ requested, provider accepted, processed, deferred, receiving server accepted, bounced, dropped, complained หรือ suppressed หลีกเลี่ยงการแปลการตอบกลับ HTTP ที่ไม่ใช่ข้อผิดพลาดทุกรายการเป็น “ส่งถึงแล้ว” สัญญาณการมีส่วนร่วม เช่น การเปิด ก็ไม่ใช่หลักฐานการส่งถึง และอาจได้รับผลจากฟีเจอร์ปกป้องความเป็นส่วนตัว ชื่อสถานะที่แม่นยำทำให้การสืบสวนของซัพพอร์ต การลองใหม่ และการตัดสินใจด้านความสามารถในการส่งถึงปลอดภัยขึ้น

จัดประเภทความล้มเหลวก่อนลองใหม่

จัดการข้อผิดพลาดของผู้ให้บริการตามประเภท แทนการลองใหม่กับทุกการตอบกลับที่ไม่ใช่ 202 โดย 400 มักต้องแก้ payload ผู้ส่ง ข้อมูลเทมเพลต หรือเฮดเดอร์ที่สงวนไว้ 401 ชี้ไปที่การยืนยันตัวตน 403 อาจบ่งบอกสิทธิ์ไม่พอหรือนโยบายบัญชี และ 413 ต้องลดขนาดข้อความ SendGrid มีเอกสารเกี่ยวกับเฮดเดอร์ rate limit รายต่อ endpoint และตอบ 429 เมื่อโควตาในรอบรีเฟรชหมด จึงควรหน่วงจนถึงเวลารีเซ็ตและเพิ่ม jitter แทนการสร้างการลองใหม่ที่ซิงโครไนซ์กัน ลองใหม่กับ 5xx และความล้มเหลวของ transport ด้วย exponential backoff จำนวนครั้งที่จำกัด และการแจ้งเตือนการปฏิบัติงาน การหมดเวลาที่กำกวมต้องระวังเป็นพิเศษ เพราะผู้ให้บริการอาจยอมรับคำขอแล้วแม้ไคลเอนต์พลาดการตอบกลับ ให้คงเรคคอร์ดขาออกในสถานะไม่ทราบ มองหาอีเวนต์ที่เชื่อมโยง และกำหนดกฎการกระทบยอดที่ตั้งใจก่อนส่งซ้ำ API ของผู้ให้บริการไม่ได้ลบความจำเป็นในการป้องกันการซ้ำระดับผลิตภัณฑ์ อย่าลองใหม่กับอีเมลตีกลับถาวร ผู้รับที่ไม่ถูกต้อง การยกเลิกการรับ หรือปลายทางที่รายงานสแปมที่ทราบแล้ว ราวกับเป็นข้อผิดพลาดชั่วคราวของโครงสร้างพื้นฐาน

เคารพการระงับการส่งและการตัดสินใจของผู้รับ

รับอีเวนต์ bounce, dropped, spam-report, unsubscribe และ group-unsubscribe เข้าสู่โมเดลความปลอดภัยของผู้รับ SendGrid รองรับการระงับการส่งแบบโกลบอลและกลุ่มการยกเลิกการรับสำหรับข้อความคนละประเภท ให้เชื่อมโยงข้อความโปรโมชันหรือทางเลือกแต่ละรายการกับกลุ่มที่ถูกต้อง มีเส้นทางการตั้งค่าที่เข้าใจง่าย และหยุดการส่งเมื่อมีการระงับที่เกี่ยวข้อง อย่าใช้ตัวเลือกข้ามการระงับเป็นเทคนิคการส่งถึงตามปกติ ข้อความที่สำคัญต่อผลิตภัณฑ์อาจต้องมีนโยบายทางกฎหมายและการปฏิบัติงานที่จัดทำเอกสารแยกต่างหาก แต่นโยบายนั้นไม่ควรเขียนทับการเลือกเรื่องโปรโมชันของบุคคลหรือมาตรการป้องกันชื่อเสียงของผู้ให้บริการอย่างเงียบ ๆ ปกป้องเครื่องมือซัพพอร์ตที่ลบการระงับด้วยการอนุญาตที่เข้มงวด เหตุผลที่มองเห็นได้ และร่องรอยการตรวจสอบ ติดตามความล้มเหลวในการส่งแบบถาวรและชั่วคราวแยกกัน และทบทวนการเปิดใช้งานใหม่ด้วยมือก่อนการส่งครั้งถัดไป การควบคุมเหล่านี้ปกป้องผู้รับและลดความพยายามซ้ำไปยังปลายทางที่ปฏิเสธหรือไม่รับทราฟฟิกนั้นแล้ว และยังช่วยไม่ให้การส่ง transactional สืบทอดพฤติกรรมแคมเปญที่ไม่ปลอดภัย

ทดสอบวงจรทั้งหมดก่อนใช้ทราฟฟิกจริง

เริ่มด้วย SendGrid key ที่ไม่ใช่ระบบจริงและซับโดเมนที่ผ่านการยืนยันตัวตนแบบควบคุม ตรวจสอบ DNS แล้วส่งเวอร์ชันข้อความล้วนและ HTML ไปยังกล่องจดหมายที่ทีมเป็นเจ้าของ ยืนยันการตอบกลับ `202` และ `X-Message-ID` และตรวจสอบว่าอีเวนต์ webhook ที่ลงลายเซ็นเชื่อมโยงกับเรคคอร์ดขาออกภายในได้ ทดสอบเส้นทาง payload ไม่ถูกต้อง key ถูกเพิกถอน ไม่มีสิทธิ์ ไฟล์แนบใหญ่เกิน rate-limit deferred bounce dropped และอีเวนต์ซ้ำ โดยไม่ใช้ที่อยู่ลูกค้าจริง ยืนยันว่าการตรวจสอบ webhook ปฏิเสธเนื้อหาที่ถูกแก้ไข และ handler ตอบรับหลังบันทึกอย่างคงทนแล้วเท่านั้น ทดสอบการหมุนเวียน key การย้อนกลับเทมเพลต การบังคับใช้การระงับการส่ง และการหมดเวลาของไคลเอนต์ที่กำกวม เพิ่มแดชบอร์ดสำหรับคำขอที่ล้มเหลว ความล่าช้าของอีเวนต์ การ defer อีเมลตีกลับ รายงานสแปม และความล้มเหลวของลายเซ็น webhook โดยมีตัวระบุผู้เช่าและข้อความ แต่ไม่มีข้อมูลรับรองหรือเนื้อหาเต็ม สุดท้าย ให้ตรวจสอบเอกสารปัจจุบันของ SendGrid และขีดจำกัดของบัญชี ณ เวลาเปิดตัว เพราะสิทธิ์ตามแพ็กเกจ ฟีเจอร์ตาม region โควตา และนโยบายของผู้ให้บริการอาจเปลี่ยนแปลงโดยไม่ขึ้นกับโค้ดแอปพลิเคชัน

เปรียบเทียบการพึ่งพาเฉพาะผู้ให้บริการ

การเชื่อมต่อ SendGrid โดยตรงเหมาะสมเมื่อทีมตั้งใจพึ่งพาฟิลด์ request เทมเพลต การควบคุมบัญชี รูปแบบ webhook การระงับการส่ง และความรับผิดชอบด้านปฏิบัติการที่เฉพาะ SendGrid เอกสารสาธารณะของ SendHQ อธิบาย Email API ระดับเวิร์กสเปซพร้อมการส่งจากโดเมนที่ยืนยันแล้ว อีเมลขาเข้า เทมเพลตแบบโฮสต์ อีเวนต์การส่ง การระงับการส่ง และแดชบอร์ดเว็บ ก่อนย้ายระบบ ให้ตรวจทาน payload อีเวนต์ การควบคุมตัวตน การระงับการส่ง ข้อกำหนดภูมิภาค และตัวระบุผู้ให้บริการที่จัดเก็บไว้ของผู้ให้บริการทั้งสอง

คำถามที่พบบ่อย

SendGrid 202 Accepted หมายความว่าอีเมลส่งถึงแล้วหรือไม่

ไม่ หมายความเพียงว่า SendGrid ยอมรับคำขอ API เพื่อประมวลผล ใช้อีเวนต์ delivery ของ Event Webhook เพื่อดูว่าเซิร์ฟเวอร์ผู้รับยอมรับข้อความหรือไม่ และถือว่าการเข้ากล่องจดหมายเป็นผลลัพธ์แยกต่างหากที่การตอบกลับ API ไม่ได้ยืนยัน

key สำหรับส่งของ SendGrid ควรมีสิทธิ์อะไร

ใช้ Custom Access key ที่จำกัดเฉพาะความสามารถ Mail Send ที่ worker ต้องการ หลีกเลี่ยง Full Access สำหรับการส่งตามปกติ และใช้ key ที่จัดการด้วย secret แยกกันสำหรับ development, staging, production การดูแลระบบ และปริมาณงานอื่นที่มีอำนาจต่างกันอย่างมีนัยสำคัญ

ควรยืนยันลายเซ็น SendGrid Event Webhook อย่างไร

เก็บเนื้อหา HTTP ดิบที่ตรงตัว อ่านเฮดเดอร์ลายเซ็นและ timestamp ของ Twilio และยืนยันก่อนแยกวิเคราะห์ JSON หรือ serialize ใหม่ ใช้การป้องกันการเล่นซ้ำ ปฏิเสธเมื่อการยืนยันล้มเหลว จากนั้นจัดเก็บหรือใส่คิวชุดอีเวนต์อย่างคงทนก่อนตอบรับการส่ง

ผลิตภัณฑ์ควรลองใหม่ทุกคำขอ Mail Send ที่ล้มเหลวหรือไม่

ไม่ ให้แก้ข้อผิดพลาดด้าน payload การยืนยันตัวตน การอนุญาต ขนาด และผู้รับถาวร แทนการลองใหม่ หน่วงการตอบกลับ 429 จนถึงเวลารีเซ็ตตามเอกสาร ลองใหม่กับความล้มเหลวของเครือข่ายชั่วคราวและ 5xx ด้วย backoff แบบมีขอบเขต และกระทบยอดการหมดเวลาที่กำกวมก่อนส่งซ้ำ

ข้ามการระงับการส่งของ SendGrid สำหรับอีเมล transactional ได้หรือไม่

SendGrid มีตัวควบคุมสำหรับข้าม แต่ผลิตภัณฑ์ไม่ควรใช้เป็นประจำ ให้แยกประเภทข้อความ เคารพการยกเลิกการรับหรือการระงับที่เกี่ยวข้อง และกำหนดให้มีการอนุญาตที่จัดทำเอกสารและประวัติการตรวจสอบสำหรับการเปิดใช้งานใหม่ที่เป็นข้อยกเว้นหรือการตัดสินใจส่งตามนโยบายเฉพาะ

ทีมควรประเมินอะไรบ้างก่อนเปรียบเทียบ SendGrid และ SendHQ

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

แหล่งอ้างอิง