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

Отправка писем через SMTP в Python

6 min read Python Обновлено 10 Apr 2026
SMTP в Python: отправка писем через Gmail
SMTP в Python: отправка писем через Gmail

Программист за ноутбуком, готовящий скрипт для отправки писем

Что такое SMTP?

SMTP (Simple Mail Transfer Protocol) — это протокол передачи почты, который определяет правила доставки сообщений между почтовыми серверами. Ключевая идея — модель «store and forward»: почтовые агенты (MTA) принимают сообщение, сохраняют и пересылают его дальше, пока оно не попадёт на конечный сервер получателя.

Краткое определение: SMTP — протокол уровня приложения для передачи электронных писем между серверами.

Важно: SMTP отвечает только за передачу; формат сообщений и представление заголовков контролируется стандартами (RFC), а доставка до папки «Входящие» может зависеть от антиспам-фильтров.

Начало работы: что нужно подготовить

  1. Учётная запись электронной почты (в примерах — Gmail). Для тестов рекомендуется отдельный «throwaway» аккаунт.
  2. Python 3 (современная версия 3.7+ предпочтительна).
  3. Понимание отличий между нешифрованным соединением, STARTTLS (порт 587) и SSL/TLS (порт 465).

Примечание: Google давно исключил опцию «Allow less secure apps» для обычных аккаунтов. Для реальных Gmail‑аккаунтов с двухфакторной аутентификацией используйте App Password или OAuth2. Тесты можно выполнять на локальном SMTP-сервере для отладки.

Локальная отладка

Перед подключением к реальному SMTP удобно настроить локальный отладочный сервер, чтобы видеть формат сообщений и отлавливать ошибки без отправки писем в интернет. Для локальной отладки можно использовать встроенные или внешние инструменты (DebuggingServer, aiosmtpd, MailHog).

Примечание: локальные отладочные серверы не обеспечивают доставку — они просто показывают, что ваше приложение формирует корректное сообщение.

Написание письма в Python — базовый пример

Python включает модуль smtplib для работы с SMTP. Ниже — минимальный рабочий пример (нешифрованный, не для продакшна).

import smtplib

smtp_server = "smtp.gmail.com"
port = 587  # порт для STARTTLS
sender = "senderMail@sender.com"
recipient = "my_email@gmail.com"

message = """From: From Person 
To: To Person 
Subject: Email Test

This is the body of the email.
"""

try:
    smtp = smtplib.SMTP(smtp_server, port, timeout=10)
    smtp.ehlo()
    smtp.sendmail(sender, [recipient], message)
    print("Email sent successfully!")
except smtplib.SMTPException as e:
    print("Error sending email:", e)
finally:
    try:
        smtp.quit()
    except Exception:
        pass

Важно: в sendmail второй параметр — список получателей. Всегда оборачивайте сетевые вызовы в try/except и корректно закрывайте соединение.

Инициализация объекта SMTP и типичные ошибки

  • Неправильный адрес сервера (smtp.google.com → smtp.gmail.com). Проверьте документацию провайдера.
  • Несоответствие портов и методов шифрования: порт 587 обычно используется с STARTTLS; порт 465 — с SSL/TLS.
  • Использование недействительных учётных данных, двухфакторная аутентификация или блокировки со стороны почтового провайдера.

Формирование сообщения: заголовки и тело

Почтовое сообщение состоит из заголовков и тела. В простом случае можно собрать строку вручную, как в примере выше. Для сложных писем (HTML, вложения, кодировка) используйте модуль email из стандартной библиотеки.

Пример сборки письма с помощью email.mime:

from email.message import EmailMessage

msg = EmailMessage()
msg["From"] = "From Person "
msg["To"] = "To Person "
msg["Subject"] = "Email Test"
msg.set_content("This is the body of the email.")

# Для HTML:
# msg.add_alternative("

HTML body

", subtype='html')

Использование EmailMessage упрощает кодирование, работу с вложениями и заголовками.

Отправка по защищённому каналу: TLS / SSL

Шифрование обязательно для продакшна. Рассмотрим два распространённых варианта:

  1. STARTTLS (порт 587): устанавливается обычное соединение, затем переключается на TLS.
  2. SSL/TLS (порт 465): соединение сразу устанавливается по защищённому каналу.

Пример с STARTTLS и корректным входом в аккаунт:

import smtplib
import ssl
from email.message import EmailMessage

smtp_server = "smtp.gmail.com"
port = 587
my_email = "my_email@gmail.com"
password = "your_password_or_app_password"

msg = EmailMessage()
msg["From"] = "From Person "
msg["To"] = my_email
msg["Subject"] = "Email Test"
msg.set_content("This is the body of the email.")

context = ssl.create_default_context()

try:
    with smtplib.SMTP(smtp_server, port, timeout=10) as server:
        server.ehlo()
        server.starttls(context=context)
        server.ehlo()
        server.login(my_email, password)
        server.send_message(msg)
        print("Email sent successfully over TLS")
except smtplib.SMTPException as e:
    print("Could not send email:", e)

Альтернатива — использовать SMTP_SSL на порту 465:

with smtplib.SMTP_SSL("smtp.gmail.com", 465, context=context) as server:
    server.login(my_email, password)
    server.send_message(msg)

Частые ошибки при аутентификации

  • Для аккаунтов с двухфакторной аутентификацией (2FA) используйте App Password или OAuth2.
  • Провайдер может блокировать входы из «неизвестных» приложений; проверьте настройки безопасности учётной записи.

Защита сервера: шифрование и замок

Важные практики безопасности

  • Никогда не храните пароли в коде в открытом виде. Используйте переменные окружения, менеджеры секретов или конфигурацию с шифрованием.
  • Ограничьте права «тестового» аккаунта.
  • В продакшене отдавайте предпочтение API-поставщикам почты с поддержкой ключей и мониторинга (SendGrid, Mailgun, SES).
  • Логируйте события аутентификации и превышение квот, но не записывайте тела писем с личными данными в незащищённые логи.

Тесты и критерии приёмки

Минимальные тесты, которые стоит включить в CI/CD или локальную проверку:

  • Успешное соединение с SMTP-сервером (таймаут ≤ 10 с).
  • Успешная аутентификация с текущими учётными данными.
  • Корректная отправка письма — проверка, что SMTP вернул 250/OK или соответствующий ответ.
  • Проверка формата сообщений: заголовки From/To/Subject не пусты.
  • Тест с вложением (если поддерживается): вложение открывается и не повреждено.

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

  • Письмо доставляется (локальный тест) или сервер возвращает подтверждение отправки без ошибок.
  • Логи не содержат паролей или PII.
  • Время выполнения отправки < 5 секунд (локальная сеть/провайдер может влиять).

Отказоустойчивость и обработка ошибок

Когда отправка может не сработать:

  • Превышение лимитов отправки (rate limits).
  • Блокировка со стороны провайдера (подозрение на спам).
  • Ошибки сети или таймауты.
  • Неправильные заголовки или испорченная кодировка.

Как действовать — простая методика:

  1. Повторная попытка с экспоненциальной задержкой для временных ошибок.
  2. Переключение на резервный SMTP-провайдер при массовых отказах.
  3. Логирование и уведомление ответственного инженера при критических ошибках.

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

  • SMTP напрямую (как в руководстве) — простой и контролируемый, но требует управления секретами и мониторинга.
  • Почтовые API (SendGrid, Mailgun, Amazon SES) — удобнее в продакшне: поддержка шаблонов, аналитики, обработка отказов.
  • SMTP через сторонние библиотеки/SDK — используются для упрощения OAuth2 аутентификации или массовой отправки.

Когда SMTP прямо не подходит: массовые рассылки, транзакции с высокой доставляемостью и требованиями отчетности лучше реализовать через API-поставщика.

Чек-лист ролей

  • Разработчик:

    • Проверить формат письма и кодировку UTF-8.
    • Добавить обработку ошибок и retry.
    • Не хранить пароли в репозитории.
  • Системный администратор / DevOps:

    • Настроить мониторинг SMTP и алерты.
    • Защитить секреты (Vault/Secrets Manager).
    • Обеспечить резервный способ отправки.
  • Маркетолог / Контент-менеджер:

    • Проверить шаблоны и отправить контрольные письма.
    • Убедиться, что письма не попадают в спам (SPF/DKIM/DMARC).

Практический мини-план внедрения (методология)

  1. Разработать прототип с локальным отладчиком.
  2. Подключиться к тестовому SMTP-аккаунту.
  3. Добавить TLS/SSL и безопасное хранение секретов.
  4. Прогнать тесты приёмки и мониторинг.
  5. Перейти на продакшн‑аккаунт или API-поставщика.

Короткая галерея типичных проблем и решений

  • Проблема: «Authentication failed» — Решение: проверьте пароль, 2FA, app password или OAuth2.
  • Проблема: письма попадают в спам — Решение: настройте SPF, DKIM, DMARC; проверьте содержимое и заголовки.
  • Проблема: слишком медленная отправка — Решение: используйте пулы соединений, асинхронную отправку или сторонний API.

Маленький набор шаблонов и сниппетов

  1. Шаблон для асинхронной отправки (концептуально):
# Запускайте отправку в фоне (celery, asyncio, threadpool)
# task.send_email(message, recipients)
  1. Переменные окружения (пример .env):
SMTP_SERVER=smtp.gmail.com
SMTP_PORT=587
SMTP_USER=my_email@gmail.com
SMTP_PASS=app_password_here

Короткий глоссарий в одну строку

  • SMTP: протокол передачи почты между серверами.
  • MTA: Mail Transfer Agent — программный агент, пересылающий почту.
  • STARTTLS: метод переключения на защищённое TLS-соединение.
  • SPF/DKIM/DMARC: записи и механизмы для повышения доверия к отправителю.

Когда не использовать прямой SMTP

  • Для массовых маркетинговых рассылок лучше специализированные сервисы.
  • Когда нужна интеграция с аналитикой и шаблонами — API провайдера.

Рекомендации по GDPR и приватности

  • Не отправляйте персональные данные без согласия.
  • Храните логи и тела писем в зашифрованном виде или избегайте записи PII.
  • При работе с EU‑гражданами учитывайте требования локального законодательства и соглашения о передаче данных.

Заключение

Отправка писем через SMTP в Python — базовый и полезный навык. Для прототипов и небольших проектов прямой SMTP подойдёт хорошо; для продакшна и массовой рассылки лучше рассмотреть специализированные сервисы. Всегда добавляйте шифрование, безопасное хранение секретов и мониторинг. Уделите внимание настройке SPF/DKIM/DMARC и тестам приёмки.

Ключевые шаги: подготовить учётную запись, собрать сообщение (EmailMessage), подключиться через TLS/SSL, корректно обработать ошибки и защитить учётные данные.

Важно: начните с локальной отладки и постепенно переносите систему в продакшн с контролем безопасности.

Краткое резюме

  • SMTP — протокол обмена почтой; Python имеет smtplib и email для формирования и отправки сообщений.
  • Используйте STARTTLS или SSL/TLS для шифрования.
  • Храните секреты безопасно и обрабатывайте ошибки.
  • Для массовых сценариев рассматривайте почтовые API.
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

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

Папка автозагрузки Windows — найти и управлять
Windows

Папка автозагрузки Windows — найти и управлять

Отключить исчезновение окон в macOS Sonoma
macOS

Отключить исчезновение окон в macOS Sonoma

Отключить клавишу Globe на Mac
macOS

Отключить клавишу Globe на Mac

Отключить миниатюры скриншотов на Mac
macOS

Отключить миниатюры скриншотов на Mac

RAW в JPEG на Mac — через Preview
Фото

RAW в JPEG на Mac — через Preview

Удалить фон с фото на Mac — быстро и без программ
macOS

Удалить фон с фото на Mac — быстро и без программ