Amazon SES คืออะไร? แนะนำฟังก์ชันของ AWS สำหรับผู้เริ่มต้นใช้งาน

บทความนี้เป็นการแนะนำฟังก์ชันของ AWS เกี่ยวกับ Amazon SES สำหรับผู้เริ่มต้นใช้งานโดยปฏิบัติจริงพร้อมอธิบายขั้นตอนการทำต่าง ๆ ครับ

บทความนี้ได้รับการแปลมาจากบทความภาษาญี่ปุ่นที่มีชื่อว่า AWS再入門ブログリレー Amazon SES編 โดยเจ้าของบทความนี้คือ คุณ Kitano Yuichi ซึ่งเป็นชาวญี่ปุ่น และในบทความนี้จะมีการปรับสำนวนการเขียน รวมถึงมีการเรียบเรียงเนื้อหาใหม่ให้เข้าใจง่ายและมีความเหมาะสมมากยิ่งขึ้น

สวัสดีครับ คิตาโนะครับ
พอเข้าหน้าฝนก็ไม่ได้ปั่นจักรยานมาทำงานเลยครับ

ในบล็อกนี้เราจะนำเหล่าสมาชิกที่โดยปกติแล้วเขียนแต่บล็อกเกี่ยวกับเนื้อหาล่าสุดของ AWS แบบละเอียดลงลึก กลับมาเขียนบล็อกอธิบายเนื้อหาพื้นฐานต่าง ๆ แบบเบสิกกันอีกครั้งครับ

โดยบทความนี้ก็ตามชื่อเลยครับ สำหรับผู้ที่ตั้งใจจะเรียนเกี่ยวกับ AWS รวมถึงผู้ที่ใช้งาน AWS อยู่แล้ว แต่อยากจะติดตามเนื้อหาหรืออัปเดตใหม่ ๆ ก็อยากจะให้อ่านบทความนี้ไปจนจบเลยครับ

ถ้าอย่างนั้นเราก็มาเริ่มกันเลยครับ โดยหัวข้อในครั้งนี้ คือ「Amazon SES」ครับ

ก่อนอื่น

Email
ทุกท่านที่กำลังท่องเว็บกันอยู่คงไม่มีใครไม่เคยใช้ใช่ไหมครับ
ซึ่งตอนนี้ Email ก็ได้ถูกละคำว่า E (Electronic) ออกไป และเรียกสั้น ๆ ว่า "Mail" จนติดปากกันไปแล้วครับ

โดยการใช้งานหลัก ๆ ก็จะเป็นไปตามที่ยกตัวอย่างด้านล่างนี้ครับ

  • News Letter (เช่น อีเมลสูตรอาหารสำหรับสมาชิกที่สั่งวัตถุดิบแบบส่งถึงบ้าน)
  • แจ้งเตือนการได้รับสินค้า (เช่น อีเมลยืนยันการสั่งซ์้อ)
  • แนะนำการท่องเที่ยว (เช่น อีเมลแนะนำตั๋วเครื่องบิน)
  • แจ้งเตือนเกี่ยวกับบัญชี (เช่น การ reset password)
  • การประกาศแจ้งต่าง ๆ ทางด้านกฎหมาย (เช่น การเปลี่ยนแปลง privacy policy)

ถึงจะเป็นอีเมลที่เราใช้งานกันเป็นเรื่องปกติ แต่การใช้งานตัว mail server นั้นไม่ใช่เรื่องง่ายเลยครับ

Amazon SES คือ

Amazon SES (Simple Email Service) เป็นบริการรับส่งอีเมลของทาง AWS รวมถึงเป็น managed service ด้วยครับ ซึ่งมีจุดเด่นดังต่อไปนี้

  • เป็นบริการรับส่งอีเมลที่มีประสิทธิภาพต่อต้นทุน (Cost Performance) สูงมาก
  • High reliability & Scalable
  • สามารถ trigger ให้บริการอื่น ๆ เช่น Lambda ทำงานได้เมื่อมีอีเมลเข้า

ความยากของการใช้งาน Email Server

เมื่อเราส่งอีเมลออกไป เราก็คาดหวังว่าอีเมลนั้นจะส่งไปถึงผู้รับใช่ไหมครับ แต่ว่าอีเมลที่เราส่งไปนั้นใช่ว่าจะส่งไปถึงผู้รับตามที่เราคาดไว้เสมอไปครับ

ไม่ว่าจะถูกจัดไปเป็น spam mail บ้าง, ถูกปฏิเสธโดย mail infrastructure ของฝั่งผู้รับบ้าง เราจึงจำเป็นจะต้องจัดการปัจจัยต่าง ๆ ด้านล่างนี้เพื่อเพิ่มโอกาสที่อีเมลของเราจะถูกส่งไปถึงผู้รับได้ครับ
โดย Amazon SES นั้น ปัจจัยต่าง ๆ เหล่านี้จะถูกจัดการแบบ Managed (AWS คอยดูแลระบบ infrastructure ให้) ครับ

Bounces

Bounces คือการที่อีเมลที่ทำการทดลองส่งไปนั้น เกิดติดปัญหาบางอย่างและถูกส่งกลับมาหาตัวผู้ส่งเองครับ

ตามหลัก best practice ของ Amazon SES นั้น ระบุเอาไว้ว่า「ควรรักษาระดับของ Bounces ไม่ให้เกิน 5%」ครับ

Best practices for sending email using Amazon SES | AWS

ทาง AWS Official ได้มีการรวบรวมคำถามที่พบบ่อยเกี่ยวกับ Amazon SES Bounces เอาไว้ที่ลิงก์นี้ครับ

Amazon SES frequently asked questions (FAQs) | Bounces

Complaints

ทางผู้รับอีเมลนั้น เมื่อเห็นว่าอีเมลที่ได้รับเป็น spam mail แล้วทำการคลิกปุ่ม「แจ้งสแปมเมล」ผ่านทาง Webmail Client การแจ้งสแปมเมลนั้นจะถูกบันทึกไว้เป็น Complaint และถ้าหาก Complaint มีจำนวนมาก ๆ เข้า ก็มีโอกาสสูงที่ทางฝ่ายผู้ส่งอีเมลนั้นจะถูกห้ามส่งอีเมล เนื่องจากถูกมองว่ากำลังส่ง spam mail อยู่ครับ

ใน Amazon SES นั้น หากมี Complaint rate สูง ก็มีโอกาสที่จะถูกห้ามส่งอีเมลด้วยครับ จุดนี้ต้องระมัดระวังกันให้ดีครับ

ตามหลัก best practice ของ Amazon SES นั้น ระบุเอาไว้ว่า「ควรรักษา complaint rate ให้ต่ำกว่า 0.1%」ครับ

Best practices for sending email using Amazon SES | AWS

ทาง AWS Official ได้มีการรวบรวมคำถามที่พบบ่อยเกี่ยวกับ Amazon SES Complaints เอาไว้ที่ลิงก์นี้ครับ

Amazon SES frequently asked questions (FAQs) | Complaints

วิธีการส่งอีเมลด้วย SES

วิธีการส่งอีเมลของ Amazon SES มีอยู่ 3 วิธีดังด้านล่างนี้ครับ

  • Management Console
  • Amazon SES API
  • SMTP Interface

ในครั้งนี้จะพูดถึงแค่วิธี「Management Console」กับ「Amazon SES API(AWS CLI)」เท่านั้นครับ

ส่วนวิธีอื่น ๆ นั้นสามารถดูรายละเอียดได้ตามเอกสารด้านล่างนี้เลยครับ

Set up email sending with Amazon SES

สำหรับวิธีใช้ SES จาก SMTP ดูรายละเอียดได้ที่ด้านล่างนี้ครับ

AWS: SES การตั้งค่า SMTP พื้นฐาน | DevelopersIO
วิธีการใช้ SES จาก PHP ผ่าน SMTP ใน EC2 | DevelopersIO

Region สำหรับ SES

Region ที่รองรับการส่งอีเมล

ดูรายละเอียดได้ที่ลิงก์ด้านล่างนี้

Amazon Simple Email Service endpoints and quotas

Region ที่รองรับการรับอีเมล

ดูรายละเอียดได้ที่ลิงก์ด้านล่างนี้

Email receiving

เลือก Region

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

ครั้งนี้ผมจะใช้รี้เจี้ยน Singapore ด้วยเหตุผลดังนี้

  • รีเจี้ยน Singapore รองรับทั้งการส่งและรับอีเมลสำหรับ SES
  • รีเจี้ยน Singapore ใกล้กับประเทศไทยมากที่สุด (ผู้ใช้งานในประเทศไทยที่ต้องการจัดการอีเมลด้วย SES ในเวลาแฝงต่ำก็จะได้รับประโยชน์อย่างสูง)

ค่าบริการ (※ณ วันที่ 20/9/2023)

สำหรับฟังก์ชันการส่งอีเมลนั้น ปริมาณที่สามารถใช้ฟรีได้จะแตกต่างกันไปขึ้นอยู่กับว่าใช้ EC2 เป็น host หรือไม่ครับ

AWS Free Tier สำหรับ SES

AWS ได้มีการมอบบริการพื้นฐานใน SES ให้ได้ใช้กันแบบฟรี ๆ เป็น Free Tier อยู่ด้วยครับ โดย Free Tier ของ SES มีรายละเอียดดังนี้

  • Free Tier มีระยะเวลา 12 เดือน
  • แต่ละเดือนสามารถใช้งานได้สูงสุด 3,000 ฉบับ แบบไม่เสียค่าใช้จ่าย (ส่วนที่เกินจาก 3,000 ฉบับ มาจะคิดค่าบริการแยกต่างหาก)
  • บริการของ SES ที่รองรับการใข้งานแบบ Free Tier ประกอบด้วย
    • การส่ง Email
    • การรับ Email
    • การใช้ Virtual Deliverability Manager ช่วยในการส่ง Email

การรับหรือส่ง Email 1 ครั้ง จะนับเป็น 1 ฉบับ ส่วนบัญชีที่เปิดใช้งาน Virtual Deliverability Manager อยู่ การส่ง Email 1 ครั้งจะคิดเป็น 2 ฉบับ ตัวอย่างเช่น ในกรณีที่บัญชีมีการเปิดใช้งาน Virtual Deliverability Manager และได้ทำการส่ง Email จำนวน 1,000 ครั้ง (คิดเป็น 2,000 ฉบับ) และรับ Email 1,000 ครั้ง (คิดเป็น 1,000 ฉบับ) ก็จะถือว่าใช้งานไป 3,000 ฉบับพอดี

ข้อควรระวัง: การใช้งาน SES Free Tier อาจมีค่าบริการอื่น ๆ เพิ่มเติมอันเนื่องมาจาก Service อื่นที่ใช้ควบคู่กันแยกต่างหาก เช่น การส่งข้อมูลออกจาก EC2, การใช้งาน Dedicated IP เป็นต้น

ราคา Amazon SES

Amazon SES จะมีค่าใช้จ่ายเฉพาะส่วนที่ใช้เท่านั้น และไม่มีค่าใช้ใช้จ่ายขั้นต่ำหรือข้อผูกมัดการใช้บริการครับ สำหรับการรับส่งอีเมล การใช้ข้อมูล และฟังก์ชันเพิ่มเติมจะถูกคิดค่าบริการแยกกัน Amazon SES ให้ความโปร่งใสและราคาที่ต่ำไม่ว่าจะใช้ในกรณีใดก็ตาม ดังนั้นจึงจ่ายค่าบริการเฉพาะฟังก์ชันที่ใช้เท่านั้นครับ

ประเภทบริการ ราคา ค่าบริการเพิ่มเติม
ส่งอีเมลจากแอปพลิเคชันที่ถูก Host อยู่บน EC2 0.10 USD/1000 อีเมล 0.12$ สำหรับไฟล์แนบทุก ๆ 1 GB*
ส่งอีเมลจาก Email client หรือ Software package 0.10 USD/1000 อีเมล 0.12$ สำหรับไฟล์แนบทุก ๆ 1 GB
รับอีเมล 0.10 USD/1000 อีเมล 0.09 USD สำหรับการรับ chunked email

*กรณีที่ใช้ EC2 อาจมีค่าบริการการถ่ายโอนข้อมูลแยกกัน

ค่าบริการด้านบนนี้เป็นค่าบริการ ณ วันที่ทำการเขียนบล็อกนี้ (20/9/2023) ครับ หากต้องการทราบค่าบริการ ณ ปัจจุบัน สามารถตรวจสอบได้ที่เว็บไซต์ด้านล่างนี้เลยครับ

ค่าบริการ - Amazon SES(Amazon Simple Email Service)| AWS

ขั้นตอนการสร้างสภาพแวดล้อมในการส่งอีเมลของ SES

สร้างอีเมลผู้ส่ง

ก่อนอื่น สิ่งที่เราจะทำเป็นอันดับแรกเลยคือการตรวจสอบ Email Address ของผู้ส่งครับ

Email Address ที่จะนำมาใช้เป็นผู้ส่งนั้น จะต้องเป็น Email Address ที่สามารถใช้รับอีเมลอื่น ๆ ได้ด้วย โดยหากกดปุ่มตามขั้นตอนด้านล่างก็จะมีหน้าจอสำหรับลงทะเบียนอีเมลปรากฎขึ้นมาครับ

เลือก Email Address แล้วใส่ Email Address ที่จะใช้สำหรับการส่งอีเมลเข้าไป จากนั้นกดปุ่ม Create Identity

หลังจากนั้นจะมีอีเมลยืนยันตัวตนส่งไปที่ Email Address ที่เราได้ลงทะเบียนไว้ ให้ทำการคลิกที่ลิงก์เพื่อทำการยืนยันตัวตน

หากยืนยันตัวตนสำเร็จ จะมีหน้าเว็บที่แสดงข้อความว่า「Congratulation」ปรากฎขึ้นมาครับ

เมื่อกลับไปที่หน้า Management Console จะพบว่าสถานะของ Email Address ที่เราลงทะเบียนไว้จะเปลี่ยนจาก pending verification (resend) เป็น verified

ทดสอบการส่งอีเมล

ในตอนนี้ Email Address ที่เราลงทะเบียนไว้จะยังไม่สามารถส่งอีเมลไปหาผู้อื่นได้นอกจากตัวเอง (ยังอยู่ในสถานะที่เรียกว่า "Sandbox") เพราะฉะนั้นก่อนอื่นเราจะลองทดสอบส่งอีเมลหาตัวเองกันก่อนครับ

เมื่อไปตรวจสอบที่กล่องข้อความขาเข้า ก็จะพบอีเมลที่มีเนื้อหาตามที่เราส่งออกไปเข้ามาครับ

ตรวจสอบ SES Metrics

ใน SES เราสามารถทำการตรวจสอบดูข้อมูลจาก Management Console ได้ 4 รายการ ประกอบด้วย

  • Sends (อีเมลที่ส่งออกไป)
  • Rejects (อีเมลที่ถูก SES ปฏิเสธการส่ง)
  • Bounces (อีเมลที่ถูกตีย้อนกลับมา)
  • Complaints (อีเมลที่ถูกผู้รับรายงานว่าเป็นสแปม)

โดยเมื่อครู่ผมได้ทำการทดลองส่งอีเมลออกไป 2 ฉบับ ทำให้ Sends เพิ่มขึ้นเป็น 2 ดังแสดงในกราฟด้านล่างนี้ครับ

นอกจากนี้ ยังสามารถดูข้อมูลอื่น ๆ เพิ่มเติมได้ผ่านทาง CloudWatch ประกอบด้วย

  • Deliveries (อีเมลที่ส่งสำเร็จ)
  • Opens (ผู้รับเปิดอีเมลที่เราส่งออกไป)
  • Clicks (ผู้รับเปิดลิงก์ที่อยู่ในอีเมลที่เราส่งออกไป)
  • RenderingFailures (อีเมลไม่สามารถส่งได้เนื่องจากติดปัญหาด้านการ render ของ template)
  • Subscriptions (ผู้รับเปลี่ยนการตั้งค่า subscription ของอีเมลที่มาจากผู้ส่ง)
  • DeliveryDelay (อีเมลส่งไปถึงผู้รับล่าช้าด้วยสาเหตุบางอย่าง)

รายละเอียดเพิ่มเติมเกี่ยวกับ metric ต่าง ๆ สามารถดูได้ที่ลิงก์ด้านล่างนี้เลยครับ

Monitoring your Amazon SES sending activity

ใช้งาน Amazon SES API (AWS CLI)

ผมจะลองใช้ AWS CLI ในการส่งอีเมลผ่าน SES ดูครับ

ก่อนอื่นให้สร้าง EC2 Instance (OS Linux) โดยแนบ IAM Role ที่มี Permissions AmazonSESFullAccess และรันคำสั่งด้านล่างนี้ก็จะสามารถส่งอีเมลได้แบบง่าย ๆ เลยครับ

$ aws ses send-email \
    --region ap-southeast-1 \
    --to [YOUR_MAIL_ADDRESS] \
    --from [YOUR_MAIL_ADDRESS] \
    --subject "send test by cli" \
    --text "send test body by cli"

นำสถานะ Sandbox ออก

ในกรณีที่ SES อยู่ในสถานะ Sandbox จะสามารถส่งอีเมลถึง Email Address ที่ใช้สำหรับการส่งอีเมลด้วยกันเท่านั้น

หากต้องการนำ SES ไปใช้งานจริง ทำให้สามารถส่งอีเมลไปหาใครก็ได้ จะต้องทำการยื่นเรื่องขอไปที่ทาง Support ครับ

โดยเมื่อคลิกที่ Request production access ระบบก็จะพาเราไปที่หน้า Request production access เราสามารถทำเรื่องขอได้ที่หน้านั้นเลยครับ

สำหรับรายละเอียดในการทำเรื่องขอออกจากสถานะ Sandbox นั้น สามารถดูได้ที่เอกสารด้านล่างนี้เลยครับ

Moving out of the Amazon SES sandbox

ข้อจำกัดในการส่งอีเมล

SES ได้มีการตั้งข้อจำกัดในการส่งอีเมลเอาไว้ เพื่อรักษาความเชื่อมั่นภายในระหว่าง Internet Service Provider (ISP) ครับ ซึ่งข้อจำกัดนี้สามารถปรับเปลื่ยนได้โดยการทำเรื่องขอไปที่ทาง Support โดยในการทำเรื่องขอ จะต้องเขียนแจงรายละเอียดเกี่ยวกับ service ที่จะนำไปใช้รวมถึงวิธีการจัดการไว้ให้ครบถ้วนชัดเจนครับ

  • Senging quota : จำนวนอีเมลสูงสุดที่ส่งได้ต่อวัน ค่าเริ่มต้นจะอยู่ที่ 200 ฉบับต่อวัน
  • Sending rate : จำนวนอีเมลสูงสุดที่รับได้ต่อวินาที ค่าเริ่มต้นจะอยู่ที่ 1 ฉบับต่อวินาที

อ้างอิง : Managing your Amazon SES sending limits

การส่งอีเมลไปถึงตัวบุคคลโดยใช้ Template

SES สามารถใช้ Template เพื่อส่งอีเมลที่ระบุถึงตัวบุคคลหนึ่ง ๆ ได้ด้วยครับ
โดยรายละเอียดสามารถดูได้ที่บล็อกด้านล่างนี้ครับ

การรับอีเมลด้วย SES

ฟังก์ชันการรับอีเมลของ SES นั้น มีลักษณะการทำงานที่ต่างจากการส่งอีเมลมากซะจนหากจะบอกว่าเป็น service แยกอีกอันหนึ่งก็คงไม่ผิดนักครับ

หากให้อธิบายสั้น ๆ ก็คือ เป็น service ที่ใช้การรับอีเมลเป็น trigger เพื่อสั่งให้ AWS Service อื่น ๆ ทำงานครับ

โดยหลังจากที่ได้รับอีเมลแล้ว จะสามารถออกคำสั่งให้กับ AWS Service ต่อไปนี้ได้

  • S3
  • Lambda
  • SNS
  • WorkMail

นอกจากนี้ยังสามารถทำ

  • Return bounce response action : ส่ง bounce response กลับไปให้ผู้ส่ง เพื่อปฏิเสธการรับอีเมล
  • Stop rule set action : หยุดการประเมิน receipt rule set
  • Add header action : เพิ่ม header ในอีเมล ซึ่ง action นี้ปกติแล้วจะใช้ร่วมกับ action อื่น ๆ

และยังมี action อื่น ๆ อีก โดยรายละเอียดสามารถดูได้ที่เอกสารด้านล่างนี้ครับ

Recipient-based control using receipt rules

ซึ่ง use case หลัก ๆ จะมีดังนี้

  • สร้าง support ticket โดยอัตโนมัติจากอีเมลของลูกค้า
  • การตอบอีเมลโดยอัตโนมัติ
  • จัดการกับ bounces หรือ complaints

ขั้นตอนการสร้างสภาพแวดล้อมในการรับอีเมลของ SES

แผนภาพโครงสร้าง AWS

ในครั้งนี้ผมจะสร้างสภาพแวดล้อมแบบง่าย ๆ ประกอบด้วย Route53 ใช้สำหรับการจัดการ domain, SES สำหรับรับอีเมล และ S3 สำหรับจัดเก็บอีเมลที่รับมาเหล่านั้นครับ

เตรียม Domain

ก่อนอื่น เราจะต้องเตรียม domain สำหรับใช้กับ Email Address ก่อนครับ

ซึ่งหากใช้งาน Route 53 ก็จะสามารถตั้งค่า DNS ได้อย่างง่ายดาย เพราะฉะนั้นในครั้งนี้ผมจึงเลือกใช้ Route 53 ครับ

เพิ่ม Domain

ขั้นตอนต่อไปให้เรากลับมาที่ SES แล้วเลือก Verified identities จากเมนูด้านซ้าย แล้วคลิก Create identity ก็จะปรากฎหน้าจอ Create identity ขึ้นมาครับ

ดูที่หัวข้อ Identity details ให้ตั้งค่าตามนี้

  • Identity type: Domain
  • Domain: ป้อน Domain เดียวกับที่ลงทะเบียนไว้ใน Route 53
  • ติ๊ก ✅ Use a custom MAIL FROM domain แล้วจะมีการตั้งค่าเกี่ยวกับ DMARC แสดงเพิ่มมาด้านล่าง
  • MAIL FROM domain: ป้อนตามต้องการ
  • ติ๊ก Enabled (กรณีที่ไม่ได้จัดการ Domain ด้วย Route 53 ก็ไม่ต้องติ๊ก)

ต่อไปหัวข้อ Verifying your domain ให้ตั้งค่าตามนี้

  • คลิก Advanced DKIM settings
  • Identity type: Easy DKIM
  • DKIM signing key length: RSA_2048_BIT
  • Publish DNS records to Route53: Enabled
  • DKIM signatures: Enabled

จากนั้นคลิก Create identity ที่ด้านล่างสุด

SES จะถูกสร้างขึ้น แล้ว Record ของ DKIM(3 ตัว) และ Custom MAIL FROM(2 ตัว) จะถูกลงทะเบียนใน Route 53 โดยอัตโนมัติ
※กรณีที่ไม่ได้ใช้ Route 53 จำเป็นต้องลงทะเบียน CNAME Record ด้วยตัวเอง

แล้วเข้าไปที่หน้าจอ Hosted zone ใน Route 53 ที่ใช้ลงทะเบียนกับ SES ก็จะเห็น Record 5 ตัวเพิ่มขึ้นมาโดยมีข้อมูลเหมือนกับฝั่ง SES แบบนี้
※หากมี Record หลายอัน ให้ค้นหาด้วยคำว่า _domainkey และชื่อ MAIL FROM domain ของเราตามรูปภาพนี้

หากลงทะเบียน Record ใน DNS ได้ตามปกติ สถานะฝั่ง SES ทั้งหมดควรจะได้รับการอัปเดตเป็น ✅ Verified และ ✅ Successful ในเวลาประมาณ 5 - 10 นาที (ครั้งนี้ใช้เวลาประมาณ 5 นาที)

การสร้าง MX record สำหรับการรับอีเมลด้วย Amazon SES ใน Route 53

เข้าไปที่หน้าจอ Hosted zone ใน Route 53 ที่ใช้ลงทะเบียนกับ SES ของเรา แล้วคลิก Create record

ดูที่หัวข้อ Quick create record ให้ตั้งค่าตามนี้

  • Record type: เลือก MX – Specifies mail servers
  • Value: ป้อน 10 inbound-smtp.ap-southeast-1.amazonaws.com (สำหรับรีเจี้ยน Singapore)
  • TTL (seconds): 300 (ตั้งค่าได้ตามต้องการ แต่ครั้งนี้ใช้เป็นค่าเริ่มต้น)
  • คลิก Create records

※การป้อน Value จะต้องป้อนค่า "[priority] [mail server host name]" โดยดูรายละเอียดเพิ่มเติมได้ที่ลิงก์ด้านล่างนี้
Publishing an MX record for Amazon SES email receiving
Amazon SES regions and endpoints

เมื่อสร้างเสร็จแล้ว จะมี Record เพิ่มขึ้นมาแบบนี้

ตั้งค่าการรับอีเมล

เมื่อตั้งค่า Domain แล้ว ให้ตั้งค่าการรับอีเมล (Email receiving) ด้วยครับ

เลือก Email receiving จากเมนูด้านซ้าย แล้วคลิก Create rule set

ตั้งชื่อ Rule set ที่ต้องการ เช่น ses-receive-ruleset แล้วคลิก Create rule set

แล้วจะแสดงหน้าจอแบบนี้ตามชื่อที่เราตั้ง จากนั้นคลิก Create rule ในหัวข้อ All receipt rules

Step 1 - Define rule settings
ป้อน Rule name ตามที่ต้องการ เช่น ses-receive-rule แล้วคลิก Next

Step 2 - Add recipient conditions
ให้ทำการลงทะเบียน Domain ที่ Recipient นี้โดยคลิก Add new recipient condition แล้วป้อน Domain ที่จดทะเบียนใน Route 53 ที่ได้รับการตรวจสอบก่อนหน้านี้ แล้วคลิก Next

Step 3 - Add actions
เลือก Add new action เป็น Deliver to S3 bucket แล้วหัวข้อ Deliver to Amazon S3 bucket จะเพิ่มขึ้นมาด้านล่าง
แล้วเลือกหรือสร้าง S3 bucket ตามที่ต้องการ แต่ครั้งนี้จะสร้างใหม่โดยใช้ชื่อ ses-receive-mail-s3 จากหน้าจอนี้ แล้วคลิก Next

※หากมี S3 bucket อยู่แล้ว จำเป็นต้องให้ Permission กับ SES ในการเขียนไปยัง S3 bucket ด้วยครับ
ดูรายละเอียดได้ที่ลิงก์ Giving permissions to Amazon SES for email receiving

Step 4 - Review
ตรวจสอบการตั้งค่า แล้วเลื่อนลงมาด้านล่างสุด คลิก Create rule

เมื่อสร้างเสร็จแล้วจะมี Receipt rule แสดงที่ด้านล่างแบบนี้ แล้วคลิก Set as active เพื่อเปิดใช้งาน Rule set ของเรา

คลิก Set as active

แล้ว Status จะเป็น ✅ Active แบบนี้

ทดสอบการรับอีเมล

เราสามารถส่งอีเมลไปยังอีเมลผู้รับผ่าน SES หรือช่องทางอื่น ๆ ได้ แต่ครั้งนี้ผมจะใช้อีเมลผู้ส่งที่สร้างใน SES ก่อนหน้านี้ เนื่องจากไม่ได้นำสถานะ Sandbox ออก
แต่ถ้าผู้ใช้งานที่นำสถานะ Sandbox ออก สามารถใช้อีเมลผู้ส่งอื่น ๆ ที่ไม่ได้สร้างใน SES ส่งไปยังอีเมลผู้รับที่ตั้งค่าเมื่อสักครู่นี้ใน SES ได้ครับ

มาส่งอีเมลและตรวจสอบว่าอีเมลที่ได้รับจะสามารถบันทึกใน S3 ได้หรือไม่
เราสามารถใช้อีเมลผู้ส่งที่สร้างใน SES ส่งผ่าน Console ใน SES หรือบน Platform อีเมลนั้น ๆ ได้ ซึ่งครั้งนี้จะส่งผ่าน Gmail ครับ
สำหรับ "To" เราสามารถป้อนสตริงใดก็ได้ก่อนหน้า @ และตามด้วย Domain ที่จดทะเบียนใน Route 53 เช่น ses@domain

เข้ามาที่หน้าจอ S3 Buckets ของเรา จะเห็นว่ามีไฟล์ถูกบันทึกมายัง S3 แบบนี้ จากนั้นให้ Download

เมื่อ Download ไฟล์ที่ถูกบันทึกใน S3 แล้ว ให้เปิดไฟล์ขึ้นมา ก็จะแสดงเนื้อหาตามที่เราป้อนในตอนที่ส่งอีเมลครับ

---<<"ละเว้น: ข้อมูล Header ต่างๆ">>---

Subject: SES Test
To: ses@domain
Content-Type: text/plain; charset="UTF-8"

SES Reception Function
Save to S3

ทีนี้ผมจะลองส่งเป็นภาษาไทยดูโดยใช้อีเมลเดิมอีกครั้งครับ

แล้ว Download ไฟล์และเปิดไฟล์อีกครั้ง

แล้วตรวจสอบไฟล์ดูจะเห็นว่าข้อความถูกเข้ารหัสเป็นภาษาไทย ดังนั้นผมจะตรวจสอบเพื่อดูว่ามีปัญหากับเนื้อหาหรือไม่

---<<ละเว้น: ข้อมูล Header ต่างๆ>>---

Subject: =?UTF-8?B?4LiB4Liy4Lij4LiX4LiU4Liq4Lit4LiaIFNFUw==?=
To: ses@domain
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: base64

4Lif4Lix4LiH4LiB4LmM4LiK4Lix4LmI4LiZIFNFUyBSZWNlcHRpb24NCuC4muC4seC4meC4l+C4
tuC4geC4peC4h+C5g+C4mSBTMw0K


ข้อความภาษาไทยใน Subject มีการเข้ารหัส Base64 เมื่อถอดรหัส Base64 โดยใช้คำสั่ง base64 --decode แล้วจะทำให้สามารถอ่านได้ครับ

$ echo '4LiB4Liy4Lij4LiX4LiU4Liq4Lit4LiaIFNFUw==' | base64 --decode
การทดสอบ SES


ข้อความภาษาไทยใน Body มีการเข้ารหัส Base64 เมื่อถอดรหัส Base64 โดยใช้คำสั่ง base64 --decode ก็จะทำให้สามารถอ่านได้ครับ

$ echo '4Lif4Lix4LiH4LiB4LmM4LiK4Lix4LmI4LiZIFNFUyBSZWNlcHRpb24NCuC4muC4seC4meC4l+C4tuC4geC4peC4h+C5g+C4mSBTMw0K' | base64 --decode
ฟังก์ชั่น SES Reception
บันทึกลงใน S3

สุดท้ายนี้

การแนะนำฟังก์ชันของ AWS เกี่ยวกับ Amazon SES สำหรับผู้เริ่มต้นใช้งานก็จบไปแล้วครับ

เมื่อใช้งาน Mail Server ด้วยตัวเองอาจเป็นเรื่องยาก แต่ Amazon SES สามารถใช้จัดการได้ในราคาไม่แพง ซึ่งเป็นตัวช่วยที่ยอดเยี่ยมมาก ๆ ซึ่งมันอาจไม่ได้หวือหวาอะไรมาก แต่ผมคิดว่าอีเมลยังคงถูกใช้ต่อไป ก็เลยอยากแนะนำให้ลองใช้ Amazon SES ในโอกาสนี้ดูครับ

ผมหวังว่าบทความนี้จะเป็นประโยชน์ให้กับผู้อ่านได้นะครับ

บทความต้นฉบับ

แปลโดย: POP จากบริษัท Classmethod (Thailand)

บทความที่เกี่ยวข้อง