Надсилати масу електронних листів вручну – це виснажливе завдання. Ви можете використовувати сторонні сервіси, щоб надсилати масові листи за раз.
Як щодо створення власного налаштованого сценарію для надсилання електронних листів?
Хіба це не чудово?
Так, це так. Ми збираємося написати сценарій на 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 і 465.
Ми будемо використовувати шифрування SSL для підключення до SMTP-сервера, оскільки воно безпечніше, ніж шифрування TSL. Якщо ви хочете використовувати шифрування TSL, використовуйте порт 587 замість 465. Ім’я домену SMTP-сервера буде відрізнятися залежно від постачальника послуг електронної пошти.
Код підключення до SMTP-сервера
server = smtplib.SMTP_SSL(smtp_server_domain_name, port, context=ssl_context)
#2. Логін
Після встановлення з’єднання з сервером SMTP ми можемо увійти, використовуючи адресу електронної пошти та пароль за допомогою методу об’єкта 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. І в ньому є метод відправлення для надсилання листів. Заняття з письма чи ні – вирішувати вам. Клас робить його більш читабельним. Ми реалізували всі описані вище кроки один за іншим у методі надсилання.
Ура! ви надіслали лист за допомогою сценарію Python.
Вміст HTML
Що робити, якщо ви хочете надіслати лист у HTML? Це можливо?
Так, чому ні. Ми можемо надіслати лист за допомогою бібліотеки HTML під назвою email.mime. Це вбудована бібліотека.
The MIME це стандарт, який використовується для розширення формату електронних листів для підтримки прикладних програм, відео, зображень тощо,
Є два класи, які нам потрібні з модуля email.mime. Це MIMEText і MIMEMultipart. Давайте подивимося коротке пояснення щодо них.
#1. MIMEText
Клас MIMEText використовується для написання вмісту нашої пошти в HTML. Ми створимо екземпляр класу MIMEText, передавши вміст HTML і тип вмісту. Перегляньте приклад коду нижче.
html_content = MIMEText(html_template, 'html')
Деякі поштові служби не підтримують відтворення HTML. Отже, краще створити два екземпляри класу MIMEText для звичайного тексту та HTML.
#2. MIMEMultipart
Клас MIMEMultipart використовується для спрощення форматування та написання теми, від адреси до адреси тощо. Ми передамо вміст, створений за допомогою класу MIMEText, до MIMEMultipart за допомогою методу attach.
Нам потрібно переконатися, що екземпляр MIMEMultipart створено з альтернативним аргументом для відтворення простого тексту або 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'] = 'techukraine.net Celebrations' mail['From'] = self.sender_mail mail['To'] = email text_template = """ techukraine.net Hi {0}, We are delighted announce that our website hits 10 Million views this month. """ html_template = """ <h1>techukraine.net</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 в екземплярі MIMEMultipart.
Додавання вкладень
Додатками можуть бути зображення, PDF-файли, документи, аркуші тощо. У класі email.mime існує назва MIMEBase. Використовується для додавання вкладень до листів.
Давайте додамо вкладення до вищезазначеного листа.
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 = "techukraine.net-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)
Відразу надсилати масову пошту
Ми використали цикл, щоб надіслати ту саму пошту кільком учасникам. Це один випадок (коли ви не хочете, щоб одержувачі знали про інших одержувачів).
Припустімо, що вам потрібно надіслати той самий лист одночасно 1000 членам однієї групи. У таких випадках використання петлі буде недоречним. Ми можемо додати кілька електронних листів у поле Кому під час створення загальної пошти. Як це зробити в скрипті Python?
Нам потрібно об’єднати список електронних листів у вигляді рядка, розділеного комою та пробілом. Ми можемо використовувати рядок методу приєднання, щоб об’єднати всі електронні листи як рядок. Перегляньте код для об’єднання електронних листів у рядок.
", ".join(emails)
Замініть поле Кому у наведеному вище сценарії, використовуючи наведений вище рядок. Ось і все, ви відразу відправили лист масовим розсилкам.
Висновок
Існують деякі сторонні бібліотеки для надсилання електронних листів у Python. Деякі з них є Конверти, Ягмайл, Фланкер, тощо. Ці бібліотеки допомагають нам писати сценарії з кількома рядками коду. Ви також можете досліджувати їх.
Тепер ви можете автоматизувати свою електронну пошту за допомогою сценаріїв Python. Структура надсилання електронних листів буде різною залежно від вашого випадку використання. Ми бачили різні сценарії надсилання електронних листів. Ви можете легко налаштувати сценарії, описані в підручнику, відповідно до свого випадку використання. Я взяв посилання з цього стаття.
Щасливого кодування 🙂