PHP
การส่ง Email จากเว็บไซต์เป็นฟังก์ชันพื้นฐานที่แทบทุกเว็บต้องการ ไม่ว่าจะเป็นแบบฟอร์มติดต่อ การแจ้งเตือนการสั่งซื้อ หรืออีเมลยืนยันการสมัครสมาชิก บน Shared Hosting ที่ใช้ cPanel มีวิธีส่ง Email ด้วย PHP อยู่ 2 แนวทางหลัก ได้แก่ ฟังก์ชัน mail() ในตัว PHP และไลบรารี PHPMailer ซึ่งเชื่อมต่อผ่าน SMTP โดยตรง บทความนี้จะอธิบายทั้งสองวิธีพร้อมแนะนำการตั้งค่าที่ถูกต้องเพื่อให้ Email ไม่ตกไป Spam
PHP mail() คืออะไร และทำงานอย่างไรบน cPanel
ฟังก์ชัน mail() เป็นฟังก์ชันมาตรฐานของ PHP ที่ใช้ส่งอีเมลผ่าน Mail Transfer Agent (MTA) ของเซิร์ฟเวอร์ บน cPanel Hosting ทั่วไปจะมี Exim ทำหน้าที่เป็น MTA โดยอัตโนมัติ ดังนั้นโค้ด PHP ของคุณสามารถเรียก mail() ได้เลยโดยไม่ต้องติดตั้งอะไรเพิ่ม
อย่างไรก็ตาม mail() มีข้อจำกัดสำคัญ เช่น ไม่รองรับ SMTP Authentication, ไม่รองรับ TLS/SSL, และอีเมลที่ส่งออกไปมักถูกมองว่าเป็น Spam โดยผู้รับ โดยเฉพาะหากโดเมนยังไม่ได้ตั้งค่า SPF หรือ DKIM
วิธีใช้ PHP mail() แบบพื้นฐาน
ตัวอย่างการส่งอีเมลด้วยฟังก์ชัน mail() อย่างง่าย:
<?php
// กำหนดค่าพื้นฐาน
$to = '[email protected]';
$subject = 'ทดสอบส่งอีเมลจาก PHP';
$message = 'สวัสดี นี่คืออีเมลทดสอบจากเว็บไซต์ของเรา';
// Headers สำคัญ
$headers = 'From: [email protected]' . "\r\n";
$headers .= 'Reply-To: [email protected]' . "\r\n";
$headers .= 'Content-Type: text/plain; charset=UTF-8' . "\r\n";
$headers .= 'X-Mailer: PHP/' . phpversion();
// ส่งอีเมล
if (mail($to, $subject, $message, $headers)) {
echo 'ส่งอีเมลสำเร็จ';
} else {
echo 'ส่งอีเมลไม่สำเร็จ กรุณาลองใหม่';
}
?>
From: ใน headers ควรเป็นอีเมลที่อยู่ใต้โดเมนเดียวกันกับ Hosting เช่น [email protected] หากใช้ Gmail หรืออีเมลภายนอก เซิร์ฟเวอร์อาจปฏิเสธการส่งหรืออีเมลตก SpamPHPMailer คืออะไร และทำไมควรใช้แทน mail()
PHPMailer เป็นไลบรารี PHP ยอดนิยมที่ช่วยให้ส่งอีเมลผ่าน SMTP ได้อย่างปลอดภัยพร้อมรองรับ TLS/SSL, HTML Email, การแนบไฟล์ และ SMTP Authentication ซึ่งช่วยลดโอกาสที่อีเมลจะตก Spam ได้อย่างมาก
ติดตั้ง PHPMailer ผ่าน cPanel File Manager
สำหรับ Shared Hosting ที่ไม่มี SSH ให้ติดตั้ง PHPMailer ด้วยวิธีดังนี้:
- ดาวน์โหลด PHPMailer จาก github.com/PHPMailer/PHPMailer เลือก Download ZIP
- แตกไฟล์ ZIP ในเครื่องของคุณ
- เปิด cPanel แล้วเข้า File Manager
- สร้างโฟลเดอร์ใหม่ชื่อ
phpmailerในpublic_html - อัปโหลดไฟล์
src/PHPMailer.php,src/SMTP.phpและsrc/Exception.phpเข้าไปในโฟลเดอร์ที่สร้าง
ตั้งค่า PHPMailer ให้ส่งผ่าน SMTP บน cPanel
หลังจากอัปโหลดไฟล์แล้ว ให้สร้างสคริปต์ส่งอีเมลดังนี้:
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
// โหลดไฟล์ PHPMailer
require 'phpmailer/PHPMailer.php';
require 'phpmailer/SMTP.php';
require 'phpmailer/Exception.php';
$mail = new PHPMailer(true);
try {
// ตั้งค่า SMTP Server (ใช้ cPanel SMTP)
$mail->isSMTP();
$mail->Host = 'mail.yourdomain.com'; // หรือ localhost
$mail->SMTPAuth = true;
$mail->Username = '[email protected]'; // Email account บน cPanel
$mail->Password = 'your-email-password';
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 587; // TLS port (หรือ 465 สำหรับ SSL)
$mail->CharSet = 'UTF-8';
// ผู้ส่งและผู้รับ
$mail->setFrom('[email protected]', 'YourWebsite');
$mail->addAddress('[email protected]', 'ผู้รับ');
$mail->addReplyTo('[email protected]', 'Admin');
// เนื้อหาอีเมล (HTML)
$mail->isHTML(true);
$mail->Subject = 'ทดสอบส่งอีเมลผ่าน PHPMailer';
$mail->Body = '<h2>สวัสดี!</h2><p>นี่คืออีเมล HTML จาก PHPMailer</p>';
$mail->AltBody = 'สวัสดี! นี่คืออีเมลจาก PHPMailer (plain text)';
$mail->send();
echo 'ส่งอีเมลสำเร็จ';
} catch (Exception $e) {
echo 'ส่งอีเมลไม่สำเร็จ: ' . $mail->ErrorInfo;
}
?>
ตรวจสอบ Email Account บน cPanel ก่อนใช้งาน
ก่อนใช้ SMTP ด้วย PHPMailer คุณต้องสร้าง Email Account บน cPanel ก่อน:
- เข้า cPanel แล้วคลิก Email Accounts
- กด Create แล้วกรอก Username เช่น
no-reply - กรอก Password ที่แข็งแรง แล้วกด Create
- นำ Email และ Password ที่สร้างไปใส่ใน PHP Code ของคุณ
ตั้งค่า SPF และ DKIM เพื่อป้องกัน Email ตก Spam
แม้จะตั้งค่า SMTP ถูกต้องแล้ว อีเมลก็ยังอาจตก Spam หากโดเมนไม่มี SPF และ DKIM Record ที่ถูกต้อง
บน cPanel ให้เข้าไปที่ Email Deliverability หรือ Authentication ระบบจะตรวจสอบและช่วยสร้าง DNS Record ให้อัตโนมัติ หากพบว่า SPF หรือ DKIM ยังไม่ถูกต้อง ให้กด Repair เพื่อให้ cPanel จัดการให้
ส่ง HTML Email พร้อมแนบไฟล์ด้วย PHPMailer
PHPMailer รองรับการแนบไฟล์ได้อย่างง่ายดาย เพียงเพิ่มบรรทัดต่อไปนี้ก่อนเรียก send():
// แนบไฟล์ PDF
$mail->addAttachment('/path/to/file.pdf', 'เอกสาร.pdf');
// แนบรูปภาพแบบ Inline (ฝังในอีเมล)
$mail->addEmbeddedImage('/path/to/logo.png', 'logo_cid');
// ใช้ใน HTML body ด้วย: <img src="cid:logo_cid">
// ส่งถึงหลายคนพร้อมกัน
$mail->addAddress('[email protected]', 'ผู้รับ 1');
$mail->addAddress('[email protected]', 'ผู้รับ 2');
$mail->addCC('[email protected]', 'สำเนา');
$mail->addBCC('[email protected]', 'สำเนาลับ');
ตรวจสอบว่าการส่ง Email ทำงานถูกต้อง
หลังตั้งค่าเสร็จแล้ว ให้ตรวจสอบด้วยวิธีต่อไปนี้:
<?php
// 1. ตรวจสอบว่า mail() เปิดใช้งานอยู่หรือไม่
echo function_exists('mail') ? 'mail() พร้อมใช้งาน' : 'mail() ถูกปิดใช้งาน';
// 2. ดู PHP mail configuration
echo ini_get('SMTP'); // ค่า SMTP server (Windows)
echo ini_get('sendmail_path'); // Path ของ sendmail (Linux/cPanel)
// 3. ทดสอบ SMTP connection ด้วย PHPMailer debug mode
$mail->SMTPDebug = SMTP::DEBUG_SERVER; // แสดง log การ connect
// 4. ตรวจสอบ Mail Log บน cPanel
// cPanel > Email > Track Delivery จะแสดงสถานะการส่งทุกอีเมล
// 5. ทดสอบด้วย email ของตัวเอง แล้วเช็ค Header ของอีเมลที่ได้รับ
// ใน Gmail: Open Email > More (3 จุด) > Show Original
?>
แก้ปัญหาที่พบบ่อย
Error: "SMTP Error: Could not authenticate"
ปัญหานี้เกิดเมื่อ Username หรือ Password ไม่ถูกต้อง หรือ SMTP Authentication ล้มเหลว ให้ตรวจสอบดังนี้:
- ตรวจสอบว่า Email Account ที่ใช้มีอยู่จริงใน cPanel Email Accounts
- ลองเปลี่ยน Port จาก 587 เป็น 465 และ
ENCRYPTION_STARTTLSเป็นENCRYPTION_SMTPS - ลองใช้
localhostเป็น Host แทนmail.yourdomain.com - ตรวจสอบว่า cPanel ไม่ได้บล็อก SMTP port ด้วย Firewall
Error: "mail(): Failed to connect to mailserver"
เกิดขึ้นเมื่อใช้ฟังก์ชัน mail() และเซิร์ฟเวอร์ไม่สามารถเชื่อมต่อกับ Mail Server ได้ ให้ติดต่อ Hosting Provider เพื่อตรวจสอบว่า Sendmail หรือ Postfix ทำงานอยู่หรือไม่ และให้ลองเปลี่ยนมาใช้ PHPMailer ผ่าน SMTP แทน
Error: "อีเมลส่งสำเร็จแต่ไม่ถึงผู้รับ หรือตก Spam"
ปัญหานี้เกิดจาก Email Reputation ของโดเมนหรือ IP ของเซิร์ฟเวอร์ต่ำ ให้ดำเนินการดังนี้:
- ตั้งค่า SPF Record:
v=spf1 include:yourdomain.com ~all - เปิดใช้งาน DKIM ผ่าน cPanel Email Deliverability
- ตั้งค่า DMARC Record:
v=DMARC1; p=none; rua=mailto:[email protected] - ห้ามใช้ Subject ที่มีคำเช่น "FREE", "WINNER", "ด่วน!!!" เพราะ Spam Filter จะจับ
Error: "PHPMailer class not found"
เกิดเมื่อ Path ของไฟล์ PHPMailer ไม่ถูกต้อง ให้ตรวจสอบ Path ใน require ว่าชี้ไปที่ไฟล์ถูกต้อง:
// ใช้ __DIR__ เพื่อให้ Path สัมพัทธ์กับไฟล์ปัจจุบัน
require __DIR__ . '/phpmailer/PHPMailer.php';
require __DIR__ . '/phpmailer/SMTP.php';
require __DIR__ . '/phpmailer/Exception.php';
Error: "SSL: Connection reset by peer" หรือ SSL Error
เกิดเมื่อ SSL/TLS ไม่สามารถต่อเชื่อมได้ ให้ลองเพิ่ม option ต่อไปนี้เพื่อปิดการตรวจสอบ SSL Certificate (ใช้สำหรับทดสอบเท่านั้น ไม่ควรใช้ใน Production):
$mail->SMTPOptions = [
'ssl' => [
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true,
],
];
คำถามที่พบบ่อย
ควรใช้ PHP mail() หรือ PHPMailer ดีกว่า?
แนะนำให้ใช้ PHPMailer เสมอ เพราะรองรับ SMTP Authentication, TLS/SSL, HTML Email และ Attachment ในขณะที่ mail() เหมาะสำหรับการทดสอบเบื้องต้นเท่านั้น และมีโอกาสสูงที่อีเมลจะตก Spam เนื่องจากไม่มีการ Authenticate
Port SMTP บน cPanel ควรใช้ Port อะไร?
cPanel รองรับหลาย Port ดังนี้: Port 25 (ไม่เข้ารหัส ส่วนใหญ่ถูกบล็อก), Port 587 (STARTTLS แนะนำสำหรับส่งออก), Port 465 (SSL/TLS เก่า แต่ยังใช้งานได้), Port 26 (ทางเลือกเมื่อ Port 25 ถูกบล็อก) โดย Port 587 + STARTTLS เป็นตัวเลือกที่แนะนำที่สุด
สามารถส่งอีเมลผ่าน Gmail SMTP บน Shared Hosting ได้ไหม?
ได้ แต่ต้องใช้ App Password แทน Password จริงของ Gmail เนื่องจาก Google ยกเลิกการ login ด้วย Password ปกติสำหรับ Third-party App แล้ว อย่างไรก็ตาม Gmail มี Limit ส่งได้สูงสุด 500 อีเมลต่อวันสำหรับบัญชี Free ซึ่งอาจไม่เพียงพอสำหรับเว็บที่มีผู้ใช้จำนวนมาก ควรใช้ Email Account บน cPanel ของโดเมนตัวเองจะดีกว่า