Обзор

Интеграции

Руководство пользователя

Справочник API

Вебхуки

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

Отправка письма через сервер Haskimail. Письмо по сохраненному шаблону отправляется методом /email/withTemplate. Несколько писем одним запросом отправляет пакетная отправка.

Отправка одного письма #

post

/email

Ответ с 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 обязательный

Адрес отправителя. Он должен быть на подтвержденном домене аккаунта. Имя отправителя указывается так: Магазин <shop@example.com>.

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

Дополнительные заголовки письма: список объектов {"Name": "…", "Value": "…"}.

TrackOpens boolean

Включить или выключить отслеживание открытий для этого письма. Без параметра действует настройка сервера.

TrackLinks boolean | string

Включить или выключить отслеживание кликов для этого письма. Без параметра действует настройка сервера. Строкой — как в Postmark: None (без учета регистра) выключает, любое другое значение включает. Режим письма (только HTML или только текст) строкой не задается — это настройка сервера.

Metadata object

Произвольные данные «ключ — значение», привязанные к письму.

Attachments array

Вложения: список объектов с полями Name (имя файла), Content (содержимое в Base64) и ContentType. Чтобы встроить картинку в HTML, добавьте поле ContentID и сошлитесь на нее как cid:….

MessageStream string

ID канала, через который отправляется письмо, — из списка каналов. Канал должен принадлежать серверу ключа, не быть входящим и не находиться в архиве (иначе ошибка 1226). Если не указан, письмо уходит через транзакционный канал сервера по умолчанию; если исходящих каналов у сервера еще нет, такой канал создается. Если активные исходящие каналы у сервера только массовые, вернется ошибка 1226 — укажите канал явно.

Ответ

To string

Получатели из запроса.

SubmittedAt string

Время приема письма, YYYY-MM-DD HH:MM:SS, МСК.

MessageID string

ID письма. Если получателей несколько, ID перечислены через запятую в том же порядке. По ID ищут письмо в API сообщений.

ErrorCode integer

0 — письмо принято в отправку. Иначе — код ошибки, HTTP-статус ответа при этом 422.

Message string

Описание результата.

Пример запроса с curl

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"
}

Пакетная отправка #

post

/email/batch

Отправляет до 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

Время приема письма, YYYY-MM-DD HH:MM:SS, МСК.

MessageID string

ID письма; если получателей несколько — через запятую в том же порядке. У отклоненного письма — null.

ErrorCode integer

0 — письмо принято в отправку. Иначе — код ошибки этого письма; на остальные письма пакета он не влияет.

Message string

Описание результата.

Пример запроса с curl

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-адрес получателя"
  }
]