v1.1.0 Stable

Почта для людей.

py-postman берёт на себя всю рутину по настройке портов, MIME-заголовков и протоколов. Идеальный инструмент для надёжных уведомлений, ботов на aiogram и сервисов на FastAPI

pip install py-postman-lib

Инициализация клиента

Класс Postman является точкой входа. Используйте встроенные пресеты провайдеров (gmail, yandex, mail.ru, outlook) или передайте кастомные конфигурации вашего SMTP-сервера.

main.py
from py_postman import Postman

# Базовая инициализация (Zero-config)
mailer = Postman(
    email="your_email@gmail.com",
    password="your_app_password",
    provider="gmail"
)

# Продвинутая инициализация
mailer_pro = Postman(
    email="bot@mycompany.com",
    password="super_secret",
    custom_config={"host": "smtp.mycompany.com", "port": 465, "use_ssl": True},
    test_mode=False,                  # Режим «Песочницы»
    tg_token="12345:ABCDE",           # Токен Telegram для доставки логов
    tg_chat_id="987654321"            # ID чата администратора
)

Отправка базового письма

Метод send() позволяет отправлять письмо одному или нескольким адресатам, использовать копии (CC, BCC) и помечать корреспонденцию как важную.

success = mailer.send(
    to=["client1@mail.ru", "client2@gmail.com"],
    subject="Срочный отчет 🚨",
    text="Привет, это обычное текстовое сообщение.",
    cc="manager@company.com",      # Копия
    bcc="crm@company.com",         # Скрытая копия
    reply_to="support@company.com",# Обратный адрес
    priority="high"                # Отметить письмо как важное
)

if success:
    print("Успешно!")

Markdown, HTML и Шаблоны

Больше не нужно вручную прописывать сложную HTML-вёрстку. Транслируйте Markdown напрямую в письмо или применяйте встроенные дизайн-пресеты.

Магия Markdown
mailer.send(
    to="dev@company.com",
    subject="Релиз",
    markdown="""
    # Новый релиз! 🚀

    Вот список изменений:
    * Добавлен парсинг Markdown
    * Улучшена маршрутизация

    Код: `print('Hello World')`
    """
)
Встроенные дизайны
# Подстановка в красивый HTML
mailer.send(
    to="new@mail.com",
    subject="Добро пожаловать!",

    # Доступно: 'welcome', 'reset_password'
    builtin_template="welcome",

    template_context={
        "name": "Алексей",
        "link": "https://site.com/start"
    }
)

Файлы, Байты и Авто-ZIP

Флаг auto_zip=True позволяет автоматически сжимать массивные файлы в единый архив перед отправкой. Это существенно экономит трафик и предотвращает отказ серверов из-за превышения лимитов на размер вложений.

Best Practice: Используйте attachments_bytes, если вы генерируете PDF или Excel-отчеты «на лету» в оперативной памяти. Это позволит избежать создания и удаления временных файлов на диске вашего сервера.

# Данные в оперативной памяти (например, сгенерированный PDF)
pdf_data = b"%PDF-1.4 ... (сырые байты) ..."

mailer.send(
    to="boss@company.com",
    subject="Квартальные отчеты",

    # 1. Файлы с диска (будут сжаты в .zip)
    attachments=["./huge_video.mp4", "./logs.txt"],
    auto_zip=True,

    # 2. Файлы из памяти (bytes)
    attachments_bytes=[
        {"name": "report.pdf", "data": pdf_data, "mime_type": "application/pdf"}
    ],

    # 3. Встраивание изображений в тело письма (Inline images)
    html='Посмотри на этот график: <img src="cid:my_chart">',
    inline_images={"my_chart": "./sales_chart.png"}
)

Инвайты в Календарь

Библиотека автоматически формирует валидный .ics файл, корректно обрабатывает спам-фильтры (генерируя уникальные UID) и выводит интерактивную кнопку «Добавить в Календарь» в интерфейсе почтового клиента получателя.

mailer.send(
    to="team@company.com",
    subject="Еженедельный Синхрон 📅",
    text="Жду всех на звонке.",
    calendar_event={
        "title": "Синхронизация команды",
        "start": "20260224T100000Z", # Формат времени UTC (YYYYMMDDTHHMMSSZ)
        "end": "20260224T110000Z",
        "location": "Zoom / Google Meet"
    }
)

Асинхронность и Сессии (Keep-Alive)

Используйте контекстный менеджер AsyncMailSession для поддержки постоянного соединения (Keep-Alive). Это обеспечивает высокую пропускную способность при массовых рассылках, исключая издержки на повторную авторизацию (handshake) при отправке каждого нового письма.

import asyncio

async def mass_mailing():
    users = ["user1@mail.com", "user2@mail.com", "user3@mail.com"]

    # Открываем единое соединение с SMTP-сервером
    async with mailer.get_async_session() as session:
        for user in users:
            # Отправка без задержек на переподключение
            await session.send_async(to=user, subject="Дайджест", text="Привет!")

asyncio.run(mass_mailing())

Песочница и Telegram Логгер

Укажите test_mode=True во время локальной разработки — письма будут выводиться в консоль, а не уходить в сеть. Если передать параметры Telegram, внутренний логгер перехватит критические ошибки SMTP и мгновенно доставит подробный traceback напрямую в ваш админ-чат.

Postman Logger Bot 14:42

Критическая ошибка отправки

Не удалось доставить письмо на адрес user@company.com.

smtplib.SMTPAuthenticationError: (535, b'5.7.8 Username and Password not accepted. Learn more at\n5.7.8  https://support.google.com/mail/')

Гайды и Практические Примеры

1. Отлов критических ошибок в FastAPI

Автоматическая отправка логов администратору при падении эндпоинта 500-й ошибкой.

main.py
from fastapi import FastAPI, Request
from py_postman import Postman
import traceback

app = FastAPI()
mailer = Postman(email="bot@site.com", password="pass", provider="gmail")

@app.exception_handler(Exception)
async def global_exception_handler(request: Request, exc: Exception):
    error_trace = "".join(traceback.format_exception(type(exc), exc, exc.__traceback__))

    # Отправляем письмо админу асинхронно
    await mailer.send_async(
        to="admin@site.com",
        subject=f"🚨 Ошибка на {request.url.path}",
        markdown=f"**Произошла ошибка 500:**\n\n```python\n{error_trace}\n```",
        priority="high"
    )
    return {"message": "Internal Server Error"}

2. Ежедневный отчет с графиком (Встроенные картинки)

Генерация красивого письма с использованием Markdown и встраиванием локального изображения прямо в текст.

report.py
mailer.send(
    to="ceo@company.com",
    subject="📊 Отчет за 24 октября",
    markdown="""
    ## Доброе утро!

    За прошедшие сутки мы наблюдаем стабильный рост. Обратите внимание на график ниже:

    График

    **Ключевые метрики:**
    * Регистрации: +150
    * Доход: $4,500
    """,
    inline_images={"daily_chart": "assets/today_growth.png"}
)

История версий

v0.1.0

Current 24 Февраля, 2026
  • Первый стабильный релиз библиотеки py-postman.
  • Поддержка синхронной и асинхронной отправки писем (включая сессии Keep-Alive).
  • Поддержка Markdown, встроенных HTML шаблонов (Jinja2) и удобная работа с вложениями (в т.ч. auto_zip и отправка байтов напрямую из ОЗУ).
  • Интегрирован логгер ошибок для Telegram Bot API.
  • Добавлен CLI-интерфейс для отправки писем прямо из консоли.

Справочник API: send()

Параметр Тип Описание
to * str | list[str] Email получателя (или список адресов).
subject * str Тема письма.
text str Обычный текстовый контент письма (Plain text fallback).
html str HTML-разметка тела письма.
markdown str Текст в формате Markdown. Будет автоматически скомпилирован в валидный HTML.
builtin_template str Идентификатор встроенного дизайн-пресета (напр., 'welcome', 'reset_password').
template_context dict Словарь с переменными для динамической подстановки в HTML/Шаблоны (через Jinja2).
attachments list[str] Список локальных путей к файлам на диске для вложения.
attachments_bytes list[dict] Файлы из оперативной памяти.
[{"name": "x.pdf", "data": b"...", "mime_type": "application/pdf"}]
inline_images dict Изображения для вставки непосредственно в HTML-тело письма.
{"cid_name": "path/img.png"}
calendar_event dict Конфигурация для генерации инвайта .ics. Требует наличия ключей: title, start, end.
cc / bcc str | list[str] Адреса для Копии (CC) и Скрытой копии (BCC).
priority str Передайте "high", чтобы форсировать метку высокой важности (обычно красный восклицательный знак в UI клиента).
tracking_url str URL вебхука. Вставляет невидимый пиксель 1x1 в HTML для отслеживания факта прочтения письма.
auto_zip bool Если True, архивирует все элементы из attachments в единый .zip архив в ОЗУ перед отправкой.