Python SDK
pip install mailinfra
Требуется Python 3.10+. Зависимости — httpx и pydantic.
Первое письмо
from mailinfra import MailInfra
client = MailInfra() # ключ из переменной окруж ения MAILINFRA_API_KEY
result = client.emails.send(
from_email="hello@ваш-домен.ru",
to="user@example.com",
subject="Добро пожаловать!",
html="<p>Привет!</p>",
text="Привет!",
)
print(result.id, result.status)
export MAILINFRA_API_KEY=mi_live_xxxxxxxx
Ключ можно передать и явно: MailInfra(api_key="mi_live_…"). Тестовый ключ
mi_test_… работает через тот же клиент: письмо сохраняется со статусом SIMULATED,
не доставляется и не расходует месячный объём плана.
Защита от перепутанных ключей
MailInfra(require_environment="live") не даст клиенту создаться, если в конфигурации
оказался тестовый ключ. Обратное тоже работает: require_environment="test" в тестах
гарантирует, что боевой ключ не отправит настоящие письма.
Отправка по шаблону
client.emails.send(
from_email="no-reply@ваш-домен.ru",
to=["anna@example.com", "boris@example.com"],
template="welcome", # тема берётся из шаблона
variables={"user_name": "Анна", "app_name": "MyApp"},
tags=["onboarding"],
)
Вложения
SDK сам кодирует байты в base64:
from mailinfra import Attachment
client.emails.send(
from_email="billing@ваш-домен.ru",
to="user@example.com",
subject="Счёт за май",
text="Счёт во вложении.",
attachments=[
Attachment(
filename="invoice.pdf",
content=open("invoice.pdf", "rb").read(),
content_type="application/pdf",
)
],
)
Картинка внутри письма — Attachment(..., content_id="logo"), в HTML на неё
ссылаются как <img src="cid:logo">.
Metadata, отложенная отправка и срок жизни
from datetime import datetime, timedelta, timezone
reminder = client.emails.send(
from_email="no-reply@ваш-домен.ru",
to="user@example.com",
template="webinar_reminder",
metadata={"webinar_id": "w-17"}, # вернётся в письме и вебхуках
send_at=datetime.now(timezone.utc) + timedelta(hours=23), # только с часовым поясом
ttl=1800, # секунд; позже письмо уже не нужно
)
print(reminder.status) # SCHEDULED
client.emails.reschedule(reminder.id, send_at="2026-11-01T08:00:00+03:00")
client.emails.cancel(reminder.id) # статус CANCELED, резерв квоты вернётся
metadata— до 20 ключей (до 40 символов из латиницы, цифр и_.-), значения — строки до 500 символов, всё — до 4 КБ; SDK проверяет это до запроса.send_at— не дальше 7 дней от приёма; дальше —SendAtTooFarError. Уже ушедшее или отменённое письмо —EmailNotScheduledError.ttl— от 60 до 86 400 секунд, отсчёт отsend_atили от приёма.