คำตอบสั้น ๆ: ตั้ง 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 ติดตั้งอยู่ ให้ถอดออกก่อน
ขั้นตอนที่ 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