โปรแกรมส่งอีเมลเป็นโปรแกรมที่เขียนง่าย และสามารถนำไปประยุกต์ใช้งานได้หลากหลาย เช่นการแจ้งโปรโมชั่นกับลูกค้า การส่งจดหมายเวียน และการใช้ยืนยันการสมัครสมาชิกของเว็บไซต์ เป็นต้น โดยบทความนี้จะเลือกใช้ภาษา Python ซึ่งกำลังได้รับความนิยมเป็นอย่างมากในปัจจุบัน เนื่องจากเป็นภาษาที่เรียนรู้ง่ายแม้จะไม่เคยเขียนโปรแกรมมาก่อน และยังสามารถนำไปต่อยอดใช้กับการเขียนโปรแกรมด้าน Data Science และ Machine Learning ได้อีกด้วย
การที่เราสามารถส่งอีเมลถึงกันได้นั้นเป็นเพราะมีการใช้งานโปรโตคอล SMTP หรือ IMAP (บทความนี้จะกล่าวถึงโปรโตคอล SMTP เท่านั้น) โดยโปรแกรมส่งอีเมลที่เราใช้จะส่งอีเมลไปยังเครื่อง SMTP เซิร์ฟเวอร์ต้นทาง แล้วเจ้าเซิร์ฟเวอร์ดังกล่าวก็จะพยายามติดต่อกับเครื่อง SMTP เซิร์ฟเวอร์ปลายทางเพื่อทำการส่งอีเมลกันต่อไป
บทความนี้จะสาธิตการเขียนโปรแกรมเพื่อส่งอีเมล ดังนั้นเราจึงสนใจแค่การส่งอีเมลไปยัง SMTP เซิร์ฟเวอร์ต้นทางเพียงเท่านั้น เพราะงานส่วนที่เหลือเป็นหน้าที่ของ SMTP เซิร์ฟเวอร์ที่จะเป็นผู้ดำเนินการในขั้นตอนต่อไป
โดยทั่วไปเราจะใช้ SMTP เซิร์ฟเวอร์ของผู้ให้บริการอินเตอร์เน็ต เช่น เครื่องเซิร์ฟเวอร์ smtp.3bbmail.com ของค่าย 3BB เป็นต้น ซึ่งเราจะต้องมีบัญชีผู้ใช้ และรหัสผ่านจึงจะสามารถส่งอีเมลไปยังเครื่อง SMTP เซิร์ฟเวอร์นั้นๆ ได้
แต่บทความนี้จะใช้บริการ https://mailtrap.io/ ซึ่งเป็นบริการเซิร์ฟเวอร์ SMTP ปลอมเพื่อใช้สำหรับการทดสอบเขียนโปรแกรมส่งอีเมลเท่านั้น (อีเมลจะไม่ถูกส่งจริงไปยังผู้รับ)
ผู้อ่านสามารถสมัครใช้บริการของ mailtrap.io ได้ฟรีที่ https://mailtrap.io/register/signup ครับ
หลังจากสมัครใช้งาน Mailtrap.io แล้วเราสามารถดูค่าต่างๆ สำหรับใช้ในการเขียนโค้ด ตามรูปภาพข้างบนครับ โดยค่าที่เราต้องนำไปใช้ คือ Host, Port, Username และ Password
โปรแกรมนี้จะเขียนโค้ดทั้งหมดในไฟล์เพียงไฟล์เดียว โดยการสั่งให้โปรแกรมทำงานจะใช้วิธีการพิมพ์คำสั่งในโปรแกรม Terminal หรือ cmd.exe ครับ
Path
|-main.py
พิมพ์คำสั่งที่ Terminal
# สั่งให้โปรแกรมทำงาน
python main.py
smtplib
ไฟล์ main.py
# ใช้งานโมดูล
import smtplib
# กำหนดตัวแปรชื่อผู้ใช้ และ รหัสผ่าน ตามบัญชีผู้ใช้
username = 'f45df0b274f...'
password = 'dc071f44e10...'
# กำหนดตัวแปรอีเมลผู้ส่ง และ ผู้รับ
sender = '[email protected]'
recipient = '[email protected]'
# เนื้อหาของอีเมล
body = """
Hello
World
"""
mail = body
# ตั้งค่าเซิร์ฟเวอร์ด้วยชื่อโฮส และ พอร์ท
server = smtplib.SMTP('smtp.mailtrap.io', 25)
server.login(username, password)
server.sendmail(sender, recipient, mail)
server.quit()
หลังจากโปรแกรมทำงานเสร็จแล้ว (โดยไม่มี Error) จะเห็นว่าอีเมลถูกส่งไปยัง Mailtrap.io ซึ่งทำหน้าที่เป็นเครื่อง SMTP เซิร์ฟเวอร์ให้กับเรา
มาถึงขั้นตอนนี้จะสังเกตุเห็นว่าแม้เราจะระบุผู้รับด้วยโค้ด server.sendmail(sender, recipient, mail)
แต่ผลลัพธ์ที่เห็นเหมือนกับไม่มีผู้รับถูกระบุอยู่ในอีเมลอยู่ดี
ปัญหาที่เจอในขั้นตอนนี้คือโดย Default เจ้าโมดูล smtplib
จะไม่สร้าง SMTP Header โดยอัตโนมัติให้กับเรา เราจึงต้องทำการแก้ไขโค้ดเพื่อให้ SMTP Header มีหน้าตาเหมือนกับรูปด้านล่างครับ
ไฟล์ main.py
# ใช้งาน f-string
header = f'To: { recipient }'
# mail = body
# จะต้องมีบรรทัดว่าง 1 บรรทัด ระหว่าง header และ body
mail = header + '\n' + body
ในครั้งนี้ จะเห็นว่ามีทั้งชื่อผู้ส่ง และผู้รับถูกต้องครบถ้วนครับ
import smtplib
username = 'f45df0b274f...'
password = 'dc071f44e10...'
sender = '[email protected]'
recipient = '[email protected]'
body = """
Hello
World
"""
header = f'To: { recipient }\n'
mail = header + body
server = smtplib.SMTP('smtp.mailtrap.io', 25)
server.login(username, password)
server.sendmail(sender, recipient, mail)
server.quit()
บทความตอนนี้จะเพียงแค่สาธิตการเขียนโปรแกรมด้วย Python เพื่อส่งอีเมลไปยัง SMTP เซิร์ฟเวอร์ครับ ซึ่งผู้อ่านน่าจะพอสังเกตุเห็นแล้วว่าโปรแกรมของเรายังขาดความสมบูรณ์อีกหลายส่วน เช่น Subject ของอีเมล การส่งอีเมลหาผู้รับครั้งละหลายๆ คนเป็นต้น โดยเราจะยกยอดไปต่อกันในตอนหน้าครับ