Отправка письма через сервер Haskimail. Письмо по сохраненному шаблону отправляется методом /email/withTemplate. Несколько писем одним запросом отправляет пакетная отправка.
Ответ с ErrorCode: 0 означает, что письмо принято и поставлено в очередь. Что было дальше — доставка, возврат, открытие, — видно в API сообщений, API возвратов и в вебхуках.
Пока аккаунт на модерации, отправлять можно только с подтвержденных адресов и доменов аккаунта и только на них (ошибки 400 и 412). Чтобы проверить запрос без отправки, передайте в заголовке X-Haskimail-Server-Token значение HASKIMAIL_API_TEST.
| Accept | обязательный application/json |
|---|---|
| Content-Type | обязательный application/json |
| X-Haskimail-Server-Token | обязательный Серверный API-ключ. Он есть в настройках сервера на вкладке «API-ключи». |
| From | string | обязательный Адрес отправителя. Он должен быть на подтвержденном домене аккаунта. Имя отправителя указывается так: |
|---|---|---|
| To | string | обязательный Адреса получателей через запятую. Каждый получатель получает отдельное письмо со своим MessageID. |
| Cc | string |
Получатели копии через запятую. |
| Bcc | string |
Получатели скрытой копии через запятую. |
| Subject | string |
Тема письма. |
| HtmlBody | string |
HTML-версия письма. Нужен HtmlBody, TextBody или оба. |
| TextBody | string |
Текстовая версия письма. |
| Tag | string |
Тег письма. По нему фильтруют письма, открытия, клики и возвраты в API. |
| ReplyTo | string |
Адрес для ответа (заголовок Reply-To). |
| Headers | array |
Дополнительные заголовки письма: список объектов |
| TrackOpens | boolean |
Включить или выключить отслеживание открытий для этого письма. Без параметра действует настройка сервера. |
| TrackLinks | boolean | string |
Включить или выключить отслеживание кликов для этого письма. Без параметра действует настройка сервера. Строкой — как в Postmark: |
| Metadata | object |
Произвольные данные «ключ — значение», привязанные к письму. |
| Attachments | array |
Вложения: список объектов с полями |
| MessageStream | string |
ID канала, через который отправляется письмо, — из списка каналов. Канал должен принадлежать серверу ключа, не быть входящим и не находиться в архиве (иначе ошибка 1226). Если не указан, письмо уходит через транзакционный канал сервера по умолчанию; если исходящих каналов у сервера еще нет, такой канал создается. Если активные исходящие каналы у сервера только массовые, вернется ошибка 1226 — укажите канал явно. |
| To | string |
Получатели из запроса. |
|---|---|---|
| SubmittedAt | string |
Время приема письма, |
| MessageID | string |
ID письма. Если получателей несколько, ID перечислены через запятую в том же порядке. По ID ищут письмо в API сообщений. |
| ErrorCode | integer |
0 — письмо принято в отправку. Иначе — код ошибки, HTTP-статус ответа при этом 422. |
| Message | string |
Описание результата. |
curl "https://api.haskimail.ru/email" \
-X POST \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "X-Haskimail-Server-Token: server token" \
-d '{
"From": "Магазин <shop@example.com>",
"To": "ivan@example.com",
"Subject": "Ваш заказ №1042 оформлен",
"HtmlBody": "<html><body><p>Здравствуйте! Заказ №1042 оформлен.</p></body></html>",
"TextBody": "Здравствуйте! Заказ №1042 оформлен.",
"Tag": "orders",
"ReplyTo": "support@example.com",
"Headers": [
{
"Name": "X-Order-Id",
"Value": "1042"
}
],
"TrackOpens": true,
"TrackLinks": true,
"Metadata": {
"order_id": "1042"
},
"MessageStream": "2081"
}'
HTTP/1.1 200 OK
Content-Type: application/json
{
"To": "ivan@example.com",
"SubmittedAt": "2026-10-07 14:30:12",
"MessageID": "6f1c0b2d9e8a4f7b3c5d2e1a0b9c8d7e",
"ErrorCode": 0,
"Message": "OK"
}
Отправляет до 500 писем одним запросом — у каждого свои получатели, тема и содержимое. Размер запроса — до 50 МБ.
Письма проверяются и ставятся в очередь независимо друг от друга: отказ одного письма не останавливает остальные. HTTP-статус ответа — 200, даже если часть писем отклонена, поэтому проверяйте ErrorCode каждого элемента ответа.
Если не разобран сам пакет — тело не в том формате, писем нет или их больше 500, — вернется HTTP 422 с кодом 300, а для запроса больше 50 МБ — HTTP 413. Ни одно письмо при этом не отправляется. Если в настройках аккаунта задан список разрешенных IP-адресов, пакет с другого адреса получит HTTP 403.
С тестовым ключом HASKIMAIL_API_TEST письма пакета только проверяются и никуда не уходят.
| Accept | обязательный application/json |
|---|---|
| Content-Type | обязательный application/json |
| X-Haskimail-Server-Token | обязательный Серверный API-ключ. Он есть в настройках сервера на вкладке «API-ключи». |
JSON-массив писем: от 1 до 500 объектов. Поля письма — те же, что у отправки одного письма. Письмо можно отправить и по шаблону: укажите в нем TemplateId или TemplateAlias и TemplateModel, как в отправке письма с шаблоном.
Массив объектов — по одному на письмо, в порядке писем запроса.
| To | string |
Получатели письма из запроса. |
|---|---|---|
| SubmittedAt | string |
Время приема письма, |
| MessageID | string |
ID письма; если получателей несколько — через запятую в том же порядке. У отклоненного письма — |
| ErrorCode | integer |
0 — письмо принято в отправку. Иначе — код ошибки этого письма; на остальные письма пакета он не влияет. |
| Message | string |
Описание результата. |
curl "https://api.haskimail.ru/email/batch" \
-X POST \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "X-Haskimail-Server-Token: server token" \
-d '[
{
"From": "Магазин <shop@example.com>",
"To": "ivan@example.com",
"Subject": "Ваш заказ №1042 оформлен",
"HtmlBody": "<html><body><p>Здравствуйте, Иван! Заказ №1042 оформлен.</p></body></html>",
"Tag": "orders",
"MessageStream": "2081"
},
{
"From": "Магазин <shop@example.com>",
"To": "anna.example.com",
"Subject": "Ваш заказ №1043 оформлен",
"HtmlBody": "<html><body><p>Здравствуйте, Анна! Заказ №1043 оформлен.</p></body></html>",
"Tag": "orders",
"MessageStream": "2081"
}
]'
HTTP/1.1 200 OK
Content-Type: application/json
[
{
"To": "ivan@example.com",
"SubmittedAt": "2026-10-13 14:30:12",
"MessageID": "6f1c0b2d9e8a4f7b3c5d2e1a0b9c8d7e",
"ErrorCode": 0,
"Message": "OK"
},
{
"To": "anna.example.com",
"SubmittedAt": "2026-10-13 14:30:12",
"MessageID": null,
"ErrorCode": 6,
"Message": "Некорректный email-адрес получателя"
}
]