Перейти к документации
База знаний

Переезд с Postmark

Оставьте библиотеку Postmark и отправляйте через OpenEmail. Смените её хост и серверный токен, а код отправки останется как есть.

Что изменить

Направьте библиотеку на https://api.openemail.uk/compat/postmark и поставьте туда, где стоит серверный токен, ключ API OpenEmail с разрешением emails:send. Он передаётся в том же заголовке X-Postmark-Server-Token. Ваши вызовы, которые отправляют почту, остаются как есть, а адрес From решает, может ли письмо уйти, как и везде в OpenEmail.

import { ServerClient } from 'postmark' const client = new ServerClient(process.env.OPENEMAIL_API_KEY, {  requestHost: 'api.openemail.uk/compat/postmark',}) await client.sendEmail({  From: '[email protected]',  To: '[email protected]',  Subject: 'Your invoice',  HtmlBody: '<p>Your invoice is attached.</p>',  MessageStream: 'outbound',})

В Node requestHost указывает хост и путь вместе, без схемы и без завершающей косой черты. В Ruby path_prefix нужна косая черта с обеих сторон. В Python используйте официальный пакет postmark-python с base_url. Пакет сообщества postmarker не умеет обращаться к пути ниже хоста, поэтому здесь он не работает. В PHP PostmarkClient::$BASE_URL принимает схему, хост и путь без завершающей косой черты. Это статическое свойство, поэтому оно действует для всех клиентов Postmark в процессе, включая PostmarkAdminClient.

Что чему соответствует

Обслуживаются эндпоинты POST /email, /email/batch, /email/withTemplate и /email/batchWithTemplates. Имена полей совпадают в любом регистре, как и в Postmark, а пустая строка считается отсутствующей.

PostmarkВ OpenEmail
FromОтправитель вместе с именем.
ToПолучатели через запятую. Вместе с Cc и Bcc до 50 на письмо.
ReplyToОдин адрес для ответа.
SubjectТема.
HtmlBodyЧасть HTML. TextBody становится текстовой частью, и одна из двух обязательна.
HeadersСвои заголовки в виде Name и Value: X-*, List-*, Reply-To, Precedence, Auto-Submitted, Importance, Priority и Feedback-ID.
AttachmentsФайлы, не больше 20 и 5 МБ в сумме. Изображение, чей ContentID HTML использует как cid:, встраивается там, где оно стоит. Любой другой файл приходит обычным вложением.
TagТег с именем tag.
MetadataТеги с теми же именами и значениями. Вместе с Tag не больше 10 на письмо.
TrackOpensВключает или выключает отслеживание открытий для письма.
MessageStreamoutbound или id любого другого транзакционного потока отправляет письмо как обычно.
TemplateAliasslug или id (tpl_...) шаблона OpenEmail, заполненного из TemplateModel. InlineCss принимается и ничего не меняет.

Что отклоняется и почему

  • TemplateId, с ErrorCode 1101. id шаблона Postmark здесь ничего не значит, поэтому создайте шаблон заново в OpenEmail и отправляйте его slug или id в TemplateAlias.
  • Поток broadcast, с ErrorCode 1236. Эти эндпоинты отправляют транзакционную почту, а новостные письма уходят рассылками OpenEmail.
  • Subject, HtmlBody или TextBody в письме по шаблону, с ErrorCode 1123, потому что их даёт шаблон. TrackLinks со значением TextOnly, потому что OpenEmail отслеживает ссылки в части HTML.
  • Больше одного адреса для ответа, заголовок, заданный дважды или не из списка выше, больше 10 тегов, а также имя тега или Metadata из чего-то, кроме букв, цифр, _ и -.
  • Пакет больше 100 писем, с ErrorCode 410. Postmark принимает 500, поэтому делите пакеты побольше.

Ответы и ошибки

  • Отправка отвечает 200 с To, SubmittedAt, MessageID, ErrorCode 0 и Message OK. В MessageID лежит id письма OpenEmail, тот, что используют GET /emails/{id} и вебхуки. Заголовок Idempotency-Key работает так же, как в остальном API.
  • Пакет отвечает 200 с одним результатом на письмо, в том же порядке. Письмо, которое не прошло, несёт только свои ErrorCode и Message, а остальные всё равно уходят.
  • Ошибки приходят как ErrorCode и Message. Отсутствующий или неизвестный ключ, а также ключ без emails:send, получает HTTP 401 с ErrorCode 10. Остальное получает HTTP 422: ErrorCode 300 для самого письма, 400 для адреса From, который ключу нельзя использовать, 401 для домена, который ещё не может отправлять, 402 для тела, которое не является JSON, и 405 для рабочего пространства, исчерпавшего лимит отправки. HTTP 413 означает, что тело больше 10 МБ, или 50 МБ для пакета, или вложения больше 5 МБ.