Як надсилати електронні листи через Gmail на Python?

Надсилати масу електронних листів вручну – це виснажливе завдання. Ви можете використовувати сторонні сервіси, щоб надсилати масові листи за раз.

Як щодо створення власного налаштованого сценарію для надсилання електронних листів?

Хіба це не чудово?

Так, це так. Ми збираємося написати сценарій на 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-сервера буде відрізнятися залежно від постачальника послуг електронної пошти.

  Вам дійсно потрібен антивірус для вашого Smart TV?

Код підключення до 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. Давайте подивимося коротке пояснення щодо них.

  Як увімкнути/вимкнути темний режим у Google Chrome

#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)

Відразу надсилати масову пошту

Ми використали цикл, щоб надіслати ту саму пошту кільком учасникам. Це один випадок (коли ви не хочете, щоб одержувачі знали про інших одержувачів).

  Управління запасами у вас під рукою з Sortly

Припустімо, що вам потрібно надіслати той самий лист одночасно 1000 членам однієї групи. У таких випадках використання петлі буде недоречним. Ми можемо додати кілька електронних листів у поле Кому під час створення загальної пошти. Як це зробити в скрипті Python?

Нам потрібно об’єднати список електронних листів у вигляді рядка, розділеного комою та пробілом. Ми можемо використовувати рядок методу приєднання, щоб об’єднати всі електронні листи як рядок. Перегляньте код для об’єднання електронних листів у рядок.

", ".join(emails)

Замініть поле Кому у наведеному вище сценарії, використовуючи наведений вище рядок. Ось і все, ви відразу відправили лист масовим розсилкам.

Висновок

Існують деякі сторонні бібліотеки для надсилання електронних листів у Python. Деякі з них є Конверти, Ягмайл, Фланкер, тощо. Ці бібліотеки допомагають нам писати сценарії з кількома рядками коду. Ви також можете досліджувати їх.

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

Щасливого кодування 🙂