
เว็บไซต์ทุกประเภท ตั้งแต่ร้านค้าออนไลน์ที่ต้องส่งอีเมลยืนยันคำสั่งซื้อ ไปจนถึงแบบฟอร์มติดต่อบนเว็บ Corporate ล้วนต้องการระบบส่ง Email ที่เชื่อถือได้ บทความนี้จะอธิบายตั้งแต่พื้นฐานว่า PHP mail() คืออะไรและทำไมถึงมีปัญหา ไปจนถึงวิธีตั้งค่า SMTP ที่ถูกต้องบน WordPress, PHPMailer, Email Hosting บน DirectAdmin และการตั้ง SPF/DKIM/DMARC ให้อีเมลไม่ตกใน Spam
PHP mail() คืออะไร และทำไมถึงไม่น่าเชื่อถือ
PHP mail() เป็น Built-in Function ของ PHP ที่ใช้ส่งอีเมลโดยตรงผ่าน Sendmail หรือ MTA (Mail Transfer Agent) ที่ติดตั้งอยู่บน Server โดยไม่ต้องกำหนดค่า SMTP ใดๆ ฟังดูสะดวก แต่ในทางปฏิบัติมีปัญหาหลายอย่างที่ทำให้อีเมลไม่ถึงผู้รับ:
- ตกใน Spam เกือบทั้งหมด — เนื่องจาก PHP mail() ส่งอีเมลออกโดยตรงจาก IP ของ Server โดยไม่มี Authentication ที่ถูกต้อง Email Provider อย่าง Gmail, Outlook และ Yahoo ใช้ Spam Filter ที่เข้มงวด และมักจัดอีเมลจาก PHP mail() เป็น Spam ทันที
- ไม่มี SPF/DKIM — PHP mail() ไม่รองรับการเซ็น DKIM Header หรือผ่านกระบวนการ Authentication โดยอัตโนมัติ ทำให้อีเมลไม่มี "ลายเซ็น" ที่ Email Server ปลายทางจะยืนยันได้
- Shared IP Reputation — บน Shared Hosting เซิร์ฟเวอร์เดียวกันมีลูกค้าหลายร้อยราย ถ้าลูกค้ารายอื่นส่ง Spam ออกไป IP นั้นจะถูก Blacklist และส่งผลต่ออีเมลของทุกคนที่ใช้ IP เดียวกัน
- ไม่มี Error Handling ที่ดี — PHP mail() คืนค่า true/false เท่านั้น ไม่สามารถดูว่าอีเมลถูกปฏิเสธหรือ Bounce ด้วยเหตุผลอะไร ทำให้ Debug ยาก
- Rate Limiting — Hosting หลายเจ้า รวมถึง AsiaGB จำกัดจำนวน Email ที่ส่งผ่าน PHP mail() ต่อชั่วโมงเพื่อป้องกัน Abuse
สรุป: PHP mail() เหมาะสำหรับการทดสอบในสภาพแวดล้อม Development เท่านั้น สำหรับ Production ให้ใช้ SMTP ที่มี Authentication ทุกครั้ง
ความแตกต่าง: PHP mail() vs SMTP vs Email API
มีสามวิธีหลักในการส่งอีเมลจากเว็บไซต์ แต่ละวิธีมีจุดแข็งและจุดอ่อนต่างกัน:
| วิธีการ | ความน่าเชื่อถือ | ตั้งค่า | เหมาะกับ |
|---|---|---|---|
| PHP mail() | ต่ำมาก | ง่าย (ไม่ต้องตั้ง) | ทดสอบเท่านั้น |
| SMTP ของ Hosting | ดี | ปานกลาง | ปริมาณน้อย–กลาง |
| Gmail SMTP | ดีมาก | ปานกลาง | เว็บส่วนตัว/SMB |
| Email API (Mailgun/SendGrid) | ดีที่สุด | ซับซ้อนกว่า | ปริมาณสูง/Transactional |
SMTP (Simple Mail Transfer Protocol) คือโปรโตคอลมาตรฐานในการส่งอีเมลผ่าน Authenticated Server โดย Client (เว็บไซต์) จะ Login ด้วย Username/Password ก่อนส่งทุกครั้ง ทำให้ Server ปลายทางมั่นใจว่าอีเมลมาจากผู้ส่งที่ถูกกฎหมาย
Email API อย่าง Mailgun หรือ SendGrid ให้คุณส่งอีเมลผ่าน HTTP API แทน SMTP ซึ่งเร็วกว่า, มี Dashboard วิเคราะห์สถิติ, Retry อัตโนมัติ และรองรับปริมาณหลักพัน–หลักล้านอีเมลต่อเดือน เหมาะสำหรับ E-Commerce ขนาดใหญ่หรือแอปพลิเคชันที่ส่ง Transactional Email จำนวนมาก
ตั้งค่า SMTP บน WordPress ด้วย WP Mail SMTP Plugin
WordPress ใช้ PHP mail() เป็นค่าเริ่มต้น แต่สามารถเปลี่ยนไปใช้ SMTP ได้ง่ายผ่าน Plugin โดยไม่ต้องแก้ไข Code ใดๆ Plugin ที่แนะนำที่สุดคือ WP Mail SMTP (มีมากกว่า 4 ล้าน Active Install)
ขั้นตอนติดตั้ง WP Mail SMTP
- เข้า WordPress Admin Dashboard → Plugins → Add New
- ค้นหา "WP Mail SMTP" → Install Now → Activate
- ไปที่ WP Mail SMTP → Settings → General
- กรอก From Email (อีเมลที่จะแสดงในช่อง "From") และ From Name
- เลือก Mailer ที่ต้องการใช้ (Gmail, SMTP ของ Hosting, Mailgun ฯลฯ)
- กรอกข้อมูล Credentials ตามที่เลือก → Save Settings
- ทดสอบส่งที่ WP Mail SMTP → Tools → Email Test
วิธีที่ 1: ใช้ Gmail SMTP ด้วย App Password
Google ไม่อนุญาตให้ใช้ Password ปกติกับ SMTP อีกต่อไป ต้องสร้าง App Password แทน ซึ่งเป็น Password 16 ตัวอักษรที่ใช้แทน Password จริงสำหรับแอปพลิเคชันที่ไม่รองรับ 2FA:
- เปิด Google Account ของคุณ → Security → 2-Step Verification (ต้องเปิดก่อน)
- ค้นหา "App passwords" ที่ด้านล่างของหน้า Security
- เลือก App: "Mail" และ Device: "Other (Custom name)" → กรอกชื่อเว็บ
- กด Generate — จะได้ Password 16 ตัวอักษร (เก็บไว้ จะแสดงแค่ครั้งเดียว)
- กลับไปที่ WP Mail SMTP → เลือก Mailer: "Other SMTP"
- กรอกข้อมูล: SMTP Host:
smtp.gmail.com, Port:587, Encryption: TLS, Username: Gmail address, Password: App Password ที่ได้มา
ข้อจำกัดของ Gmail SMTP ฟรี: ส่งได้สูงสุด 500 อีเมลต่อวัน (หรือ 100 อีเมลต่อชั่วโมง) สำหรับบัญชี Gmail ทั่วไป ถ้าใช้ Google Workspace จะเพิ่มขึ้นเป็น 2,000 อีเมลต่อวัน เหมาะสำหรับเว็บที่มีปริมาณอีเมลน้อยถึงกลาง
วิธีที่ 2: ใช้ SMTP ของ Hosting เอง
ถ้ามี Email Account บน Hosting ของ AsiaGB อยู่แล้ว สามารถใช้ SMTP Server ของ Hosting ในการส่งอีเมลได้ทันที ซึ่งมีข้อดีตรงที่อีเมลส่งจาก Domain เดียวกับเว็บไซต์ และ SPF/DKIM ตั้งค่าได้ครบกว่า
ค่า SMTP Settings ที่ใช้บน Hosting AsiaGB:
- SMTP Host:
mail.yourdomain.com(แทนที่ด้วย Domain จริง) - SMTP Port:
587(STARTTLS) หรือ465(SSL/TLS) - Encryption: TLS (Port 587) หรือ SSL (Port 465)
- Authentication: เปิดใช้เสมอ
- Username: อีเมล Address เต็ม เช่น
[email protected] - Password: Password ของ Email Account นั้น
Port 587 vs 465: แนะนำ Port 587 พร้อม STARTTLS ก่อน เพราะ Firewall ส่วนใหญ่ไม่บล็อก Port นี้ ถ้าเชื่อมต่อไม่ได้ค่อยลอง Port 465 พร้อม SSL/TLS — ทั้งสองแบบปลอดภัยพอๆ กัน แตกต่างกันแค่วิธีเริ่มต้นการเข้ารหัส
ตั้งค่า SMTP ใน PHP ด้วย PHPMailer
ถ้าพัฒนาเว็บด้วย PHP แบบ Custom หรือใช้ Framework เช่น Laravel, CodeIgniter หรือ Plain PHP PHPMailer คือ Library ที่ดีที่สุดสำหรับการส่งอีเมล รองรับ SMTP, HTML Email, Attachment, และ SSL/TLS ครบครัน
ติดตั้งด้วย Composer
composer require phpmailer/phpmailer
ตัวอย่าง Code ส่งอีเมลด้วย PHPMailer
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
require 'vendor/autoload.php';
$mail = new PHPMailer(true); // true = เปิด Exception
try {
// ตั้งค่า SMTP Server
$mail->isSMTP();
$mail->Host = 'mail.yourdomain.com'; // SMTP Server ของ Hosting
$mail->SMTPAuth = true;
$mail->Username = '[email protected]'; // Email Account
$mail->Password = 'your_email_password'; // Password
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; // TLS
$mail->Port = 587;
// ตั้งค่าผู้ส่งและผู้รับ
$mail->setFrom('[email protected]', 'ชื่อเว็บไซต์');
$mail->addAddress('[email protected]', 'ชื่อผู้รับ');
$mail->addReplyTo('[email protected]', 'ฝ่ายบริการลูกค้า');
// เนื้อหาอีเมล
$mail->isHTML(true);
$mail->CharSet = 'UTF-8'; // สำคัญมากสำหรับภาษาไทย
$mail->Subject = 'ยืนยันการสั่งซื้อ #12345';
$mail->Body = '<h2>ขอบคุณสำหรับการสั่งซื้อ</h2>'
. '<p>คำสั่งซื้อของคุณได้รับการยืนยันแล้ว</p>';
$mail->AltBody = 'ขอบคุณสำหรับการสั่งซื้อ คำสั่งซื้อของคุณได้รับการยืนยันแล้ว';
$mail->send();
echo 'ส่งอีเมลสำเร็จ';
} catch (Exception $e) {
echo "ส่งอีเมลไม่สำเร็จ: {$mail->ErrorInfo}";
}
สำคัญ: อย่าเก็บ SMTP Password ตรงๆ ใน Code ให้ใช้ Environment Variables หรือ Config File ที่อยู่นอก Document Root แทน เพื่อความปลอดภัย และไม่ควร Commit Password เข้า Version Control
Email Hosting ของ AsiaGB บน DirectAdmin
แพ็กเกจ Hosting ของ AsiaGB ทุกแผนรองรับการสร้าง Email Account บน Domain ของคุณผ่าน DirectAdmin Control Panel ซึ่งสามารถใช้สำหรับ SMTP Authentication ได้ทันที
สร้าง Email Account ใน DirectAdmin
- Login DirectAdmin → หมวด E-mail Management
- คลิก E-mail Accounts
- คลิก Create Account
- กรอก Username (เช่น
noreplyหรือcontact) และตั้ง Password - กำหนด Quota (ขนาด Mailbox) ตามต้องการ
- กด Create — อีเมล Address จะพร้อมใช้งานทันที
ค่า SMTP ที่ใช้งานกับ Email Account บน DirectAdmin
mail.yourdomain.com
แทนที่ yourdomain.com ด้วย Domain ของคุณ ค่านี้ใช้ได้ทั้ง SMTP, IMAP และ POP3
587 พร้อม STARTTLS
Port มาตรฐานสำหรับ Authenticated SMTP ที่ผ่าน Firewall ส่วนใหญ่ได้ ใช้ร่วมกับ Encryption: TLS
465 พร้อม SSL/TLS
SMTPS — เชื่อมต่อผ่าน SSL ตั้งแต่ต้น ถ้า Port 587 ถูกบล็อกโดย ISP หรือ Firewall ให้ลองใช้ Port นี้แทน
Username = อีเมล Address เต็ม
ใส่ Email Address ทั้งหมด เช่น [email protected] ไม่ใช่แค่ส่วนหน้า @ — เพราะ DirectAdmin ใช้ Full Address ในการยืนยันตัวตน
SPF, DKIM, DMARC: สำคัญอย่างไร และตั้งค่าอย่างไรใน DirectAdmin
แม้จะตั้งค่า SMTP ถูกต้องแล้ว ถ้าไม่มี SPF, DKIM และ DMARC อีเมลก็ยังมีโอกาสตกใน Spam ได้สูง เพราะ Email Provider ใช้ Record เหล่านี้เพื่อตรวจสอบว่าอีเมลที่อ้างว่ามาจาก Domain ของคุณมาจาก Server ที่ได้รับอนุญาตจริงหรือไม่
SPF (Sender Policy Framework)
SPF เป็น DNS Record ประเภท TXT ที่ระบุว่า IP หรือ Server ใดบ้างที่ได้รับอนุญาตให้ส่งอีเมลในนาม Domain ของคุณ ถ้า Email Server ปลายทางตรวจพบว่าอีเมลมาจาก IP ที่ไม่อยู่ใน SPF Record จะ Mark ว่า Fail และอาจปฏิเสธหรือ Spam ทันที
ตัวอย่าง SPF Record สำหรับ Hosting ที่ใช้ Server ของ AsiaGB:
v=spf1 include:yourhostingserver.com ~all
DKIM (DomainKeys Identified Mail)
DKIM เพิ่ม Digital Signature ให้กับ Email Header ทุกฉบับที่ส่ง Server ปลายทางจะตรวจสอบลายเซ็นนี้กับ Public Key ที่เผยแพร่ใน DNS ถ้าลายเซ็นตรงกัน แสดงว่าอีเมลไม่ถูกแก้ไขระหว่างทาง และมาจาก Domain จริง
DMARC (Domain-based Message Authentication, Reporting and Conformance)
DMARC เป็นนโยบายที่บอก Email Server ปลายทางว่าควรทำอะไรกับอีเมลที่ Fail SPF หรือ DKIM: ไม่ทำอะไร (none), Quarantine (ส่งเข้า Spam) หรือ Reject (ปฏิเสธเลย) และสามารถรับ Report อีเมลที่ถูกปฏิเสธมาวิเคราะห์ได้
วิธีตั้งค่าใน DirectAdmin DNS Manager
- Login DirectAdmin → หมวด Domain Management → DNS Management
- เลือก Domain ที่ต้องการตั้งค่า
- เพิ่ม TXT Record สำหรับ SPF: Name =
@หรือ Domain, Value = SPF Record - สำหรับ DKIM: DirectAdmin รุ่นใหม่มีปุ่ม Enable DKIM ใน E-mail Manager → กด Enable แล้วระบบจะสร้าง Key Pair และเพิ่ม DNS Record อัตโนมัติ
- เพิ่ม TXT Record สำหรับ DMARC: Name =
_dmarc, Value ตัวอย่าง:
# DMARC Record (เริ่มจาก p=none เพื่อ Monitor ก่อน) _dmarc.yourdomain.com TXT "v=DMARC1; p=none; rua=mailto:[email protected]" # เมื่อมั่นใจแล้ว เปลี่ยนเป็น p=quarantine หรือ p=reject _dmarc.yourdomain.com TXT "v=DMARC1; p=quarantine; pct=100; rua=mailto:[email protected]"
แนะนำ: เริ่มด้วย p=none เพื่อเก็บ Report ก่อน 1–2 สัปดาห์ จากนั้นค่อยเปลี่ยนเป็น p=quarantine หรือ p=reject เพื่อป้องกัน Email Spoofing อย่างเต็มรูปแบบ
Mailgun / SendGrid Free Tier: เมื่อไหร่ควรใช้ API แทน SMTP ของ Hosting
SMTP ของ Hosting เหมาะสำหรับเว็บทั่วไปที่ส่งอีเมลปริมาณน้อยถึงปานกลาง แต่เมื่อธุรกิจโตขึ้น มีเหตุผลหลายข้อที่ควรเปลี่ยนมาใช้ Email API แทน:
- ปริมาณอีเมลสูง — ถ้าต้องส่งอีเมล Order Confirmation, Newsletter หรือ Notification มากกว่า 500–1,000 อีเมลต่อวัน SMTP ของ Hosting อาจไม่เพียงพอหรือถูก Rate Limit
- ต้องการ Analytics — Mailgun และ SendGrid ให้ Dashboard ดู Open Rate, Click Rate, Bounce Rate และ Spam Complaint แบบ Real-time ซึ่ง SMTP ทั่วไปไม่มี
- Deliverability สูงกว่า — Email API Provider มี Dedicated IP Pool ที่มี Reputation สูง ผ่านกระบวนการ Warm-up IP อย่างถูกต้อง ทำให้ Inbox Rate ดีกว่า
- Automatic Retry และ Bounce Handling — ถ้าส่งไม่ถึง API จะ Retry อัตโนมัติ และแจ้ง Bounce/Unsubscribe กลับมาผ่าน Webhook
Mailgun Free Tier: ส่งได้ 100 อีเมลต่อวัน ฟรี 3 เดือนแรก หลังจากนั้นเริ่มต้นที่ $35/เดือน สำหรับ 50,000 อีเมล
SendGrid Free Tier: ส่งได้ 100 อีเมลต่อวัน ไม่จำกัดเวลา เหมาะมากสำหรับเว็บขนาดเล็ก
แนะนำ: ถ้าเว็บส่งอีเมลน้อยกว่า 200 ฉบับต่อวัน ใช้ SMTP ของ Hosting ก็เพียงพอและง่ายกว่ามาก ถ้ามากกว่า 500–1,000 ฉบับต่อวัน ควรเริ่มพิจารณา Email API เพื่อ Deliverability ที่ดีกว่า
Checklist ก่อนส่ง Email จาก Production
ก่อน Go Live ให้ตรวจสอบรายการต่อไปนี้ให้ครบทุกข้อ เพื่อให้มั่นใจว่าอีเมลจะถึงผู้รับและไม่ตกใน Spam:
- ตั้งค่า SPF Record ใน DNS แล้ว และ Propagate ครบ (ตรวจสอบที่ mxtoolbox.com/spf.aspx)
- เปิดใช้งาน DKIM ใน DirectAdmin E-mail Manager แล้ว และ DNS Record ถูกต้อง
- เพิ่ม DMARC Record ใน DNS แล้ว (เริ่มด้วย p=none)
- ทดสอบส่งอีเมลไปที่ mail-tester.com และได้คะแนนอย่างน้อย 8/10
- ตรวจสอบว่า From Email ตรงกับ Domain ที่ตั้ง SPF/DKIM (ไม่ใช่ Gmail หรือ Domain อื่น)
- อีเมลมี Unsubscribe Link สำหรับ Marketing Email (กฎ Gmail/Yahoo 2024)
- ทดสอบส่งไปยัง Gmail, Outlook และ Yahoo ว่าอีเมลเข้า Inbox ไม่ใช่ Spam
- ตรวจสอบว่า IP ของ Server ไม่ติด Blacklist ที่ mxtoolbox.com/blacklists.aspx
- Email Subject และ Body ไม่มีคำที่ Trigger Spam Filter เช่น "ฟรี!", "คลิกตอนนี้", "รับเงิน"
- ตั้งค่า Reply-To ให้ถูกต้องและเปิดรับอีเมล (ไม่ใช่ noreply ถ้ายังไม่จำเป็น)
วิธีทดสอบด้วย mail-tester.com
- เข้า mail-tester.com — จะได้ Temporary Email Address เช่น
[email protected] - ส่งอีเมล Test จากระบบของคุณไปที่ Address นั้น
- กลับมาที่ mail-tester.com แล้วกด "Then check your score"
- ดูคะแนนและรายละเอียดที่ต้องแก้ไข เป้าหมายคือ 10/10 หรืออย่างน้อย 9/10
ปัญหาที่พบบ่อยและวิธีแก้ไข
อีเมลตกใน Spam
สาเหตุที่พบบ่อยที่สุด: ไม่มี SPF/DKIM, From Address ไม่ตรงกับ Domain จริง, เนื้อหาอีเมลมีคำ Spam ที่ Trigger Filter, หรือ IP ของ Server ติด Blacklist วิธีแก้ไข: ตั้ง SPF/DKIM ให้ครบ, ทดสอบด้วย mail-tester.com, และตรวจสอบ Blacklist
ส่งได้บางทีไม่ได้บางที
มักเกิดจาก Rate Limiting ของ SMTP Server, Timeout เนื่องจากเครือข่ายไม่เสถียร หรือ Shared IP ถูก Temporary Block โดย Spam Filter วิธีแก้: ตรวจสอบ SMTP Error Log, ลดความถี่การส่ง, หรือเปลี่ยนไปใช้ Email API ที่มี Retry อัตโนมัติ
Email Bounce กลับมา
Bounce มีสองประเภท: Hard Bounce คืออีเมลปลายทางไม่มีอยู่จริงหรือ Domain ไม่ถูกต้อง (ต้องลบออกจาก List ทันที) และ Soft Bounce คือ Mailbox เต็มหรือ Server ปลายทาง Temporary ไม่ว่าง (ระบบจะ Retry อัตโนมัติ) PHPMailer และ Email API ส่วนใหญ่แยก Bounce Type ให้ดูใน Error Message
อีเมลภาษาไทยเป็นอักษรแปลก
ปัญหา Encoding: ต้องตั้ง $mail->CharSet = 'UTF-8' ใน PHPMailer หรือเพิ่ม Header Content-Type: text/html; charset=UTF-8 ใน PHP mail() และต้องบันทึกไฟล์ PHP ด้วย Encoding UTF-8 ด้วย
Email Hosting พร้อม SMTP บน Domain ของคุณ
AsiaGB มี Email Hosting บน DirectAdmin พร้อมรองรับ SMTP, IMAP/POP3, SPF, DKIM สร้าง Email Account ใน Domain ของคุณเองได้เลย Server ตั้งในไทย เริ่มต้น 500 บาท/ปี
ดูแพ็กเกจ Hosting