Перейти к основному содержимому

Отправка письма

POST /v1/emails
Authorization: Bearer mi_live_…
Content-Type: application/json

Возвращает 202 Accepted и присвоенный id ещё до фактической доставки. Итоговый статус приходит через вебхуки или его можно запросить по id.

Минимальный пример

curl -X POST https://api.mailinfra.ru/v1/emails \
-H "Authorization: Bearer mi_live_xxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"from": "hello@ваш-домен.ru",
"to": ["user@example.com"],
"subject": "Добро пожаловать!",
"html": "<p>Привет!</p>",
"text": "Привет!"
}'

Ответ:

{
"data": {
"id": "018e1b7a-1111-7000-aaaa-111111111111",
"status": "QUEUED",
"skipped_recipients": []
}
}

Параметры запроса

ПолеТипОбязательноОписание
fromstringдаEmail отправителя. Домен должен быть верифицирован и привязан к проекту.
from_namestringОтображаемое имя (до 200 символов). В клиенте: Имя <from>.
tostring[]даПолучатели. Сумма to + cc + bcc ≤ 50.
ccstring[]CC.
bccstring[]BCC.
reply_tostring[]До 10 адресов.
subjectstring*До 998 символов, без переводов строк.
htmlstring*HTML-тело письма.
textstring*Текстовая версия. Рекомендуется указывать вместе с html.
headersobjectПользовательские заголовки (см. ниже).
tagsstring[]До 10 меток, каждая до 32 символов.
templatestring*Slug шаблона.
variablesobjectПеременные для рендера шаблона.
attachmentsobject[]До 10 вложений в base64 (см. ниже).

* Без template обязательны subject и хотя бы одно из html / text. С template тема и тело берутся из шаблона.

Пользовательские заголовки

{
"headers": {
"X-Order-Id": "12345",
"X-User-Id": "usr_abc"
}
}

Нельзя переопределить системные заголовки: from, to, cc, bcc, reply-to, subject, message-id, date, dkim-signature, received, return-path и любые x-mailinfra-*.

Такой запрос отклоняется целиком с 422 reserved_email_header; заголовок не игнорируется молча:

{
"error": {
"code": "reserved_email_header",
"message": "Системные заголовки письма нельзя переопределять.",
"details": {
"code": "reserved_email_header",
"header": "From"
}
},
"request_id": "…"
}

Значения пользовательских заголовков не могут содержать переводы строк (\r или \n). Это защищает письмо от header injection.

Вложения

Содержимое файла передаётся обычной base64-строкой без префикса data::

{
"from": "hello@ваш-домен.ru",
"to": ["user@example.com"],
"subject": "Документы по заказу",
"text": "Документы во вложении.",
"attachments": [
{
"filename": "invoice.pdf",
"content_type": "application/pdf",
"content_base64": "JVBERi0xLjQK…"
}
]
}
ПолеОбязательноОписание
filenameдаОтображаемое имя файла, до 255 символов. Пути удаляются.
content_typeMIME-тип; по умолчанию application/octet-stream.
content_base64даБайты файла в base64. Переносы MIME-base64 допустимы.

Ограничения: до 10 вложений, до 10 МиБ на файл и до 25 МиБ суммарно. Размер считается после декодирования base64. Невалидный base64 и превышение лимита отклоняют письмо до его создания.

Идемпотентность

POST /v1/emails
Idempotency-Key: order-12345-welcome

Повтор того же запроса с тем же ключом:

  • 200 OK (вместо 202)
  • заголовок Idempotent-Replayed: true
  • тело идентично первому ответу, повторной отправки не происходит

Используйте, если вызываете API по сетевому таймауту — это безопаснее try/except с retry.

Пропущенные получатели

Адреса из списка подавления тихо исключаются:

{
"data": {
"id": "...",
"status": "QUEUED",
"skipped_recipients": [
{ "email": "blocked@example.com", "reason": "suppressed" }
]
}
}

Если все получатели подавлены — письмо не создаётся, возвращается 422 с кодом all_recipients_suppressed.

Статусы письма

QUEUED → SENDING → SENT → DELIVERED
↘ BOUNCED
↘ COMPLAINED
↘ FAILED
СтатусЗначение
QUEUEDПринято в очередь
SENDINGПередаётся в MTA
SENTПередано SMTP-серверу получателя
DELIVEREDПолучено получателем
BOUNCEDНедоставка
COMPLAINEDЖалоба на спам
FAILEDВнутренняя ошибка отправки
SIMULATEDTEST-ключ, реальной отправки не было

Click tracking

Если в проекте включён Click tracking, MailInfra перепишет абсолютные HTTP- и HTTPS-ссылки в HTML-теле письма и создаст событие clicked при переходе получателя.

Чтение письма и событий

GET /v1/emails
GET /v1/emails/{id}
GET /v1/emails/{id}/events

Доступно ключам с правом чтения (FULL_ACCESS, READ_ONLY). Реал-тайм без поллинга — через вебхуки.

Лимиты

Все лимиты — на странице Ошибки и лимиты →.