วิธีการใช้ SES จาก PHP ผ่าน SMTP ใน EC2

วิธีการใช้ SES จาก PHP ผ่าน SMTP เป็นการส่งอีเมลโดยใช้คำสั่งรันใน Amazon linux 2 เพื่อให้สามารถส่งอีเมลได้ ซึ่งในบทความนี้เป็นการสาธิตการตั้งค่า Postfix ในการส่งอีเมลจาก PHP ผ่าน SMTP สามารถเข้ามาศึกษาได้ที่บทความนี้เลย

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

บทความนี้เป็นการอธิบายเกี่ยวกับวิธีการใช้ SES จาก PHP ผ่าน SMTP ใน EC2

สิ่งที่ต้องมี

ให้ทำการลงทะเบียน Email และสร้าง SMTP ใน SES จากนั้นสร้าง EC2 Instance ตามด้วยรันคำสั่งในบทความ PHP 8.0 ทั้งหมด ให้ทำตามขั้นตอนเรียงตามลิงก์นี้ได้เลย

ข้อกำหนดเบื้องต้น

ก่อนจะเริ่มทำให้ตรวจสอบสิ่งต่อไปนี้อีกครั้ง

  • Email Address สำหรับใช้รับ-ส่ง ที่ได้ลงทะเบียนใน SES email_from-to

  • SMTP ที่สร้างใน SES smtp_user-password smtp_endpoint

  • EC2 Instance ที่กำลังใช้งานอยู่ ec2-smtp

  • การติดตั้ง PHP 8.0 และ Apache S-PHP8-9

ตัวอย่างบันทึก Email กับ SMTP ใน Notepad

Email from: tinnakorn.maneewong@classmethod-thailand.com
Email to: tinnakorn.maneewong@classmethod.co.th

SMTP Username: ********************
SMTP Password: ********************************************

SMTP endpoint: email-smtp.ap-southeast-1.amazonaws.com
STARTTLS Port: 587

เมื่อทำตามขั้นตอนในหัวข้อ สิ่งที่ต้องมี เสร็จเรียบร้อยแล้ว ให้เริ่มทำการใช้ SES จาก PHP ผ่าน SMTP ได้เลย

การใช้ SES จาก PHP ผ่าน SMTP

กลับมาที่โปรแกรม PuTTy แล้วรันคำสั่งตามขั้นตอนในหัวข้อนี้ได้เลย

รันคำสั่งนี้เพื่อเข้าไปยังโฟลเดอร์ html

cd /var/www/html/

php_smtp-1

รันคำสั่งนี้เพื่อแก้ไขไฟล์ mail.php

vi mail.php

php_smtp-2

เมื่อเข้ามาที่ไฟล์ mail.php ได้แล้ว กดปุ่มiเพื่อให้มีข้อความ-- INSERT --แสดงขึ้นมาด้านล่างซ้าย
จากนั้น Copy Code ด้านล่างนี้ไปวางในไฟล์ mail.php แล้วแก้ชื่อ email ที่ต้องการรับ-ส่ง

  • recipient_email = อีเมลผู้รับ
  • sender_email = อีเมลผู้ส่ง
<?php
$mailto = "recipient_email";
$title = "Test Title";
$message = "Mail\r\nBody";
$headers = 'From: sender_email' . "\r\n" .
    'Reply-To: sender_email' . "\r\n";

if (mail($mailto, $title, $message, $headers)) {
    echo "Success";
}else{
    echo "Fail";
}

php_smtp-3

เมื่อจัดการไฟล์ mail.php เสร็จเรียบร้อยแล้ว ให้กดปุ่มEsc
จากนั้นพิมพ์:xหรือ:wqเพื่อทำการบันทึกการแก้ไขไฟล์ (จะใช้คำสั่งไหนก็ได้)
php_smtp-4

รันคำสั่งนี้เพื่อส่งอีเมล เมื่อรันไปแล้วจะมีข้อความแสดงขึ้นมาว่าSuccessซึ่งเมลจะยังไม่เข้ามา ให้ทำขั้นตอนถัดไปได้เลย

php mail.php

php_smtp-5

รันคำสั่งการตรวจสอบ Maillog เพื่อดูสถานะของ Postfix

less /var/log/maillog

less-1

สังเกตที่คำว่าConnection timed outหมายความว่า Postfix ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์อีเมลภายนอกได้
จากนั้นกดปุ่มqเพื่อออกจากหน้านี้
less-2

การตั้งค่า Postfix

รันคำสั่งนี้ลงไปโดยใช้ SMTP endpoint ดังนี้:
SMTP endpoint:email-smtp.ap-southeast-1.amazonaws.com
STARTTLS Port:587

เนื้อหาส่วนของ "SMTP endpoint" จะมีการเปลี่ยนแปลงไปตาม รีเจี้ยน ที่เราเลือกใช้งาน

postconf -e "relayhost = [email-smtp.ap-southeast-1.amazonaws.com]:587"

php_smtp-6

รันคำสั่งนี้พร้อมกัน

postconf -e "smtp_sasl_auth_enable = yes" \
"smtp_sasl_security_options = noanonymous" \
"smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd"

php_smtp-7

รันคำสั่งนี้พร้อมกัน

postconf -e "smtp_use_tls = yes" \
"smtp_tls_loglevel = 1" \
"smtp_tls_security_level = encrypt" \
"smtp_tls_note_starttls_offer = yes" \
"smtp_tls_CAfile = /etc/ssl/certs/ca-bundle.crt"

php_smtp-8

รันคำสั่งนี้ลงไป

postconf -e "mynetworks = 127.0.0.0/8"

php_smtp-9

รันคำสั่งนี้โดยการเปลี่ยน*ให้เป็น SMTP Username และ SMTP Password ของเรา

เนื้อหาส่วนของ "SMTP endpoint:email-smtp.ap-southeast-1.amazonaws.com" จะมีการเปลี่ยนแปลงไปตาม รีเจี้ยน ที่เราเลือกใช้งาน

echo "[email-smtp.ap-southeast-1.amazonaws.com]:587 ********************:********************************************" > /etc/postfix/sasl_passwd

php_smtp-10-fix

ในส่วนต่อไปจะเป็นการรันคำสั่งเกี่ยวกับ Permission ให้รันคำสั่งพร้อมกันดังนี้

chown root:root /etc/postfix/sasl_passwd
chmod 600 /etc/postfix/sasl_passwd
postmap hash:/etc/postfix/sasl_passwd
chown root:root /etc/postfix/sasl_passwd.db
chmod 600 /etc/postfix/sasl_passwd.db

php_smtp-11

จากนั้นรันคำสั่งนี้เพื่อ restart postfix

systemctl restart postfix

php_smtp-12

การส่งอีเมล

ต่อไปเราจะมาทำการทดสอบการส่งอีเมลโดยใช้คำสั่งsendmail

ซึ่งจะทำการส่งอีเมลจาก tinnakorn.maneewong@classmethod-thailand.com ไปยัง tinnakorn.maneewong@classmethod.co.th

รันคำสั่งส่งอีเมลดังนี้โดยการ Copy และวางลงไปทีละบรรทัด

sendmail -f tinnakorn.maneewong@classmethod-thailand.com tinnakorn.maneewong@classmethod.co.th

From: tinnakorn.maneewong@classmethod-thailand.com
Subject: TEST Subject 1

TEST BODY
Yes
Thank you
.

send_mail-1

ตรวจสอบอีเมลของผู้รับ จะเห็นว่ามีอีเมลถูกส่งเข้ามา send_mail-2

การตั้งค่า PHP

รันคำสั่งนี้เพื่อแก้ไขไฟล์ php.ini

vi /etc/php.ini

send_mail-3

เมื่อเข้ามาที่ไฟล์แล้ว พิมพ์คำว่า/mailขณะพิมพ์ข้อความจะปรากฎด้านล่างซ้าย
send_mail-4

เมื่อพิมพ์เสร็จแล้วให้กดลูกศรเลื่อนลงมาจนกว่าจะเจอคำว่าsendmail_path = /usr/sbin/sendmail -t -i
send_mail-5

จากนั้นกดปุ่มiเพื่อให้มีข้อความ-- INSERT --แสดงขึ้นมาด้านล่างซ้าย
ต่อมาให้ใส่;ไว้ข้างหน้าคำว่าsendmail_path = /usr/sbin/sendmail -t -i
ตามด้วยใส่คำสั่งด้านล่างนี้ในบรรทัดถัดไป พร้อมกับอีเมลที่เราต้องการใช้ในการส่ง

sendmail_path = /usr/sbin/sendmail -t -i -f tinnakorn.maneewong@classmethod-thailand.com

send_mail-6

เมื่อจัดการไฟล์ php.ini เสร็จเรียบร้อยแล้ว ให้กดปุ่มEsc
จากนั้นพิมพ์:xหรือ:wqเพื่อทำการบันทึกการแก้ไขไฟล์ (จะใช้คำสั่งไหนก็ได้)
send_mail-7

รันคำสั่งนี้เพื่อส่งอีเมลอีกครั้ง

php mail.php

send_mail-8

ตรวจสอบอีเมลผู้รับอีกครั้ง จะเห็นว่ามีอีเมลถูกส่งเข้ามาแล้ว
send_mail-9

สรุป

ทั้งหมดนี้ก็คือการสาธิตวิธีการใช้ SES จาก PHP ผ่าน SMTP โดยทั่วไปการส่งอีเมลนั้นมีหลายวิธีที่สามารถทำได้มากมาย ซึ่งในบทความนี้เราได้อธิบายโดยการส่งอีเมลผ่านคำสั่งต่างๆ รวมไปถึงการตั้งค่า Postfix เพื่อให้สามารถใช้งาน SES และทำการส่งอีเมลผ่าน PHP ผ่าน SMTP ได้นั่นเอง

บทความที่เกี่ยวข้อง

อ้างอิง: https://densan-hoshigumi.com/aws/aws-postfix-ses-send-email