ข้ามไปที่เนื้อหา

Email Deliverability — SMTP relay กับ Gmail (rlpd.go.th)

สถานะ 10 ก.ย. 2569: เมลจาก @rlpd.go.th ที่ส่งผ่าน relay ของ Workd ไปไม่ถึง Gmail / Google Workspace เลย — relay รับเมลปกติ (250 queued) แต่ Gmail ปฏิเสธด้วย 550 5.7.26 เพราะโดเมนไม่ผ่านทั้ง SPF และ DKIM สาเหตุอยู่ที่ DNS ของโดเมน rlpd.go.th ไม่ใช่โค้ดหรือ config relay ต้องให้เจ้าของโดเมนแก้ (ดู ทางแก้)

ค่าลับ (secrets) ไม่อยู่ในหน้านี้

รหัส SMTP ของ mailbox และของ relay คนละชุดกัน เก็บอยู่ที่ RLPD_BOX_HANDOFF (นอก git) และ GitHub secret WEBPORTAL_SMTP_PASSWORD ใน rlpd-pipeline — หน้านี้บันทึกเฉพาะโครงสร้างและผลการตรวจ

ภาพรวม SMTP ที่ใช้อยู่

ระบบ SMTP host Port บัญชี / From หมายเหตุ
S9 Web Portal (UAT .155) mailrelay.uc-workd.com 587 STARTTLS noreply@rlpd.go.th ย้ายมาจาก outgoing 7 ก.ย. 2569 (rlpd-pipeline main 7e22078, redeploy v0.39.40)
S9 Web Portal (PRD) outgoing.workd.go.th / webmail.workd.go.th 587 rlpdnotify@rlpd.go.th secret ระดับ repo ยังเป็นรหัส mailbox
Keycloak realm rlpd (UAT) outgoing.workd.go.th 465 SSL rlpdnotify@rlpd.go.th ตั้งโดย kc-uat-smtp-forgot.sh — ยังไม่ได้ย้าย มา mailrelay

relay 2 ตัว 2 รหัส

  • outgoing.workd.go.th (203.154.64.183) = mail server ของ mailbox Workd ใช้รหัส mailbox
  • mailrelay.uc-workd.com (210.4.128.96, EHLO smtp*.zone*.two-email.com) = บริการ relay ของ two-email มี user DB แยก ต้องใช้ รหัส relay ต่างหาก (ได้จากกรม 7 ก.ย. 2569) — ใช้รหัส mailbox จะได้ 535
  • relay รับ envelope sender ได้ยืดหยุ่น (noreply@ ใช้ได้ทั้งที่ mailbox จริงคือ rlpdnotify@)

Firewall ขาออกจาก UAT box .155

Port ผล
587 / 2525 STARTTLS ผ่าน
465 implicit SSL Connection reset กลาง TLS handshake (ทั้ง outgoing และ mailrelay) — ห้ามใช้จาก .155

อาการที่ตรวจพบ (7 ก.ย. 2569, เช็คซ้ำ 10 ก.ย.)

  1. ส่งจาก BFF container rlpd-webportal-be บน .155 ผ่าน mailrelay → AUTH 235, 250 queued ทุกฉบับ
  2. ส่งไป mail-tester.com → ถึงภายใน 1 นาที ขาออกจริงคือ 210.4.139.67 (mail-67.bit-zone.two-email.com, อยู่ใน _spf.uc-workd.com) และ IP ไม่ติด blacklist
  3. Gmail ของผู้ทดสอบไม่มีเมลจาก @rlpd.go.th แม้แต่ฉบับเดียว (ค้น in:anywhere รวม spam/trash ย้อนหลัง 30 วัน)
  4. Bounce (5.7.26) วิ่งกลับ mailbox noreply@ ซึ่งอ่านไม่ได้ — IMAP 993 ของ workd ทุก host timeout
  5. ปัญหามีมาก่อนย้าย relay: outgoing.workd.go.th ก็ไม่อยู่ใน SPF ของโดเมนตั้งแต่แรก

สาเหตุ (DNS)

mail-tester รายงาน Received-SPF: Permerror — Gmail ต้องผ่าน SPF หรือ DKIM อย่างน้อยหนึ่ง แต่ตกทั้งคู่

1. SPF permerror

SPF ปัจจุบันของ rlpd.go.th (NS = ns1/ns2.gdcc.cattelecom.com):

v=spf1 include:spf.protection.outlook.com include:_spf3.mail.go.th include:_spf.uc-workd.com -all

_spf3.mail.go.th (MailGoThai กลาง) ประกาศ TXT เป็น หลาย string แยกกัน:

"v=spf1" "include:spf.protection.outlook.com" "include:mailgun.org" "include:_ipv4.mail.go.th" ... "~all"

ตาม RFC 7208 string เหล่านี้ต่อกัน โดยไม่มีช่องว่าง → record ใช้ไม่ได้ → permerror ลามทั้งโดเมน (pyspf: No valid SPF record for included domain: _spf3.mail.go.th) _ipv4/_ipv6.mail.go.th พังแบบเดียวกัน และ _netblocks3.mail.go.th include วนกลับ _spf3 นอกจากนี้จำนวน DNS lookup รวมยังเกินขีด 10 ของ SPF ด้วย

2. ไม่มี DKIM

ทั้ง mailrelay และ outgoing ไม่เซ็น DKIM และไม่มี selector ใด ๆ ใน _domainkey.rlpd.go.th

3. ไม่มี DMARC

ไม่มี _dmarc.rlpd.go.th — ไม่ใช่สาเหตุตรง แต่ Gmail ให้น้ำหนักในการตัดสินใจ

ทางแก้ (ต้องให้เจ้าของโดเมนทำ)

[OPEN] ยังไม่ได้ส่งคำขอถึงผู้ดูแล DNS ของกรม — ระหว่างนี้ผู้ใช้ Gmail/Google Workspace จะไม่ได้รับเมลจาก UAT เลย (เมลรหัสผ่าน AD, ลืมรหัสผ่าน, แจ้งเตือนจาก Web Portal)

  1. แก้ SPF ให้ไม่มี include ที่พัง (pyspf → pass, 2 lookups):
    v=spf1 include:spf.protection.outlook.com include:_spf.uc-workd.com -all
    
    ถ้ายังต้องส่งผ่าน MailGoThai ให้ใส่ IP ตรง ๆ แทน include: ip4:164.115.2.0/23 ip6:2401:9D00:0101:1::/64 ip6:2401:9D00:0101:2::/64
  2. ขอ DKIM จาก uc-workd / two-email ให้เซ็นโดเมน rlpd.go.th แล้วลง selector ใน DNS
  3. เพิ่ม DMARC เริ่มที่ v=DMARC1; p=none; rua=mailto:<mailbox ที่อ่านได้> แล้วค่อยเข้ม
  4. (ทางเลือก) ย้าย Keycloak realm SMTP มา mailrelay 587 ด้วย เพื่อลดจุดต่าง UAT/PRD

วิธีทดสอบซ้ำ

  • อย่าไล่ nodemailer / env / relay ซ้ำ ถ้าเมลไม่ถึงปลายทาง — ใช้ mail-tester ก่อน: ส่งไป test-<ชื่อ>@srv1.mail-tester.com แล้วเปิด https://www.mail-tester.com/test-<ชื่อ> จะเห็น Authentication-Results (SPF/DKIM/DMARC) ทันที
  • ตรวจ DNS:
    dig +short TXT rlpd.go.th @8.8.8.8 | grep spf
    dig +short TXT _spf3.mail.go.th
    dig +short TXT _dmarc.rlpd.go.th
    
  • ส่งจาก container บน UAT (path เดียวกับ directSendMail): docker exec -w /usr/src/app rlpd-webportal-be node -e '<nodemailer script อ่าน env>' — POST /api/common/send-mail ใช้ทดสอบบน UAT ไม่ได้ เพราะไม่มีแถว active ใน PORTAL.ApiKey
  • Keycloak: kc-uat-smtp-forgot.sh (repo RLPD_REPOS) ยิง execute-actions-email UPDATE_PASSWORD ไปหา user ทดสอบ แล้วเช็ค inbox ปลายทาง

ไทม์ไลน์

วันที่ เหตุการณ์
9 ส.ค. 2569 กรมให้บัญชี rlpdnotify@ บน outgoing.workd.go.th — ตั้ง Keycloak forgot password + SMTP; พบ .155 ออก 465 ไม่ได้
1 ก.ย. 2569 ลอง mailrelay ด้วยรหัส mailbox → 535 (คนละ user DB)
7 ก.ย. 2569 ได้รหัส relay; UAT Web Portal ย้ายไป mailrelay.uc-workd.com:587 เป็น noreply@; ตรวจพบ SPF permerror / ไม่มี DKIM → Gmail ไม่รับ
10 ก.ย. 2569 เช็ค DNS ซ้ำ ยังไม่เปลี่ยน; Gmail ยังไม่มีเมลจาก @rlpd.go.th

ดูเพิ่ม: เครือข่ายและการเข้าถึง · UAT SSO Environment