จะส่งอีเมลผ่าน Gmail ใน Python ได้อย่างไร

เผยแพร่แล้ว: 2021-06-06

การส่งอีเมลจำนวนมากด้วยตนเองเป็นงานที่น่าเบื่อ คุณสามารถใช้บริการของบุคคลที่สามเพื่อส่งอีเมลจำนวนมากในแต่ละครั้ง

คุณสร้างสคริปต์ที่กำหนดเองเพื่อส่งอีเมลเป็นอย่างไรบ้าง

มันไม่วิเศษเหรอ?

ใช่มันเป็น เราจะเขียนสคริปต์ในภาษา Python เพื่อส่งอีเมล

Python มีห้องสมุดชื่อ smtplib ซึ่งใช้ในการส่งอีเมล ไลบรารี smtplib ขึ้นอยู่กับ SMTP (Simple Mail Transport Protocol) SMTP ใช้เพื่อส่งอีเมลไปยังผู้อื่น

ตั้งค่า Gmail

ที่นี่ เราจะใช้ Gmail เป็นผู้ให้บริการอีเมล Google ไม่อนุญาตให้สคริปต์ลงชื่อเข้าใช้ และเราจำเป็นต้องทำการเปลี่ยนแปลงในความปลอดภัยของบัญชี Gmail ของเราที่อนุญาตให้สคริปต์ลงชื่อเข้าใช้บัญชี Gmail ของเรา

การเปลี่ยนตัวเลือกความปลอดภัยในบัญชี Gmail ของเรานั้นไม่ดีเพราะจะทำให้ผู้อื่นเข้าถึงบัญชีได้ง่ายมาก ขอแนะนำให้สร้างบัญชี Gmail ใหม่ ไปที่การตั้งค่าที่นี่และเปิดการตั้งค่า อนุญาตแอปที่ปลอดภัยน้อย: เปิด

หากคุณไม่สะดวกที่จะเปิดการตั้งค่าข้างต้น คุณสามารถใช้ Google API เพื่อลงชื่อเข้าใช้บัญชี Gmail ของคุณได้ คุณสามารถค้นหาสคริปต์เพื่อใช้ Google API สำหรับการตรวจสอบสิทธิ์ได้ที่นี่

ขั้นตอนในการส่งเมล

ต้องทำขั้นตอนบางอย่างเพื่อส่งเมลโดยใช้ไลบรารี smtplib มาดูขั้นตอนกันก่อน แล้วค่อยมาเขียนบทกัน

#1. กำลังเชื่อมต่อกับเซิร์ฟเวอร์ SMTP

ผู้ให้บริการแต่ละรายจะมีชื่อโดเมนและพอร์ตเซิร์ฟเวอร์ SMTP ที่แตกต่างกัน เราต้องใช้ชื่อโดเมนเซิร์ฟเวอร์ SMTP และพอร์ตของผู้ให้บริการอีเมลที่เราจะใช้ในสคริปต์ ชื่อโดเมนและพอร์ตของเซิร์ฟเวอร์ SMTP สำหรับ Gmail คือ smtp.gmail.com และ <em>465</em>

เราจะใช้ การ เข้ารหัส SSL สำหรับการเชื่อมต่อเซิร์ฟเวอร์ SMTP เนื่องจากมีความปลอดภัยมากกว่าการเข้ารหัส TSL หากคุณต้องการใช้การเข้ารหัส TSL ให้ใช้พอร์ต 587 แทน 465 ชื่อโดเมนเซิร์ฟเวอร์ SMTP จะแตกต่างกันไปตามผู้ให้บริการอีเมล

รหัสสำหรับเชื่อมต่อกับเซิร์ฟเวอร์ SMTP

 server = smtplib.SMTP_SSL(smtp_server_domain_name, port, context=ssl_context)

#2. เข้าสู่ระบบ

เมื่อสร้างการเชื่อมต่อกับเซิร์ฟเวอร์ SMTP แล้ว เราสามารถเข้าสู่ระบบโดยใช้ที่อยู่อีเมลและรหัสผ่านโดยใช้วิธีการ login ของวัตถุ SMTP รหัสมีลักษณะดังนี้

 server.login(sender_email, password)

#3. ส่งอีเมล์

หลังจากเข้าสู่ระบบ เราไม่สามารถรอที่จะส่งจดหมายได้ ส่งอีเมลโดยใช้วิธี sendmail ตรวจสอบให้แน่ใจว่าคุณส่งจดหมายในรูปแบบต่อไปนี้

เรื่อง: your_subject_for \newline mail_content

ช่องว่างไม่จำเป็น เป็นเพียงการชี้แจงในรูปแบบข้างต้น มาดูตัวอย่างโค้ดกัน

 server.sendmail(sender_mail, email, f"Subject: {subject}\n{content}")

#4. ล้มเลิก

อย่าลืมออกจาก SMTP c

เราได้เห็นขั้นตอนในการส่งอีเมลโดยใช้ Python แล้ว แต่เราไม่ได้พูดถึงรหัสที่สมบูรณ์ มาดูโค้ดกันเร็ว

 import smtplib, ssl class Mail: def __init__(self): self.port = 465 self.smtp_server_domain_name = "smtp.gmail.com" self.sender_mail = "GMAIL_ADDRESS" self.password = "SECURE_PASSWORD" def send(self, emails, subject, content): ssl_context = ssl.create_default_context() service = smtplib.SMTP_SSL(self.smtp_server_domain_name, self.port, context=ssl_context) service.login(self.sender_mail, self.password) for email in emails: result = service.sendmail(self.sender_mail, email, f"Subject: {subject}\n{content}") service.quit() if __name__ == '__main__': mails = input("Enter emails: ").split() subject = input("Enter subject: ") content = input("Enter content: ") mail = Mail() mail.send(mails, subject, content)

เราได้สร้างคลาสที่เรียกว่า Mail และมีวิธีการที่เรียกว่า send เพื่อส่งอีเมล ชั้นเรียนการเขียนหรือไม่ขึ้นอยู่กับคุณ ชั้นเรียนทำให้อ่านง่ายขึ้น เราได้ดำเนินการตามขั้นตอนทั้งหมดที่กล่าวถึงข้างต้นทีละรายการในวิธีการ ส่ง

เย่! คุณได้ส่งเมลโดยใช้สคริปต์ Python

เนื้อหา HTML

จะทำอย่างไรถ้าคุณต้องการส่งจดหมายในรูปแบบ HTML? เป็นไปได้ไหม?

ใช่ทำไมไม่ เราสามารถส่งอีเมลโดยใช้ HTML ห้องสมุดที่เรียกว่า email.mime มันเป็นห้องสมุดในตัว

MIME เป็นมาตรฐานที่ใช้ขยายรูปแบบอีเมลเพื่อรองรับโปรแกรมแอปพลิเคชัน วิดีโอ รูปภาพ ฯลฯ..,

มีสองคลาสที่เราต้องการจากโมดูล email.mime คือ MIMEText และ MIMEMultipart เรามาดูคำอธิบายสั้น ๆ เกี่ยวกับพวกเขา

#1. MIMEข้อความ

คลาส MIMEtext ใช้เพื่อเขียนเนื้อหาเมลของเราในรูปแบบ HTML เราจะสร้างอินสแตนซ์ของคลาส MIMEtext โดยส่งเนื้อหา HTML และประเภทของเนื้อหา ดูตัวอย่างโค้ดด้านล่าง

 html_content = MIMEText(html_template, 'html')

บริการอีเมลบางบริการไม่รองรับการแสดงผล HTML ดังนั้นจึงควรสร้าง MIMEText คลาสสองอินสแตนซ์สำหรับข้อความธรรมดาและ HTML

#2. MIMEMultipart

คลาส MIMEMultipart ใช้เพื่อทำให้การจัดรูปแบบและการเขียนหัวข้อง่ายขึ้น จากที่อยู่ ไปยังที่อยู่ ฯลฯ เราจะมอบเนื้อหาที่สร้างด้วยคลาส MIMEText ให้กับ MIMEMultipart โดยใช้วิธีการ attach

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

 import smtplib, ssl from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart class Mail: def __init__(self): ... def send(self, emails): ssl_context = ssl.create_default_context() service = smtplib.SMTP_SSL(self.smtp_server_domain_name, self.port, context=ssl_context) service.login(self.sender_mail, self.password) for email in emails: mail = MIMEMultipart('alternative') mail['Subject'] = 'Geekflare Celebrations' mail['From'] = self.sender_mail mail['To'] = email text_template = """ Geekflare Hi {0}, We are delighted announce that our website hits 10 Million views this month. """ html_template = """ <h1>Geekflare</h1> <p>Hi {0},</p> <p>We are delighted announce that our website hits <b>10 Million</b> views last month.</p> """ html_content = MIMEText(html_template.format(email.split("@")[0]), 'html') text_content = MIMEText(text_template.format(email.split("@")[0]), 'plain') mail.attach(text_content) mail.attach(html_content) service.sendmail(self.sender_mail, email, mail.as_string()) service.quit() if __name__ == '__main__': mails = input("Enter emails: ").split() mail = Mail() mail.send(mails)

คุณยังสามารถเพิ่มสำเนา Bcc โดยใช้แอตทริบิวต์ Bcc ในอินสแตนซ์ MIMEMultipart

การเพิ่มไฟล์แนบ

ไฟล์แนบสามารถเป็นรูปภาพ, pdf, เอกสาร, แผ่นงาน ฯลฯ มีเรียกว่า MIMEBase ในคลาส email.mime ใช้สำหรับเพิ่มไฟล์แนบในอีเมล

มาเพิ่มสิ่งที่แนบมากับอีเมลข้างต้นกันเถอะ

 import smtplib, ssl from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.mime.base import MIMEBase from email import encoders from pathlib import Path class Mail: def __init__(self): ... def send(self, emails): ## login... for email in emails: ## MIMEMultipart instance ## text and html templates ## MIMEText instances ## attaching messages to MIMEMultipart ## attaching an attachment file_path = "Geekflare-logo.png" mimeBase = MIMEBase("application", "octet-stream") with open(file_path, "rb") as file: mimeBase.set_payload(file.read()) encoders.encode_base64(mimeBase) mimeBase.add_header("Content-Disposition", f"attachment; filename={Path(file_path).name}") mail.attach(mimeBase) ## sending mail service.quit() if __name__ == '__main__': mails = input("Enter emails: ").split() mail = Mail() mail.send(mails)

ส่งจดหมายไปยังอีเมลจำนวนมากพร้อมกัน

เราใช้การวนซ้ำเพื่อส่งเมลเดียวกันไปยังสมาชิกหลายคน นั่นเป็นกรณีหนึ่ง (เมื่อคุณไม่ต้องการให้ผู้รับรู้เกี่ยวกับผู้รับอื่น)

สมมติว่าคุณต้องส่งเมลเดียวกันถึงสมาชิก 1,000 คนพร้อมกันในกลุ่มเดียวกัน ในกรณีเช่นนี้ การใช้ลูปจะไม่เหมาะสม เราสามารถเพิ่มอีเมลหลายฉบับในช่อง ถึง ในการเขียนจดหมายทั่วไป จะทำอย่างไรในสคริปต์ Python

เราจำเป็นต้องรวมรายชื่ออีเมลเป็นสตริงที่คั่นด้วย เครื่องหมายจุลภาคและช่องว่าง เราสามารถใช้สตริงวิธีการ เข้าร่วม เพื่อรวมอีเมลทั้งหมดเป็นสตริงได้ ดูรหัสเพื่อรวมอีเมลเป็นสตริง

 ", ".join(emails)

เปลี่ยนสนามการในสคริปต์ข้างต้นโดยใช้สตริงดังกล่าวข้างต้น เพียงเท่านี้ คุณได้ส่งอีเมลไปยังอีเมลจำนวนมากในครั้งเดียว

บทสรุป

มีบางไลบรารีของบุคคลที่สามเพื่อส่งอีเมลใน Python บางส่วน ได้แก่ Envelopes, Yagmail, Flanker เป็นต้น ไลบรารีเหล่านี้ช่วยให้เราเขียนสคริปต์ด้วยโค้ดไม่กี่บรรทัด คุณสามารถสำรวจพวกเขาได้เช่นกัน

ตอนนี้คุณสามารถทำให้อีเมลของคุณเป็นแบบอัตโนมัติโดยใช้สคริปต์ Python โครงสร้างการส่งอีเมลจะแตกต่างกันไปตามกรณีการใช้งานของคุณ เราได้เห็นสถานการณ์ต่างๆ ในการส่งอีเมล คุณสามารถปรับแต่งสคริปต์ที่กล่าวถึงในบทช่วยสอนตามกรณีการใช้งานของคุณได้อย่างง่ายดาย ฉันได้นำการอ้างอิงจากบทความนี้

Happy Coding