Как отправлять электронные письма через 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 в 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. MIMEText

Класс 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 в экземпляре MIMEMultipart.

Добавление вложений

Приложения могут быть изображения, PDF, DOC, листы, и т.д., Там называется 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)

Отправляйте массовые рассылки сразу

Мы использовали цикл для отправки одного и того же письма нескольким участникам. Это один из случаев (когда вы не хотите, чтобы получатели знали о других получателях).

Предположим, вам нужно отправить одно и то же письмо одновременно 1000 членам одной и той же группы. В таких случаях использование петли нецелесообразно. Мы можем добавить несколько писем в поле Кому в обычном письме. Как это сделать в скрипте Python?

Нам нужно объединить список писем в виде строки, разделенной запятой и пробелом . Мы можем использовать строку метода соединения, чтобы объединить все электронные письма в строку. См. Код для объединения писем в строку.

 ", ".join(emails)

Замените поле « Кому» в приведенном выше сценарии, используя указанную выше строку. Вот и все, вы сразу отправили почту в массовые рассылки.

Вывод

Есть несколько сторонних библиотек для отправки писем на Python. Некоторые из них - Envelopes, Yagmail, Flanker и т. Д. Эти библиотеки помогают нам писать скрипты с несколькими строками кода. Вы также можете изучить их.

Теперь вы можете автоматизировать свою электронную почту с помощью скриптов Python. Структура отправки электронных писем будет отличаться в зависимости от вашего варианта использования. Мы видели разные сценарии отправки писем. Вы можете легко настроить сценарии, обсуждаемые в руководстве, в соответствии с вашим вариантом использования. Ссылку я взял из этой статьи.

Счастливое кодирование