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

Nitipat Lowichakornthikun
I GEAR GEEK
Published in
2 min readOct 16, 2018

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

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

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

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

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

ทีนี้เราจะลองทำให้สามารถใช้งานได้ใน 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 ด้านบนน่ะครับ

--

--