この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
บทความนี้เป็นการอธิบายเกี่ยวกับวิธีการใช้ 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