ส่ง Email จากเว็บไซต์ได้ยังไง — ตั้งค่า PHP Mail, SMTP และ Email Hosting

เว็บไซต์ทุกประเภท ตั้งแต่ร้านค้าออนไลน์ที่ต้องส่งอีเมลยืนยันคำสั่งซื้อ ไปจนถึงแบบฟอร์มติดต่อบนเว็บ 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 ใดๆ ฟังดูสะดวก แต่ในทางปฏิบัติมีปัญหาหลายอย่างที่ทำให้อีเมลไม่ถึงผู้รับ:

สรุป: 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

  1. เข้า WordPress Admin Dashboard → Plugins → Add New
  2. ค้นหา "WP Mail SMTP" → Install Now → Activate
  3. ไปที่ WP Mail SMTP → Settings → General
  4. กรอก From Email (อีเมลที่จะแสดงในช่อง "From") และ From Name
  5. เลือก Mailer ที่ต้องการใช้ (Gmail, SMTP ของ Hosting, Mailgun ฯลฯ)
  6. กรอกข้อมูล Credentials ตามที่เลือก → Save Settings
  7. ทดสอบส่งที่ WP Mail SMTP → Tools → Email Test

วิธีที่ 1: ใช้ Gmail SMTP ด้วย App Password

Google ไม่อนุญาตให้ใช้ Password ปกติกับ SMTP อีกต่อไป ต้องสร้าง App Password แทน ซึ่งเป็น Password 16 ตัวอักษรที่ใช้แทน Password จริงสำหรับแอปพลิเคชันที่ไม่รองรับ 2FA:

  1. เปิด Google Account ของคุณ → Security → 2-Step Verification (ต้องเปิดก่อน)
  2. ค้นหา "App passwords" ที่ด้านล่างของหน้า Security
  3. เลือก App: "Mail" และ Device: "Other (Custom name)" → กรอกชื่อเว็บ
  4. กด Generate — จะได้ Password 16 ตัวอักษร (เก็บไว้ จะแสดงแค่ครั้งเดียว)
  5. กลับไปที่ WP Mail SMTP → เลือก Mailer: "Other SMTP"
  6. กรอกข้อมูล: 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:

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

  1. Login DirectAdmin → หมวด E-mail Management
  2. คลิก E-mail Accounts
  3. คลิก Create Account
  4. กรอก Username (เช่น noreply หรือ contact) และตั้ง Password
  5. กำหนด Quota (ขนาด Mailbox) ตามต้องการ
  6. กด Create — อีเมล Address จะพร้อมใช้งานทันที

ค่า SMTP ที่ใช้งานกับ Email Account บน DirectAdmin

SMTP SERVER

mail.yourdomain.com

แทนที่ yourdomain.com ด้วย Domain ของคุณ ค่านี้ใช้ได้ทั้ง SMTP, IMAP และ POP3

PORT (แนะนำ)

587 พร้อม STARTTLS

Port มาตรฐานสำหรับ Authenticated SMTP ที่ผ่าน Firewall ส่วนใหญ่ได้ ใช้ร่วมกับ Encryption: TLS

PORT (ทางเลือก)

465 พร้อม SSL/TLS

SMTPS — เชื่อมต่อผ่าน SSL ตั้งแต่ต้น ถ้า Port 587 ถูกบล็อกโดย ISP หรือ Firewall ให้ลองใช้ Port นี้แทน

AUTHENTICATION

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

  1. Login DirectAdmin → หมวด Domain Management → DNS Management
  2. เลือก Domain ที่ต้องการตั้งค่า
  3. เพิ่ม TXT Record สำหรับ SPF: Name = @ หรือ Domain, Value = SPF Record
  4. สำหรับ DKIM: DirectAdmin รุ่นใหม่มีปุ่ม Enable DKIM ใน E-mail Manager → กด Enable แล้วระบบจะสร้าง Key Pair และเพิ่ม DNS Record อัตโนมัติ
  5. เพิ่ม 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 แทน:

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:

วิธีทดสอบด้วย mail-tester.com

  1. เข้า mail-tester.com — จะได้ Temporary Email Address เช่น [email protected]
  2. ส่งอีเมล Test จากระบบของคุณไปที่ Address นั้น
  3. กลับมาที่ mail-tester.com แล้วกด "Then check your score"
  4. ดูคะแนนและรายละเอียดที่ต้องแก้ไข เป้าหมายคือ 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