เขียนโปรแกรมส่งอีเมลด้วยภาษา Python

โปรแกรมส่งอีเมลเป็นโปรแกรมที่เขียนง่าย และสามารถนำไปประยุกต์ใช้งานได้หลากหลาย เช่นการแจ้งโปรโมชั่นกับลูกค้า การส่งจดหมายเวียน และการใช้ยืนยันการสมัครสมาชิกของเว็บไซต์ เป็นต้น โดยบทความนี้จะเลือกใช้ภาษา Python ซึ่งกำลังได้รับความนิยมเป็นอย่างมากในปัจจุบัน เนื่องจากเป็นภาษาที่เรียนรู้ง่ายแม้จะไม่เคยเขียนโปรแกรมมาก่อน และยังสามารถนำไปต่อยอดใช้กับการเขียนโปรแกรมด้าน Data Science และ Machine Learning ได้อีกด้วย

ผู้ให้บริการ SMTP

การที่เราสามารถส่งอีเมลถึงกันได้นั้นเป็นเพราะมีการใช้งานโปรโตคอล SMTP หรือ IMAP (บทความนี้จะกล่าวถึงโปรโตคอล SMTP เท่านั้น) โดยโปรแกรมส่งอีเมลที่เราใช้จะส่งอีเมลไปยังเครื่อง SMTP เซิร์ฟเวอร์ต้นทาง แล้วเจ้าเซิร์ฟเวอร์ดังกล่าวก็จะพยายามติดต่อกับเครื่อง SMTP เซิร์ฟเวอร์ปลายทางเพื่อทำการส่งอีเมลกันต่อไป

บทความนี้จะสาธิตการเขียนโปรแกรมเพื่อส่งอีเมล ดังนั้นเราจึงสนใจแค่การส่งอีเมลไปยัง SMTP เซิร์ฟเวอร์ต้นทางเพียงเท่านั้น เพราะงานส่วนที่เหลือเป็นหน้าที่ของ SMTP เซิร์ฟเวอร์ที่จะเป็นผู้ดำเนินการในขั้นตอนต่อไป

Mailtrap.io

โดยทั่วไปเราจะใช้ 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 = 'foo@gmail.com'
recipient = 'bar@gmail.com'

# เนื้อหาของอีเมล
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 มีหน้าตาเหมือนกับรูปด้านล่างครับ

แก้ไข 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 = 'foo@gmail.com'
recipient = 'bar@gmail.com'

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 ของอีเมล การส่งอีเมลหาผู้รับครั้งละหลายๆ คนเป็นต้น โดยเราจะยกยอดไปต่อกันในตอนหน้าครับ

つづく