ในขณะที่ไคลเอนต์อีเมลเชิงพาณิชย์เสนอความสะดวกของ GUI ที่ใช้งานง่าย พวกเขามักขาดความยืดหยุ่นและความสามารถในการปรับแต่งที่นักพัฒนาหรือผู้สร้างเนื้อหาหลายคนต้องการสำหรับความต้องการอีเมลของพวกเขา
ไม่ว่าจะเป็นการส่งอีเมลขอบคุณให้ผู้สมัครสมาชิกใหม่บนช่องโซเชียลมีเดีย หรือเพิ่มฟังก์ชันอีเมลให้โครงการล่าสุดของคุณ ความสามารถในการส่งข้อความอัตโนมัติโดยใช้ SMTP ใน Python เป็นสิ่งที่จะมาถึงประโยชน์แน่นอน
อ่านต่อเพื่อดูว่าคุณสามารถทำให้สคริปต์ Python ส่งอีเมลทำงานบนเครื่องของคุณได้อย่างไรวันนี้
SMTP คืออะไร?
อย่างง่ายๆ SMTP หรือ Simple Mail Transfer Protocol คือโปรโตคอลการสื่อสารสำหรับเซิร์ฟเวอร์จดหมายเพื่อส่งอีเมลผ่านอินเทอร์เน็ต
มันเป็นส่วนสำคัญของชั้นแอปพลิเคชันของ TCP/IP suite ซึ่งเป็นชุดโปรโตคอลที่ใช้สำหรับการสื่อสารผ่านอินเทอร์เน็ตหรือเครือข่ายคล้ายๆ กัน ในเครือข่ายที่มีการใช้ SMTP กระบวนการที่เรียกว่า store and forward ช่วยย้ายจดหมายข้ามเครือข่าย
ที่แต่ละปลายทาง ซอฟต์แวร์ที่เรียกว่า Mail Transfer Agent (MTA) ใช้ store and forward เพื่ออำนวยความสะดวกการสื่อสารระหว่างเซิร์ฟเวอร์ SMTP ที่เข้าร่วม บทบาทหลักของ SMTP จึงคือการกำหนดว่าจดหมายเคลื่อนที่จากจุดหนึ่งไปยังอีกจุดหนึ่งในเครือข่ายอย่างไรและที่ไหน
เริ่มต้นใช้งาน
คุณต้องมีบัญชีอีเมลเพื่อใช้ส่งอีเมลด้วยโปรแกรมนี้ เนื่องจากเราจะใช้บริการ SMTP ของไคลเอนต์อีเมลเพื่อส่งอีเมล สำหรับบทช่วยสอนนี้ เราจะใช้ Gmail
คุณยังสามารถใช้เซิร์ฟเวอร์ SMTP แบบ local สำหรับการดีบั๊กเพื่อส่งอีเมลทดสอบ แต่ตอนนี้เราจะใช้บัญชีอีเมลเพื่อส่งอีเมลเพราะมันเข้าใจง่ายกว่า
เป็นไปได้ที่จะใช้บัญชี Gmail ที่มีอยู่แล้ว แต่เมื่อคุณเล่นกับโปรแกรม มันอาจเต็มไปด้วยอีเมลทดสอบเร็วๆ นี้ นี่คือเหตุผลที่เราแนะนำให้สร้างบัญชี 'throwaway' เพื่อวัตถุประสงค์การทดสอบ
ตอนนี้ เปิดใช้งานตัวเลือกให้แอปที่ปลอดภัยน้อยกว่าเข้าถึงบัญชี Gmail ของคุณได้ นี่เป็นอีกเหตุผลที่ควรใช้ throwaway email เนื่องจากไม่แนะนำให้เล่นกับการตั้งค่าความเป็นส่วนตัวของอีเมลหลัก
เขียนอีเมลใน Python
Python 3 มาพร้อมกับโมดูลที่ชื่อ smtplib (สั้นสำหรับ smtp library) ซึ่งสามารถใช้ทำงานกับเซิร์ฟเวอร์ SMTP ได้
เหมือนโมดูล Python อื่นๆ ขั้นตอนแรกคือ import smtplib
import smtplib
การเริ่มต้นออบเจ็กต์ SMTP
ตอนนี้คุณสามารถใช้ smtplib สร้างออบเจ็กต์ SMTP ซึ่งจะให้คุณฟังก์ชันส่วนใหญ่ของไคลเอนต์อีเมลแบบดั้งเดิม อย่างไรก็ตาม ฟังก์ชันของออบเจ็กต์ SMTP สามารถใช้ได้เฉพาะผ่าน instance methods ดังนั้นขั้นตอนต่อไปโดยธรรมชาติก็คือการประกาศ instance ของออบเจ็กต์
mySMTP = smtplib.SMTP("smtp.google.com")
สิ่งนี้กำหนดค่าออบเจ็กต์ SMTP ให้ส่งอีเมลออกไปโดยใช้เซิร์ฟเวอร์ SMTP ของ Google
หลังจากนี้ เราระบุอีเมลผู้ส่งและผู้รับ นี่คือที่ที่บัญชี Gmail ที่คุณสร้างไว้ก่อนหน้านี้มีประโยชน์
emailSender = “senderMail@sender.com”
myThroaway = "myEmail@gmail.com"
emailRecipients = [myThroaway]
สิ่งหนึ่งที่ต้องจดจำคือ รายการผู้รับจริงๆ แล้วเป็นอาร์เรย์ ซึ่งหมายความว่ามันถูกออกแบบมาเพื่อเก็บค่า non-atomic ดังนั้นคุณสามารถระบุ mailing list ทั้งหมดในฟิลด์นี้ได้!
การเขียนข้อความ
ส่วนที่ตรงไปตรงมาที่สุดของกระบวนการ ที่นี่คุณต้องใส่ค่าที่คุณปกติจะเพิ่มเมื่อเขียนอีเมลใหม่ รวมถึง:
- รายละเอียดผู้ส่ง
- รายละเอียดผู้รับ
- เรื่อง
- เนื้อหาข้อความ
ฟิลด์เหล่านี้ถูกรวมเข้าด้วยกันภายในเครื่องหมายอัญประกาศสามตัว และแบ่งแยกดังนี้:
newEmail = """From: From Person <senderMail@sender.com>
To: To Person <my_email@gmail.com>
Subject: Email Test
This is the body of the email.
"""
การส่งอีเมล
สุดท้ายเราสามารถใช้คำสั่ง sendmail เพื่อส่งจดหมายจากเซิร์ฟเวอร์ SMTP ของคุณไปยังเซิร์ฟเวอร์ของผู้รับ
mySMTP.sendmail(emailSender, emailRecipients, newEmail)
ตอนนี้เหลือขั้นตอนสุดท้ายหนึ่งขั้นตอน: จัดระเบียบโค้ดใหม่เพื่อป้องกันการแครชของโปรแกรมที่คาดการณ์ไว้
การแก้ไขปัญหาโปรแกรมอีเมล Python ของคุณ
บางครั้ง เซิร์ฟเวอร์ SMTP ของคุณอาจล้มเหลวในการสร้างการเชื่อมต่อกับของผู้รับ หรืออาจมีปัญหากับการส่งอีเมลจากพอร์ต SMTP หนึ่งไปอีกพอร์ต ในกรณีเช่นนั้น โปรแกรมของคุณอาจแครชโดยไม่คาดคิด
เพื่อคำนึงถึงความเป็นไปได้เช่นนี้ คุณสามารถใช้บล็อก try-except และวางคำสั่งที่อาจเกิดข้อผิดพลาดไว้ในบล็อก try โปรแกรมทั้งหมดของคุณ พร้อมกับบล็อก try-except ควรมีลักษณะประมาณนี้:
import smtplib
emailSender = “senderMail@sender.com”
myThroaway = ‘my_email@gmail.com’
emailRecipients = [myThroaway]
newEmail = """From: From Person <senderMail@sender.com>
To: To Person <my_email@gmail.com>
Subject: Email Test
This is the body of the email.
"""
try:
smtpObj = smtplib.SMTP(‘smtp.gmail.com’)
mySMTP.sendmail(emailSender, emailRecipients, newEmail)
print (“Email sent successfully!”)
except SMTPException:
print ("Error: There was an error in sending your email.")
การรักษาความปลอดภัยอีเมลของคุณ
หากคุณตั้งใจจะใช้ Python ในสถานการณ์จริงเพื่อส่งอีเมล สำคัญที่จะต้องแน่ใจว่าการสื่อสารปลอดภัยทั้งสองด้าน
การใช้เซิร์ฟเวอร์ SMTP ธรรมดากับพอร์ตเริ่มต้นไม่ได้ให้เลเยอร์การเข้ารหัสใดๆ กับการสื่อสาร หมายความว่าหากบุคคลที่สามฟังอยู่ในเครือข่ายของคุณ มันสามารถเข้าถึงข้อมูลประจำตัวการล็อกอินและข้อมูลในอีเมลของคุณได้
วิธีหนึ่งในการแก้ปัญหานี้คือการใช้โปรโตคอล TLS (Transport Layer Security) เพื่อเข้ารหัสการสื่อสารของคุณ นี่คือโปรโตคอลเดียวกันที่ไคลเอนต์อีเมลหลักอย่าง Gmail และ Outlook ใช้เพื่อให้แน่ใจว่าอีเมลของคุณไม่ตกมือคนอื่น
เพื่อทำเช่นนี้ เราต้องทำการเปลี่ยนแปลงเล็กน้อยในโปรแกรมที่เราสร้างไว้ก่อนหน้านี้
ขั้นตอนแรก當然คือ import ไลบรารี ssl พร้อมกับ smtplib ไลบรารี ssl ให้คุณความสามารถในการสร้าง SSL context ที่ปลอดภัยและสื่อสารผ่านเครือข่ายที่เข้ารหัสโดยการเชื่อมต่อกับพอร์ตเฉพาะที่ทั้งสองปลายทาง
SSL context ที่ปลอดภัยไม่ใช่อะไรมากกว่าการรวบรวมของ ciphers, protocol versions, trusted certificates, TLS options และ TLS extensions
ตามมา เราสามารถระบุพอร์ต TLS และเพิ่มฟังก์ชัน ssl ไลบรารี เพื่อสร้าง emailer ที่ปลอดภัย
โค้ดพร้อมการเปลี่ยนแปลงทั้งหมด มีลักษณะประมาณนี้:
import smtplib, ssl
smtpServer = "smtp.gmail.com"
port = 587
myEmail = "my_email@gmail.com"
password = "my_password"
#email and password can also be user input fields
context = ssl.create_default_context()
newEmail = """From: From Person <senderMail@sender.com>
To: To Person <my_email@gmail.com>
Subject: Email Test
This is the body of the email.
"""
try:
server = smtplib.SMTP(smtpServer,port)
server.starttls(context=context)
server.login(newEmail, password)
except Exception as e:
print("the email could not be sent.")
finally:
server.quit()
เหมือนเดิม คุณควรสร้างและใช้ instance SMTP ในบล็อก try-except เพื่อป้องกันการแครชของโปรแกรมที่เกิดขึ้นอย่างกะทันหัน
สิ่งที่คุณสามารถทำได้กับสคริปต์ Python นี้
ตอนนี้คุณได้เรียนรู้ทักษะที่เก๋และมีประโยชน์อย่างน่าประหลาดใจในการทำอีเมลอัตโนมัติด้วยโค้ด คุณสามารถนำไปประยุกต์ใช้กับแพลตฟอร์มใดๆ ที่ต้องการส่งอีเมลไปยัง mailing list ที่หลากหลาย
ตั้งแต่ใช้บนเว็บไซต์ส่วนตัวเพื่อส่งอีเมลยืนยันอัตโนมัติ ไปจนถึงใช้ส่งการ์ดคริสต์มาสหรือเชิญชวนให้ครอบครัวและเพื่อน การใช้งานของสคริปต์ Python ขนาดเล็กนี้ จำกัดเพียงแค่ความคิดสร้างสรรค์ของคุณเอง
นอกจากนี้ นี่เป็นเพียงหนึ่งในหลายสิ่งที่เก๋ๆ ที่คุณสามารถทำได้กับ Python ด้วยการสนับสนุนนักพัฒนาทุกที่และ syntax ที่เรียนรู้ง่าย การเรียนทักษะ Python ไม่เคยง่ายมาก่อน
เพื่อต่อเนื่องในการสร้างสิ่งที่เก๋ๆ ด้วยโค้ด ดูคู่มือของเราเกี่ยวกับวิธีสร้าง Telegram bot ของคุณเองด้วย Python 3!