Postfix: ส่งอีเมลแจ้งเตือนจากเซิร์ฟเวอร์ผ่าน SMTP Relay

ตั้ง Postfix แบบส่งอย่างเดียวให้ Cron และแอปบน Linux Server ส่งอีเมลแจ้งเตือนผ่าน SMTP Relay ที่ยืนยันตัวตนด้วย SASL เข้ารหัส TLS และทดสอบด้วยคำสั่ง mail

โดย ทีมงาน THAI DATA CLOUD อัปเดต อ่าน 10 นาที

แชร์FacebookXLINELinkedIn
Postfix — Postfix: ส่งอีเมลแจ้งเตือนจากเซิร์ฟเวอร์ผ่าน SMTP Relay
Postfix: ส่งอีเมลแจ้งเตือนจากเซิร์ฟเวอร์ผ่าน SMTP Relay

คำตอบสั้น ๆ: ตั้ง Postfix แบบส่งอย่างเดียวให้ Cron และแอปบน Linux Server ส่งอีเมลแจ้งเตือนผ่าน SMTP Relay ที่ยืนยันตัวตนด้วย SASL เข้ารหัส TLS และทดสอบด้วยคำสั่ง mail

คู่มือนี้อธิบาย Postfix ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย

Postfix คือโปรแกรมส่งอีเมล (MTA) มาตรฐานบน Linux ที่ตั้งให้ทำงานแบบส่งอย่างเดียวได้ โดยฝากอีเมลทุกฉบับผ่าน SMTP Relay ที่ยืนยันตัวตนแล้ว เช่น บัญชีอีเมลขององค์กร หรือบริการส่งอีเมลที่รองรับ SMTP Authentication เหมาะกับเซิร์ฟเวอร์ที่ต้องส่งอีเมลแจ้งเตือนจาก Cron, ผลสำรองข้อมูล, Fail2ban หรือแอปที่เรียกคำสั่ง sendmail แต่ไม่ต้องการเปิดเป็น Mail Server รับอีเมลเอง

การส่งตรงจาก IP ของเซิร์ฟเวอร์มักเข้า Spam หรือถูกบล็อก เพราะ IP ไม่มีประวัติและไม่มี Reverse DNS ที่ถูกต้อง ผู้ให้บริการคลาวด์หลายรายยังปิดพอร์ต 25 ขาออก การส่งผ่าน Relay ที่พอร์ต 587 แก้ทั้งสองปัญหา เมื่อจบคู่มือนี้ Postfix จะรับอีเมลเฉพาะจากภายในเครื่อง ส่งผ่าน Relay แบบเข้ารหัส ใช้ผู้ส่งที่ถูกต้อง และอีเมลของ root ไปถึงกล่องจริงของคุณ

สิ่งที่ต้องเตรียม

  • Linux Server ที่ใช้ Ubuntu 22.04/24.04, Debian 12 หรือ AlmaLinux/Rocky Linux 9 และสิทธิ์ sudo ชื่อเครื่องแบบเต็ม (FQDN) เช่น web01.example.com
  • ข้อมูล SMTP Relay: โฮสต์ (ตัวอย่าง smtp.example.com) พอร์ต 587 แบบ STARTTLS บัญชี [email protected] และรหัสผ่าน บางระบบต้องเปิด SMTP AUTH ให้บัญชีหรือใช้ App Password แทนรหัสปกติ
  • SPF ของโดเมนผู้ส่งรวมเซิร์ฟเวอร์ของ Relay ไว้แล้ว (ดู ตั้งค่า SPF, DKIM และ DMARC)
  • ถ้ามีโปรแกรมส่งอีเมลตัวอื่น เช่น Exim หรือ sendmail ติดตั้งอยู่ ให้ถอดออกก่อน
แผนภาพ Cron และแอปบนเซิร์ฟเวอร์ส่งอีเมลให้ Postfix ที่ฟังเฉพาะ localhost แล้วฝากต่อ SMTP Relay พอร์ต 587
Postfix ไม่เปิดพอร์ตรับจากภายนอก ส่งออกทางเดียวผ่าน Relay ที่ยืนยันตัวตนและเข้ารหัส

ขั้นตอนที่ 1: ตรวจว่าเซิร์ฟเวอร์ต่อ Relay ได้

ทดสอบก่อนติดตั้งอะไร ถ้าคำสั่งนี้ค้างหรือขึ้น Connection timed out แปลว่าพอร์ตขาออกถูกปิดที่ Firewall หรือ Security Group ต้องแก้ตรงนั้นก่อน

openssl s_client -connect smtp.example.com:587 -starttls smtp -brief < /dev/null

ผลที่ถูกต้องจะขึ้น CONNECTION ESTABLISHED พร้อม Protocol version: TLSv1.3 หรือ TLSv1.2

ขั้นตอนที่ 2: ติดตั้ง Postfix และโมดูล SASL

# Ubuntu / Debian
sudo apt update
sudo apt install -y postfix libsasl2-modules mailutils

# AlmaLinux / Rocky Linux 9
sudo dnf install -y postfix cyrus-sasl-plain s-nail
sudo systemctl enable --now postfix

บน Ubuntu/Debian จะมีหน้าจอถามค่า ให้เลือก Internet Site และใส่ System mail name เป็นชื่อเครื่องเต็ม web01.example.com ห้ามใส่แค่ example.com ไม่เช่นนั้น Postfix จะเข้าใจว่าอีเมลถึง @example.com ทั้งหมดเป็นของเครื่องนี้และไม่ส่งออกไป โมดูล libsasl2-modules หรือ cyrus-sasl-plain จำเป็นต่อการยืนยันตัวตนแบบ PLAIN/LOGIN ที่ Relay ส่วนใหญ่ใช้

ขั้นตอนที่ 3: ตั้ง Relay, SASL และ TLS

ใช้ postconf -e แก้ /etc/postfix/main.cf ทีละค่า วงเล็บเหลี่ยมรอบชื่อโฮสต์บอกให้ส่งไปเครื่องนั้นตรง ๆ ไม่ต้องค้นหา MX ส่วน loopback-only ทำให้ Postfix รับอีเมลจากในเครื่องเท่านั้น ไม่มีใครจากภายนอกใช้เครื่องคุณเป็น Open Relay ได้

sudo postconf -e 'myhostname = web01.example.com'
sudo postconf -e 'relayhost = [smtp.example.com]:587'
sudo postconf -e 'smtp_sasl_auth_enable = yes'
sudo postconf -e 'smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd'
sudo postconf -e 'smtp_sasl_security_options = noanonymous'
sudo postconf -e 'smtp_tls_security_level = encrypt'
sudo postconf -e 'inet_interfaces = loopback-only'
sudo postconf -e 'mydestination = $myhostname, localhost.$mydomain, localhost'

สร้างไฟล์รหัสผ่าน /etc/postfix/sasl_passwd ส่วนหน้าต้องตรงกับค่า relayhost ทุกตัวอักษร แล้วจำกัดสิทธิ์และสร้างไฟล์ฐานข้อมูล

[smtp.example.com]:587 [email protected]:รหัสผ่านหรือ-App-Password
sudo chmod 600 /etc/postfix/sasl_passwd
sudo postmap /etc/postfix/sasl_passwd
sudo systemctl restart postfix

smtp_tls_security_level = encrypt บังคับเข้ารหัส ถ้า Relay ไม่รองรับ TLS อีเมลจะค้างในคิวแทนการส่งรหัสผ่านแบบไม่เข้ารหัส ถ้า Relay ใช้พอร์ต 465 ให้เปลี่ยนพอร์ตในทั้งสองไฟล์เป็น 465 รัน postmap ใหม่ และเพิ่ม smtp_tls_wrappermode = yes การเปลี่ยน inet_interfaces ต้อง restart ไม่ใช่แค่ reload

ขั้นตอนที่ 4: ให้ผู้ส่งตรงกับบัญชีที่ยืนยันตัวตน

อีเมลจาก Cron จะมีผู้ส่งเป็น [email protected] ซึ่ง Relay ส่วนใหญ่ปฏิเสธ เพราะไม่ตรงกับบัญชีที่ล็อกอิน ให้ Postfix เปลี่ยนผู้ส่งทุกฉบับเป็นบัญชีของ Relay

sudo postconf -e 'sender_canonical_maps = regexp:/etc/postfix/sender_canonical'
echo '/.+/    [email protected]' | sudo tee /etc/postfix/sender_canonical
sudo postfix reload

ขั้นตอนที่ 5: ส่งอีเมลของ root และ Cron ไปกล่องจริง

เพิ่มบรรทัด root: [email protected] ใน /etc/aliases แล้วรัน sudo newaliases อีเมลแจ้งเตือนที่ระบบส่งถึง root เช่น ผล Cron ที่มี Error หรือรายงานจาก unattended-upgrades จะถูกส่งต่อไปกล่องนี้ สำหรับ Cron ของผู้ใช้แต่ละคน ใส่ [email protected] ไว้บรรทัดบนสุดของ crontab -e (ดู systemd Timer ถ้าใช้ Timer แทน Cron)

ขั้นตอนที่ 6: ทดสอบส่งและอ่าน Log

echo "ทดสอบจาก web01 $(date)" | mail -s "Postfix relay test" [email protected]
sudo journalctl -t postfix/smtp -n 20 --no-pager
mailq

บรรทัดที่ต้องการคือ status=sent (250 ...) และ relay=smtp.example.com ถ้าเห็น status=deferred ข้อความในวงเล็บจะบอกสาเหตุ Log ฉบับไฟล์อยู่ที่ /var/log/mail.log บน Ubuntu และ /var/log/maillog บน AlmaLinux/Rocky

หน้าจอส่งอีเมลทดสอบด้วยคำสั่ง mail และ Log ของ Postfix ที่แสดง relay และ status=sent
status=sent พร้อมรหัส 250 แปลว่า Relay รับอีเมลไปส่งต่อแล้ว

หลังแก้สาเหตุแล้ว สั่งส่งคิวที่ค้างใหม่ด้วย sudo postqueue -f ถ้าต้องการล้างอีเมลที่ค้างทั้งหมด (เช่น อีเมลทดสอบหลายร้อยฉบับ) ใช้ sudo postsuper -d ALL deferred คำสั่งนี้ลบถาวร ตรวจด้วย mailq ก่อนเสมอ

ปัญหาที่พบบ่อยเกี่ยวกับ Postfix

Log ขึ้น SASL authentication failed: no mechanism available แก้อย่างไร?

Postfix ไม่มีโมดูลยืนยันตัวตนแบบ PLAIN/LOGIN ติดตั้ง libsasl2-modules (Ubuntu/Debian) หรือ cyrus-sasl-plain (AlmaLinux/Rocky) แล้ว sudo systemctl restart postfix

Relay ตอบ 535 Authentication failed ทั้งที่รหัสผ่านถูก เกิดจากอะไร?

บัญชีอาจยังไม่ได้เปิด SMTP AUTH หรือต้องใช้ App Password แทนรหัสปกติเมื่อเปิด MFA อีกสาเหตุคือแก้ sasl_passwd แล้วลืมรัน postmap ซ้ำ ความหมายของรหัส Error อื่นดูได้ที่ SMTP Error Code

อีเมลถึงผู้ใช้ในโดเมนเดียวกันตีกลับว่า User unknown in local recipient table ทำไม?

mydestination มีชื่อโดเมนหลัก เช่น example.com Postfix จึงพยายามส่งเข้ากล่องในเครื่องแทนส่งออก ตรวจด้วย postconf mydestination และตั้งค่าใหม่ตามขั้นตอนที่ 3 ให้มีเฉพาะชื่อเครื่องและ localhost

Postfix ส่งสำเร็จแต่ผู้รับไม่เจออีเมล ต้องตรวจอะไร?

เมื่อ Log ขึ้น status=sent แปลว่า Relay รับไปแล้ว ให้ตรวจโฟลเดอร์ Spam ของผู้รับ และตรวจว่า SPF กับ DKIM ของโดเมนผู้ส่งรองรับ Relay นั้น ถ้า Relay มีหน้ารายงานการส่ง ให้ค้นด้วย Queue ID ที่เห็นใน Log

เช็กลิสต์ความปลอดภัยของ Postfix ที่ตั้งเป็น Send-only Relay บน Linux Server
ข้อสีแดงทำให้เครื่องกลายเป็น Open Relay หรือทำให้รหัสผ่านรั่ว

ถ้าต้องการบัญชีอีเมลองค์กรสำหรับส่งแจ้งเตือนผ่าน SMTP ดูบริการ Cloud Mail Server หรือ ติดต่อทีมงาน THAI DATA CLOUD รายละเอียดการตั้ง SASL ฝั่งผู้ส่งอยู่ใน Postfix SASL README

อ่านเพิ่มเติมเกี่ยวกับ Postfix

แชร์FacebookXLINELinkedIn

มีคำถามเรื่องบริการ? ติดต่อทีมงาน