Как отправлять электронные письма через Gmail в Python?

Отправка большого количества писем вручную — утомительная задача. Вы можете использовать сторонние сервисы для массовой рассылки писем за раз.

Как насчет того, чтобы создать собственный скрипт для отправки электронных писем?

Разве это не прекрасно?

Да это оно. Мы собираемся написать скрипт на Python для отправки электронных писем.

В Python есть библиотека smtplib, которая используется для отправки электронных писем. Библиотека smtplib основана на SMTP (Simple Mail Transport Protocol). SMTP используется для отправки электронных писем другим пользователям.

Настройка Gmail

Здесь мы собираемся использовать Gmail в качестве поставщика электронной почты. Google не позволяет сценариям входить в систему. И нам необходимо внести изменения в систему безопасности нашей учетной записи Gmail, чтобы позволить сценариям входить в нашу учетную запись Gmail.

Изменение параметра безопасности в нашей учетной записи Gmail не очень хорошо, поскольку позволяет другим очень легко получить доступ к учетной записи. Рекомендуется создать новую учетную запись Gmail. Перейти к настройкам здесь и включите параметр Разрешить менее безопасные приложения: ВКЛ.

Если вам неудобно включать указанный выше параметр, вы можете использовать Google API для входа в свою учетную запись Gmail. Вы можете найти скрипт для использования API Google для аутентификации здесь.

Шаги для отправки почты

Для отправки почты с помощью библиотеки 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 новой строки 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 для отправки писем. Писать класс или просто нет, зависит от вас. Класс делает его более читабельным. Мы реализовали все описанные выше шаги один за другим в методе 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, используя метод прикрепления.

Нам нужно убедиться, что экземпляр 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'] = 'toadmin.ru Celebrations'
            mail['From'] = self.sender_mail
            mail['To'] = email

            text_template = """
            toadmin.ru

            Hi {0},
            We are delighted announce that our website hits 10 Million views this month.
            """
            html_template = """
            <h1>toadmin.ru</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 = "toadmin.ru-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. Структура отправки электронных писем будет отличаться в зависимости от вашего варианта использования. Мы видели разные сценарии отправки писем. Вы можете легко настроить сценарии, обсуждаемые в руководстве, в соответствии со своим вариантом использования. Я взял ссылку отсюда статья.

Удачного кодирования 🙂