Лого

Отправка почты на Python

Зачем все это?

Почта на python - все еще распространенная задача, которая может потребоваться для:

  • автоматической рассылки уведомлений или новостей
  • интеграции функциональности email в твои приложения
  • создания инструментов для автоматизации бизнес-процессов

Что же брать для этого? Ну тут 2 модуля есть в python. И они встроены в язык:

  • smtplib - библиотечка для взаимодействия с SMTP серверами
  • email - поможет с текстом, вложениями и HTML для небольшой красоты

База SMTP

В общем, это протокол, который поможет тебе отправить отчет на электронную почту. Думай о почтальоне, который бежит с твоим письмом.

Что надо для подключения к SMTP серверу?

  1. Адрес сервера - например, smtp.mail.ru. Нагуглить можно для нужного сервиса
  2. Порт - указывай 587 (TLS), потому что он более современный. Но помни и про старичка 465 порт, который SSL
  3. Логин - твой почтовый адрес
  4. Пароль - это пароль приложения, который создается в настройках безопасности твоего почтового ящика

Основы модуля email

Этот дружок-пирожок предоставляет тебе мощные инструменты для создания и обработки электронных писем. База модуля заключается в следующих компонентах:

  • email.message - представление электронного письма
  • email.mime - различные типы MIME (текст, вложения, разметка)

Также не забудь про Email Headers - это заголовки письма, такие как From, To, Subject - без них ты не сможешь отправить письмецо.

Давай код быстрее

Итак, давай подключимся к SMTP серверу:

    
        import smtplib

        server = smtplib.SMTP("smtp.mail.ru", 587)
        server.starttls()
        server.login("your@mail.ru", "gigapassword123")
    

Здесь ты видишь что мы сервер с портом указываем. Затем устанавливаем шифрование через starttls(). Ну а потом логинимся с нашим email и паролем.

    
        import smtplib
        from email.mime.text import MIMEText
        from email.mime.multipart import MIMEMultipart

        server = smtplib.SMTP("smtp.mail.ru", 587)
        server.starttls()
        server.login("your@mail.ru", "gigapassword123")

        msg = MIMEMultipart()
        msg["From"] = "your@mail.ru"
        msg["To"] = "stuffyuser@yandex.ru"
        msg["Subject"] = "Test email"

        body = "Some text this email"

        msg.attach(MIMEText(body, "plain"))

        server.send_message(msg)
    

Ну а здесь мы кидаем обычным текстовым письмом в получателя. Указываем заголовки письма и текст. В body можно упаковать также твою HTML разметку, затем меняем "plain" на "html" в прикреплении тела к письму. И твой электронный конверт улетит другому человеку.

    
        body = "<h1>Hello</h1>"
        msg.attach(MIMEText(body, "html"))
    

Теперь давай вложение прикрепим:

    
        import smtplib
        from email import encoders
        from email.mime.text import MIMEText
        from email.mime.base import MIMEBase
        from email.mime.multipart import MIMEMultipart


        server = smtplib.SMTP("smtp.mail.ru", 587)
        server.starttls()
        server.login("your@mail.ru", "gigapassword123")

        msg = MIMEMultipart()
        msg["From"] = "your@mail.ru"
        msg["To"] = "stuffyuser@yandex.ru"
        msg["Subject"] = "Test email"

        body = "Test text"

        msg.attach(MIMEText(body, "plain"))

        filename = "test.txt"
        with open(filename, "rb") as attachment:
            part = MIMEBase("application", "octet-stream")
            part.set_payload(attachment.read())
            encoders.encode_base64(part)
            part.add_header("Content-Disposition", f"attachment; filename={filename}")
            msg.attach(part)

        server.send_message(msg)
    

Читаем файл в бинарном режиме, кодируем его и прикрепляем.

Так, а обработка ошибок?

Теперь просто оберни все это в try-except. Ну а в finally укажи закрыть соединение с почтой.

    
        import smtplib
        from email import encoders
        from email.mime.text import MIMEText
        from email.mime.base import MIMEBase
        from email.mime.multipart import MIMEMultipart

        try:
            server = smtplib.SMTP("smtp.mail.ru", 587)
            server.starttls()
            server.login("your@mail.ru", "gigapassword123")

            msg = MIMEMultipart()
            msg["From"] = "your@mail.ru"
            msg["To"] = "stuffyuser@yandex.ru"
            msg["Subject"] = "Test email"

            body = "Test text"

            msg.attach(MIMEText(body, "plain"))

            filename = "test.txt"
            with open(filename, "rb") as attachment:
                part = MIMEBase("application", "octet-stream")
                part.set_payload(attachment.read())
                encoders.encode_base64(part)
                part.add_header("Content-Disposition", f"attachment; filename={filename}")
                msg.attach(part)

            server.send_message(msg)
        except Exception as e:
            print(f"Error - {e}")
        finally:
            server.quit()
    

Заключение

Ну вот и все. Рассмотрели как отправить через python сообщения на почту своим друзьям-товарищам. Не забывай только о безопасности шифрования соединения, хранение паролей в переменных окружения и логирование можно еще прикрутить сюда.