Переезд с 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 | Включает или выключает отслеживание открытий для письма. |
| TrackLinks | HtmlAndText и HtmlOnly включают отслеживание кликов, а None выключает его. |
| MessageStream | outbound или id любого другого транзакционного потока отправляет письмо как обычно. |
| TemplateAlias | slug или 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,ErrorCode0 иMessageOK. В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 МБ.