วิธีการใช้ SES จาก PHP ผ่าน SMTP ใน EC2
บทความนี้เป็นการอธิบายเกี่ยวกับวิธีการใช้ SES จาก PHP ผ่าน SMTP ใน EC2
สิ่งที่ต้องมี
ให้ทำการลงทะเบียน Email และสร้าง SMTP ใน SES จากนั้นสร้าง EC2 Instance ตามด้วยรันคำสั่งในบทความ PHP 8.0 ทั้งหมด ให้ทำตามขั้นตอนเรียงตามลิงก์นี้ได้เลย
- AWS การตั้งค่าพื้นฐานเพื่อใช้งาน SES (Simple Email Service)
- AWS: SES การตั้งค่า SMTP พื้นฐาน
ในส่วนนี้ให้ทำถึงแค่ขั้นตอนที่ได้ SMTP Username และ SMTP Password มาก็พอ จากนั้น Copy SMTP Username, SMTP Password และ Endpoint ไปเก็บไว้ที่ Notepad ก่อน และในส่วนของการรันคำสั่งไม่ต้องทำ ให้ข้ามไปทำขั้นตอนของลิงก์ถัดไปได้เลย
ข้อกำหนดเบื้องต้น
ก่อนจะเริ่มทำให้ตรวจสอบสิ่งต่อไปนี้อีกครั้ง
- Email Address สำหรับใช้รับ-ส่ง ที่ได้ลงทะเบียนใน SES
-
SMTP ที่สร้างใน SES
-
EC2 Instance ที่กำลังใช้งานอยู่
-
การติดตั้ง PHP 8.0 และ Apache
ตัวอย่างบันทึก 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/
รันคำสั่งนี้เพื่อแก้ไขไฟล์ mail.php
vi mail.php
เมื่อเข้ามาที่ไฟล์ 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"; }
เมื่อจัดการไฟล์ mail.php เสร็จเรียบร้อยแล้ว ให้กดปุ่มEsc
จากนั้นพิมพ์:x
หรือ:wq
เพื่อทำการบันทึกการแก้ไขไฟล์ (จะใช้คำสั่งไหนก็ได้)
รันคำสั่งนี้เพื่อส่งอีเมล เมื่อรันไปแล้วจะมีข้อความแสดงขึ้นมาว่าSuccess
ซึ่งเมลจะยังไม่เข้ามา ให้ทำขั้นตอนถัดไปได้เลย
php mail.php
รันคำสั่งการตรวจสอบ Maillog เพื่อดูสถานะของ Postfix
less /var/log/maillog
สังเกตที่คำว่าConnection timed out
หมายความว่า Postfix ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์อีเมลภายนอกได้
จากนั้นกดปุ่มq
เพื่อออกจากหน้านี้
การตั้งค่า 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"
รันคำสั่งนี้พร้อมกัน
postconf -e "smtp_sasl_auth_enable = yes" \ "smtp_sasl_security_options = noanonymous" \ "smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd"
รันคำสั่งนี้พร้อมกัน
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"
รันคำสั่งนี้ลงไป
postconf -e "mynetworks = 127.0.0.0/8"
รันคำสั่งนี้โดยการเปลี่ยน*
ให้เป็น 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
ในส่วนต่อไปจะเป็นการรันคำสั่งเกี่ยวกับ 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
จากนั้นรันคำสั่งนี้เพื่อ restart postfix
systemctl restart postfix
การส่งอีเมล
ต่อไปเราจะมาทำการทดสอบการส่งอีเมลโดยใช้คำสั่ง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 .
ตรวจสอบอีเมลของผู้รับ จะเห็นว่ามีอีเมลถูกส่งเข้ามา
การตั้งค่า PHP
รันคำสั่งนี้เพื่อแก้ไขไฟล์ php.ini
vi /etc/php.ini
เมื่อเข้ามาที่ไฟล์แล้ว พิมพ์คำว่า/mail
ขณะพิมพ์ข้อความจะปรากฎด้านล่างซ้าย
เมื่อพิมพ์เสร็จแล้วให้กดลูกศรเลื่อนลงมาจนกว่าจะเจอคำว่าsendmail_path = /usr/sbin/sendmail -t -i
จากนั้นกดปุ่มi
เพื่อให้มีข้อความ-- INSERT --
แสดงขึ้นมาด้านล่างซ้าย
ต่อมาให้ใส่;
ไว้ข้างหน้าคำว่าsendmail_path = /usr/sbin/sendmail -t -i
ตามด้วยใส่คำสั่งด้านล่างนี้ในบรรทัดถัดไป พร้อมกับอีเมลที่เราต้องการใช้ในการส่ง
sendmail_path = /usr/sbin/sendmail -t -i -f tinnakorn.maneewong@classmethod-thailand.com
เมื่อจัดการไฟล์ php.ini เสร็จเรียบร้อยแล้ว ให้กดปุ่มEsc
จากนั้นพิมพ์:x
หรือ:wq
เพื่อทำการบันทึกการแก้ไขไฟล์ (จะใช้คำสั่งไหนก็ได้)
รันคำสั่งนี้เพื่อส่งอีเมลอีกครั้ง
php mail.php
ตรวจสอบอีเมลผู้รับอีกครั้ง จะเห็นว่ามีอีเมลถูกส่งเข้ามาแล้ว
สรุป
ทั้งหมดนี้ก็คือการสาธิตวิธีการใช้ SES จาก PHP ผ่าน SMTP โดยทั่วไปการส่งอีเมลนั้นมีหลายวิธีที่สามารถทำได้มากมาย ซึ่งในบทความนี้เราได้อธิบายโดยการส่งอีเมลผ่านคำสั่งต่างๆ รวมไปถึงการตั้งค่า Postfix เพื่อให้สามารถใช้งาน SES และทำการส่งอีเมลผ่าน PHP ผ่าน SMTP ได้นั่นเอง
บทความที่เกี่ยวข้อง
- AWS การตั้งค่าพื้นฐานเพื่อใช้งาน SES (Simple Email Service)
- AWS: SES การตั้งค่า SMTP พื้นฐาน
- วิธี Install PHP 8.0 and Apache ใน Amazon Linux 2 ของ EC2
อ้างอิง: https://densan-hoshigumi.com/aws/aws-postfix-ses-send-email