การส่งอีเมลผ่าน PHP โดยใช้ SMTP

การส่งอีเมลผ่านทาง PHP โดยใช้ฟังก์ชั่น mail() ของ PHP เองนั้นบางครั้งอาจประสบปัญหา เช่น ส่งไม่ได้, ส่งไม่ออก ซึ่งเป็นกันมากบน Windows เพราะไม่มี SMTP server ติดตั้งไว้. บางกรณีส่งได้ก็มักจะไปลงใน  junk email ของผู้รับเสมอเพราะอีเมลผู้ส่งมาจาก domain ของ server และขาดความน่าเชื่อถือ แต่ถึงกระนั้นการส่งจากอีเมลที่มีจริงผ่าน SMTP ก็อาจช่วยได้ไม่มาก ขึ้นอยู่กับการตั้งค่าของผู้รับด้วย. ปัญหาใหญ่ๆมักจะมาจากการส่งอีเมลผ่าน mail() ของ PHP ไม่ได้เสียมากกว่า การส่งโดยใช้ SMTP จึงมาช่วยเหลือในงานนี้.

เริ่มจากติดตั้ง PHPMailer โดยการติดตั้งในยุคปัจจุบันนี้แนะนำให้ทำผ่าน composer โดยใช้คำสั่ง composer require phpmailer/phpmailer ในโฟลเดอร์ที่ต้องการทดสอบส่งอีเมล แล้วรอจนทำการติดตั้งสำเร็จ.

สร้างไฟล์ทดสอบส่งอีเมลตามนี้ เช่นกำหนดให้ชื่อไฟล์ test-smtp.php

<?php
require_once 'vendor/autoload.php';


$htmlbody = 'แสดงเนื้อหาเมลเป็นแบบ <b>html</b>';

$Mailer = new \PHPMailer\PHPMailer\PHPMailer(true);

try {
    $Mailer->SMTPDebug = 4;
    // smtp authentication data.
    $Mailer->isSMTP();
    $Mailer->SMTPAuth = true;
    $Mailer->Host = 'mail.domain.tld';
    $Mailer->Username = 'noreply@domain.tld';
    $Mailer->Password = 'MyPasswordHere';
    // sender and receipient.
    $Mailer->setFrom('noreply@domain.tld');
    $Mailer->addAddress('name@domain.tld');
    $Mailer->addAddress('name2@domain.tld');
    // subject and content.
    $Mailer->isHTML(true);
    $Mailer->CharSet = 'utf-8';
    $Mailer->Subject = 'หัวข้ออีเมลภาษาใดๆก็อ่านได้';
    $Mailer->Body = $htmlbody;
    $Mailer->AltBody = 'ข้อความสำหรับผู้รับที่อ่านได้แต่อีเมลแบบ text อย่างเดียว';
    // send it.
    $Mailer->send();
    echo 'Message has been sent.';
} catch (\Exception $e) {
    echo 'Message could not be sent. Mailer Error: ', $Mailer->ErrorInfo;
}

กำหนด SMTP host และ username+password ต่างๆให้ถูกต้อง
การกำหนด SMTPDebug ให้กำหนด 4 ในเบื้องต้นสำหรับการเขียนทดสอบดูการทำงาน หรือกำหนด 3 ในการเขียนโค้ดจริงและทดสอบจนแน่ใจว่าทำงานได้ก่อนที่จะปรับมาเป็น 0 เพื่อใช้งานบน server จริง. ทั้งนี้เพื่อจะได้ทราบข้อมูลจุดบกพร่องต่างๆ สาเหตุที่ส่งอีเมลไมได้ และทำการแก้ไขต่อไป.
หากใช้งานผ่าน SSL, TLS ให้กำหนด $Mailer->SMTPSecure = 'tls'; เป็นค่าที่จะใช้ เช่น ssl, tls.
หาก SMTP ที่ใช้นั้นไม่ได้ใช้ port 25 ปกติ ให้กำหนด $Mailer->Port = 25; เข้าไปโดยเปลี่ยนเป็นเลข 25 เป็น SMTP port ที่ถูกต้อง.
Charset ก็ควรใช้ utf-8 เพื่อการรองรับอักขระภาษาต่างๆได้หลากหลายรวมทั้งภาษาไทยอย่างไม่มีปัญหา และไม่ต้องกังวลว่าจะใส่ subject ภาษาไทยไม่ได้อีกต่อไป
จากนั้นทดลองเรียกไฟล์จาก web address เช่น http://localhost/test-smtp.php

รายละเอียดที่ debug ออกมา

thai subject email
เมื่อผู้รับไม่สามารถรับอีเมลแบบ html ได้ ก็ยังอ่านได้จากค่า AltBody ที่เรากำหนดไว้

html content email
ผู้รับสามารถรับ html email ได้ก็จะแสดงข้อความที่เป็น html ที่ถูกต้องออกมาได้

สำหรับค่า method และ property อื่นๆของ PHPMailer นี้นั้นสามารถเปิดดูได้จาก API document ซึ่งมีอธิบายรายละเอียดไว้ครบถ้วน หรือจะดูจากโค้ดตัวอย่างที่ผู้จัดทำได้ทำไว้ให้ก็ได้เช่นกัน.

คำแนะนำสำหรับการเขียน html เพื่อใช้ใน email
เราต้องเข้าใจว่า email client ของแต่ละที่แต่ละโปรแกรมนั้น มีความสามารถในการแสดง email แบบ html ไม่เหมือนกัน ดังนั้นขอให้ทดสอบให้มากที่สุดสำหรับ email client ต่างๆเช่น outlook, thunder bird, opera, gmail, hotmail, yahoo mail, lotus note และอื่นๆ

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *

คุณอาจใช้แท็กHTMLและแอททริบิวต์เหล่านี้: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>