nitip.at

nitip.at

ทำให้ PHP docker image ของเราสามารถใช้คำสั่ง mail() ได้

ทำให้ PHP docker image ของเราสามารถใช้คำสั่ง mail() ได้

Nitipat Lowichakornthikun's photo
Nitipat Lowichakornthikun
·Oct 16, 2018·

1 min read

ปกติตัว Official docker image ของ PHP ที่มีอยู่ตอนนี้เราจะพบปัญหาที่เราไม่สามารถใช้คำสั่ง mail ในการส่งอีเมล์ด้วย smtp server ด้านนอกได้ เช่นการส่งผ่าน smtp ของ Gmail, mailgun และ เจ้าอื่น ๆ โดยต้นตอของปัญหามันก็เนื่องจากไอ้เจ้าคำสั่ง mail บน PHP นี้มันจะไปอิงกันกับตัวคำสั่งของตัว OS เลย ซึ่งถ้าเรารันอยู่บน Linux หรือ Mac คำสั่ง mail ก็จะถูกชี้ไปที่คำสั่ง sendmail ของ OS นั้น ๆ ครับ ซึ่งคำสั่งนี้เราเรียกว่า Mail Transfer Agent (MTA) จากการที่ผมลองค้นหา MTA เพิ่มเติมก็พบว่ามีหลายตัวให้เลือกใช้งานได้ ส่วนมากก็แนะนำให้ใช้ Postfix แทน แต่ผมมองดูแล้วมันก็ยังค่อนข้างวุ่นวายพอตัวครับ

6 Best Mail Transfer Agents (MTA's) for Linux
On a network such as the Internet, mail clients send mails to a mail server which then routes the messages to the…
tecmint.com

ก่อนเราจะไปต่อครับ… เราจะได้ 2 วิธีการแก้ไขปัญหาประมาณนี้ (ใครมีท่าไหนน่าสนใจ แนะนำมาด้วยน่ะครับ)

  1. เปลี่ยนไปใช้การส่งอีเมล์ผ่าน library โดยเราต้องปรับ Code ให้สามารถใช้งานได้ ซึ่ง library แนวนี้ก็มีคนทำไว้อยู่หลายตัวครับ อาทิ PHPMailer เป็นต้น การใช้งานก็ไม่ยากด้วย และ มีลูกเล่นให้สามารถปรับแต่งได้อย่างง่ายดาย
  2. ทำการติดตั้ง MTA ตัวอื่น ๆ บน Docker image เพื่อใช้คำสั่ง mail แบบเดิม

บทความนี้ผมจะเลือกหยิบเอาวิธีที่ 2 มาทำต่อครับ เนื่องจากตัวงานของรอบนี้ที่ผมได้รับผิดชอบนี้ มันไม่ได้ใช้ความสามารถในการส่งอีเมล์ที่มากมายจาก library และ สิ่งที่ผมต้องการคือการส่งอีเมล์ที่เรียบง่าย ไม่ได้มีหน้าตา template ของเนื้อหาอีเมล์ที่สวยงาม อีกทั้งผมก็ยังไม่ต้องการปรับ Code ของการส่งอีเมล์ที่มีอยู่ก่อนหน้านี้ด้วยครับ มันจึงเป็นตัวเลือกที่น่าสนใจทีเดียว

จากที่ได้ลองค้นหาข้อมูลมานั้นผมก็ได้มาพบกับ msmtp คร่าว ๆ มันก็คือตัว MTA ที่สามารถใช้งานได้แทน sendmail เดิมได้เลย และ ช่วยลดปัญหาปวดหัวมากมายอีกด้วย จากขั้นตอนที่ไม่ยากถ้าลองเข้าไปดูน่ะครับ ลิงค์ด้านล่างก็คือการติดตั้ง และ การใช้งานเบื้องต้น ลองเข้าไปดูก่อนได้ครับ ซึ่งวิธีการจากลิงค์นี้เราจะมาใช้ในการทำ Docker image ด้วย

PHP’s mail() function, Linux and an external SMTP server
medium.com

ทีนี้เราจะลองทำให้สามารถใช้งานได้ใน docker image ของเราเอง สำหรับวิธีการก็มีคนทำไว้เรียบร้อยแล้วครับ ให้ลองเข้าไปดูลิงค์นี้ https://github.com/ilyasotkov/docker-php-msmtp ก็จะมีตัวอย่างการติดตั้งรวมถึงการใช้งาน msmtp บน php alpine ครับ ซึ่งขั้นตอนของแต่ละไฟล์ผมจะอธิบายให้ฟังคร่าว ๆ ดังนี้ครับ

  • เมื่อเราลองดูที่ Dockerfile จะพบว่ามีคำสั่งในการติดตั้ง msmtp ลงบน alpine os จากนั้นก็ทำการนำไฟล์ php.ini เข้ามาเพิ่มในส่วนของการ config php เพิ่มเติมในบรรทัดที่ 7 ครับ

  • เมื่อเราลองเปิดดูไฟล์ php.ini ก็จะพบการตั้งค่าให้ mail ไปใช้คำสั่ง msmtp ซึ่งเป็น MTA ตัวใหม่ที่เราเพิ่งติดตั้งไปแทนการใช้คำสั่ง sendmail ที่ตั้งค่าไว้ก่อนหน้าและเราก็ไม่สามารถใช้งานได้

ทีนี้เราก็จะสามารถใช้คำสั่ง mail ใน Docker image เพื่อส่งอีเมล์ผ่าน smtp server ด้านนอกได้แล้วครับ ลองเล่นกันต่อดูแล้วกันน่ะครับ สำหรับวิธีการติดตั้ง และ ตัวอย่างการใช้งานแนะนำว่าให้ลองดูต่อจากลิงค์ github repo ด้านบนน่ะครับ

 
Share this