WordPress SMTP คือการตั้งให้ WordPress ส่งอีเมลผ่านเซิร์ฟเวอร์อีเมลจริงด้วยการยืนยันตัวตน (SMTP Authentication) แทนการใช้ฟังก์ชัน mail() ของ PHP ซึ่งเป็นค่าเริ่มต้น นี่คือทางแก้หลักเมื่ออีเมลจากฟอร์มติดต่อ คำสั่งซื้อ หรือการรีเซ็ตรหัสผ่าน ไม่ถึงผู้รับหรือตกไปอยู่ในโฟลเดอร์สแปม
ปัญหานี้พบบ่อยขึ้นตั้งแต่ Gmail, Yahoo และ Outlook.com เข้มงวดเรื่องการยืนยันตัวผู้ส่ง อีเมลที่เคยส่งถึงเมื่อสองสามปีก่อนจึงเริ่มหายไปเงียบๆ ทั้งที่ไม่ได้แก้อะไรในเว็บ
ทำไม WordPress ที่ไม่ได้ตั้ง SMTP ใช้ mail() แล้วอีเมลไม่ถึง
ฟังก์ชัน wp_mail() ของ WordPress ใช้ PHPMailer ซึ่งค่าเริ่มต้นจะส่งผ่าน mail() ของ PHP หมายความว่าอีเมลออกจากเซิร์ฟเวอร์เว็บโดยตรง ไม่ได้ผ่านเซิร์ฟเวอร์อีเมลของโดเมน ปัญหาที่ตามมามีสามข้อ
- ไม่มี DKIM: อีเมลไม่ได้ถูกเซ็นด้วยคีย์ของโดเมน
- SPF อาจไม่ผ่าน: ถ้า SPF ของโดเมนไม่ได้รวม IP ของเซิร์ฟเวอร์เว็บไว้
- ตรวจย้อนหลังยาก: ไม่มี log ฝั่งเซิร์ฟเวอร์อีเมลให้ดูว่าอีเมลถูกส่งหรือถูกปฏิเสธ
เมื่อ SPF และ DKIM ไม่ผ่าน DMARC ก็ไม่ผ่านตามไปด้วย ผู้ให้บริการอีเมลปลายทางจึงจัดอีเมลนั้นเป็นสแปมหรือปฏิเสธทิ้ง ซึ่งเป็นเหตุผลที่เว็บธุรกิจควรเปลี่ยนมาใช้ WordPress SMTP
เกณฑ์ผู้ส่งอีเมลที่ใช้อยู่ในปัจจุบัน
ตั้งแต่ปี 2024 Google และ Yahoo กำหนดให้ผู้ส่งทุกรายต้องผ่าน SPF หรือ DKIM และผู้ส่งปริมาณมากต้องมี DMARC รายละเอียดอยู่ใน Email sender guidelines ของ Google ต่อมา Microsoft ก็ประกาศข้อกำหนดคล้ายกันสำหรับ Outlook.com [ตรวจสอบ: วันที่บังคับใช้และเกณฑ์ปริมาณล่าสุดของ Microsoft]
แม้เว็บทั่วไปจะส่งอีเมลไม่ถึงเกณฑ์ผู้ส่งปริมาณมาก แต่ตัวกรองสแปมใช้หลักเดียวกันกับทุกคน การตั้ง WordPress SMTP ร่วมกับ SPF, DKIM และ DMARC ให้ครบจึงเป็นมาตรฐานขั้นต่ำ
ต้นเหตุที่พบบ่อยที่สุด: ใส่อีเมลผู้กรอกฟอร์มเป็น From
ปลั๊กอินฟอร์มหลายตัวตั้งค่าเริ่มต้นหรือถูกตั้งให้ใช้อีเมลของผู้กรอกฟอร์มเป็นผู้ส่ง (From) เช่น ลูกค้ากรอก [email protected] อีเมลแจ้งเตือนก็ออกมาในนาม [email protected] จากเซิร์ฟเวอร์ของเรา
แม้ตั้ง WordPress SMTP แล้ว ถ้ายังใช้ From แบบนี้ อีเมลก็ยังไม่ถึงอยู่ดี เพราะนี่คือการปลอมผู้ส่งในมุมของ DMARC เพราะเซิร์ฟเวอร์เราไม่มีสิทธิ์ส่งในนามโดเมน gmail.com อีเมลจะไม่ผ่าน DMARC alignment และถูกปฏิเสธ (RFC 7489) วิธีที่ถูกต้องคือ
| ฟิลด์ | ควรใส่ |
|---|---|
| From | อีเมลในโดเมนของเว็บเอง เช่น [email protected] |
| Reply-To | อีเมลของผู้กรอกฟอร์ม |
เมื่อกด Reply ในโปรแกรมอีเมล ระบบจะตอบกลับไปหาลูกค้าตามปกติ โดยอีเมลยังผ่านการตรวจทุกด่าน
ขั้นตอนที่ 1: เตรียมบัญชีอีเมลสำหรับ WordPress SMTP
สร้างบัญชีอีเมลแยกสำหรับ WordPress SMTP โดยเฉพาะ เช่น noreply@ หรือ web@ ในโดเมนเดียวกับเว็บ ไม่ควรใช้บัญชีของพนักงาน เพราะถ้ารหัสผ่านรั่วจากไฟล์ตั้งค่าเว็บ ความเสียหายจะจำกัดอยู่ที่บัญชีนี้บัญชีเดียว
ขั้นตอนที่ 2: ตั้งค่า WordPress SMTP
ใช้ปลั๊กอิน WordPress SMTP ที่ได้รับความนิยมและอัปเดตสม่ำเสมอ หรือเขียนเองผ่าน hook phpmailer_init ค่าที่ต้องใช้มีดังนี้
| ค่า | ตัวอย่าง |
|---|---|
| SMTP Host | ชื่อเซิร์ฟเวอร์อีเมลของโดเมน |
| Port | 587 (STARTTLS) หรือ 465 (SSL/TLS) |
| Authentication | เปิด พร้อมชื่อผู้ใช้และรหัสผ่านของบัญชีจากขั้นตอนที่ 1 |
| From | บัญชีเดียวกับที่ใช้ยืนยันตัวตน |
ตัวอย่างการตั้งค่าผ่านโค้ดใน must-use plugin โดยเก็บรหัสผ่านไว้ใน wp-config.php แทนฐานข้อมูล
add_action( 'phpmailer_init', function ( $phpmailer ) {
$phpmailer->isSMTP();
$phpmailer->Host = SMTP_HOST;
$phpmailer->Port = 587;
$phpmailer->SMTPSecure = 'tls';
$phpmailer->SMTPAuth = true;
$phpmailer->Username = SMTP_USER;
$phpmailer->Password = SMTP_PASS;
$phpmailer->setFrom( SMTP_USER, get_bloginfo( 'name' ), false );
} );
ไม่ควรตั้ง WordPress SMTP ด้วยพอร์ต 25 เพราะเป็นพอร์ตสำหรับเซิร์ฟเวอร์ส่งต่อกัน และผู้ให้บริการจำนวนมากบล็อกขาออกเพื่อป้องกันสแปม
