Гид по технологиям

Отправка электронной почты через SMTP в Python

7 min read Development Обновлено 31 Dec 2025
Отправка email через SMTP в Python
Отправка email через SMTP в Python

Кратко: в этой статье объяснено, что такое SMTP и как отправлять автоматические письма из Python безопасно и надёжно. Включён рабочий пример кода, рекомендации по безопасности, отладке и список действий для разных ролей.

Иллюстрация отправки электронной почты

Что такое SMTP?

SMTP — это Simple Mail Transfer Protocol, протокол передачи электронной почты между серверами. Он отвечает за передачу сообщения от отправителя к получателю и обычно работает совместно с другими компонентами почтовой системы, такими как MTA (Mail Transfer Agent).

Короткая дефиниция: SMTP определяет, куда и как пересылать почту на сетевом уровне.

Важно понимать модель «store and forward»: каждое почтовое приложение сохраняет сообщение и пересылает его дальше по цепочке серверов до конечного получателя. SMTP задаёт правила и команды для этой пересылки.

Кому пригодится этот навык

  • Разработчикам, которые хотят отправлять уведомления или отчёты из приложений.
  • Контент-менеджерам для автоматизированных рассылок подтверждений и триггерных писем.
  • Системным администраторам для интеграции мониторинга и оповещений.

Подготовка: что нужно перед началом

Перед отправкой писем через SMTP вам потребуется:

  • Рабочий почтовый аккаунт у провайдера, поддерживающего SMTP. Часто используются Gmail, Outlook, почтовые сервисы хостинга или специализированные SMTP-провайдеры (SendGrid, Mailgun и т. п.).
  • В тестах удобно заводить отдельный «тестовый» или «throwaway» аккаунт, чтобы не засорять основную почту и не менять критичные настройки.
  • Доступ к настройкам безопасности аккаунта. Многие провайдеры больше не поддерживают «less secure apps» и требуют либо использование app‑passwords, либо авторизации через OAuth2 — к этому вернёмся в разделе по безопасности.

Совет: для локальной отладки можно запускать тестовый SMTP‑сервер, который просто выводит сообщения в консоль, чтобы не рассылать реальные письма.

Как писать письмо в Python: базовый поток действий

Общий алгоритм отправки письма по SMTP из Python:

  1. Собрать тело письма и заголовки (отправитель, получатель, тема).
  2. Создать безопасный контекст TLS/SSL при необходимости.
  3. Установить соединение с SMTP‑сервером.
  4. Произвести аутентификацию (если требуется).
  5. Отправить сообщение.
  6. Закрыть соединение и обработать ошибки.

Импорт модулей

Python 3 поставляется со встроенными модулями для работы с SMTP и безопасностью. Используем:

  • smtplib — клиент SMTP
  • ssl — создание защищённого контекста
  • email.message.EmailMessage — удобный объект для формирования письма

Пример импортов:

import smtplib
import ssl
from email.message import EmailMessage

Пример корректного простого скрипта (рекомендуемый)

Этот пример показывает надёжный и читаемый способ отправки письма. Он использует EmailMessage для заголовков и TLS для шифрования.

# Пример: отправка через smtp.gmail.com с STARTTLS
smtp_server = 'smtp.gmail.com'
port = 587  # порт для STARTTLS
sender_email = 'my_email@gmail.com'
receiver_email = 'recipient@example.com'
password = 'ВАШ_ПАРОЛЬ_ИЛИ_APP_PASSWORD'

msg = EmailMessage()
msg['From'] = 'Отправитель <' + sender_email + '>'
msg['To'] = receiver_email
msg['Subject'] = 'Тестовое письмо'
msg.set_content('Это текст тела письма.')

context = ssl.create_default_context()

try:
    with smtplib.SMTP(smtp_server, port, timeout=20) as server:
        server.ehlo()
        server.starttls(context=context)
        server.ehlo()
        server.login(sender_email, password)
        server.send_message(msg)
    print('Письмо успешно отправлено')
except Exception as e:
    print('Ошибка при отправке письма:', e)

Пояснения:

  • starttls() защищает соединение, переводя его в шифрованный режим.
  • EmailMessage автоматизирует формирование заголовков и поддерживает добавление альтернативных частей (HTML, вложения).
  • Всегда используйте with‑контекст или явно server.quit(), чтобы соединение корректно закрылось.

Альтернативный подход: SMTP_SSL

Если провайдер поддерживает прямое SSL‑соединение на отдельном порту (обычно 465), можно использовать SMTP_SSL:

# Пример: прямой SSL на порту 465
smtp_server = 'smtp.gmail.com'
port = 465
with smtplib.SMTP_SSL(smtp_server, port, context=ssl.create_default_context()) as server:
    server.login(sender_email, password)
    server.send_message(msg)

Отладка и обработка ошибок

Наиболее частые проблемы:

  • Неправильный хост или порт.
  • Ошибка аутентификации из‑за неверного пароля, блокировки аккаунта или требований OAuth2.
  • Соединение сбрасывается провайдером (firewall, блокировка портов, rate limiting).
  • Письмо попадает в спам или отклоняется получателем по политике SPF/DKIM/DMARC.

Полезные приёмы для отладки:

  • Включите логирование smtplib: server.set_debuglevel(1) — покажет диалог клиента и сервера.
  • Для локального тестирования можно запустить простой отладочный сервер Python, который печатает все входящие сообщения, не отправляя их дальше:
# Пример локального отладочного SMTP-сервера (в старых версиях Python)
# python -m smtpd -c DebuggingServer -n localhost:1025
  • Проверяйте правильность заголовков From/To/Subject — некоторые SMTP‑серверы проверяют соответствие From и авторизованного аккаунта.

Частые ошибки в коде и как их исправить

  • Ошибка: server.login(newEmail, password) — нужно передавать адрес отправителя, а не весь объект письма.
  • Ошибка: забыли вызвать starttls(), когда провайдер требует TLS.
  • Ошибка: использование ‘smtp.google.com’ вместо ‘smtp.gmail.com’ — проверьте документацию провайдера.

Безопасность: как не публиковать учётные данные

Никогда не храните пароли в открытом виде в коде, особенно в репозиториях. Лучшие практики:

  • Используйте переменные окружения или секретный менеджер CI/CD.
  • При работе с Gmail используйте app‑passwords (если у аккаунта включена двухфакторная аутентификация) или OAuth2 вместо «менее безопасных приложений».
  • Ограничьте объём логов, чтобы не записывать секреты.
  • Разделяйте права: используйте сервисный почтовый аккаунт только для рассылок.

Важно: провайдеры постепенно отключили поддержку «менее безопасных приложений». Рекомендуется проверять актуальную политику и использовать современные методы аутентификации.

Иллюстрация защищённого сервера и шифрования TLS

Когда SMTP‑скрипт может не подойти — альтернативы

  • Для массовых рассылок лучше использовать специализированные сервисы (SendGrid, Mailgun, Amazon SES). Они решают вопросы доставки, учёта отказов и аналитики.
  • Для интеграции с пользователями через UI рассмотрите backend‑фреймворки с готовыми плагинами по отправке писем.
  • Если требуется сложная аутентификация (OAuth2), можно использовать библиотеки с поддержкой OAuth для SMTP или API провайдера.

Роль‑ориентированные чек‑листы

Чек‑лист для разработчика

  • Использовать EmailMessage или аналог для формирования письма
  • Хранить секреты в безопасном месте
  • Добавить обработку ошибок и логирование
  • Написать unit‑тесты на генерацию письма

Чек‑лист для девопса / администратора

  • Проверить открытые порты и правила брандмауэра
  • Настроить SPF, DKIM и DMARC для домена
  • Настроить мониторинг очередей и очередность отправки

Чек‑лист для владельца контента

  • Подготовить шаблоны писем и альтернативный текст
  • Убедиться, что письма не попадают в спам (тестовые рассылки)
  • Обеспечить механизм отписки по требованиям законодательства

Мини‑методология для внедрения отправки писем в проект

  1. Прототип: локально отправлять в тестовый аккаунт или отладочный сервер.
  2. Тестирование: написать тесты на формирование заголовков и тела письма.
  3. Безопасность: внедрить секретный менеджер и настроить TLS/OAuth.
  4. Конфигурация: вынести параметры SMTP в конфигурацию окружения.
  5. Производство: использовать сервисы доставки при росте объёма.

Критерии приёмки

  • Сценарий отправки письма проходит без ошибок в тестовой среде.
  • Заголовки From/To/Subject корректны и читаемы.
  • Письмо доставляется в почтовый ящик получателя и не попадает в спам в тестах.
  • Учётные данные не хранятся в коде и доступны через безопасный источник.

Шаблон playbook для инцидента с отправкой почты

  1. Получение сигнала: мониторинг показывает рост ошибок отправки.
  2. Быстрая диагностика: проверить логи приложения, уровень ошибок smtplib.
  3. Проверить доступность SMTP‑сервера (telnet smtp:port или nc).
  4. Проверить, не изменились ли секреты (проверить ревизии конфигурации).
  5. Если проблема на стороне провайдера — перейти на резервный SMTP или сервис.
  6. После восстановления — провести постмортем и зафиксировать улучшения.

Тестовые кейсы / Критерии приёмки (acceptance)

  • Отправка одного текстового письма проходит без исключений.
  • Отправка письма с HTML‑контентом и вложением проходит без потерь.
  • Поведение при неверном пароле: приложение возвращает предсказуемую ошибку и не падает.
  • Таймауты обрабатываются корректно и не блокируют основной поток.

Совместимость и примечания по версиям Python

  • Код, основанный на smtplib и email.message, совместим с Python 3.6+.
  • Для новейших протокольных возможностей (новые шифры TLS) важно иметь современную версию OpenSSL на машине.

Короткий словарь терминов

  • SMTP — протокол отправки почты
  • MTA — агент передачи почты (Mail Transfer Agent)
  • TLS/SSL — протоколы шифрования
  • SPF/DKIM/DMARC — механизмы защиты от подделки отправителя

Риски и рекомендации по их снижению

  • Риск: компрометация паролей. Митигирование: app‑passwords, секретный хранилище.
  • Риск: письма попадают в спам. Митигирование: настройка SPF/DKIM и корректные заголовки.
  • Риск: массовые рассылки блокируются. Митигирование: использовать специализированные сервисы и соблюдать квоты.

Заключение

Отправка писем через SMTP в Python — простая и гибкая техника, полезная для уведомлений, подтверждений регистрации и автоматических отчётов. Для надёжной работы используйте защищённые соединения, избегайте хранения секретов в коде и тестируйте доставку в реальных почтовых ящиках. При увеличении нагрузки переходите на специализированные сервисы доставки.

Ключевые шаги на одну страницу: подготовить аккаунт, сформировать письмо через EmailMessage, установить TLS или SSL, выполнить аутентификацию и отправить через smtplib с обработкой ошибок.


Важно

  • Всегда проверяйте актуальные требования вашего почтового провайдера по аутентификации.
  • Используйте отдельный тестовый аккаунт для экспериментов и never commit credentials в репозиторий.
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Учёба на YouTube: настройка и эффективное обучение
Образование

Учёба на YouTube: настройка и эффективное обучение

Лучшие YouTube‑каналы для обучения рисованию
Обучение

Лучшие YouTube‑каналы для обучения рисованию

VideoSpirit Lite — обзор и инструкция
Программы

VideoSpirit Lite — обзор и инструкция

Кого не защищают: скрытый мир онлайн-издевательств
Интернет

Кого не защищают: скрытый мир онлайн-издевательств

Blend If в Photoshop: мастер-класс по цветокоррекции
Photoshop

Blend If в Photoshop: мастер-класс по цветокоррекции

Как создать и использовать LUT для видео
Цветокоррекция

Как создать и использовать LUT для видео