Интеграция Postmark для транзакционных email
Postmark специализируется исключительно на транзакционной почте (не рассылки) и гарантирует доставку за 10 секунд. У них отдельные пулы IP для транзакционных и bulk-писем, что сохраняет репутацию домена. Хороший выбор, если критична скорость доставки — подтверждения оплаты, reset password.
Установка
npm install postmark
Отправка через API
import * as postmark from 'postmark';
const client = new postmark.ServerClient(process.env.POSTMARK_SERVER_TOKEN!);
// Простая отправка с HTML
await client.sendEmail({
From: '[email protected]',
To: '[email protected]',
Subject: 'Ваш заказ подтверждён',
HtmlBody: '<strong>Заказ #12345 принят!</strong>',
TextBody: 'Заказ #12345 принят!',
MessageStream: 'outbound', // транзакционный поток
});
Шаблоны Postmark
Postmark хранит шаблоны на своей стороне с синтаксисом Mustache:
// Отправка по шаблону (TemplateAlias из Postmark dashboard)
await client.sendEmailWithTemplate({
From: '[email protected]',
To: user.email,
TemplateAlias: 'order-confirmation',
TemplateModel: {
customer_name: user.name,
order_id: order.id,
order_total: formatCurrency(order.total),
order_url: `https://app.example.com/orders/${order.id}`,
support_email: '[email protected]',
},
MessageStream: 'outbound',
});
Webhooks для событий доставки
// POST /api/webhooks/postmark
app.post('/api/webhooks/postmark', async (req, res) => {
const event = req.body as postmark.DeliveryWebhook | postmark.BounceWebhook;
if ('DeliveredAt' in event) {
// Delivery event
await logEmailDelivered(event.MessageID, event.Recipient);
} else if ('Type' in event) {
// Bounce event
if (event.Type === 'HardBounce') {
await markEmailInvalid(event.Email);
}
}
res.status(200).end();
});
Message Streams
Postmark разделяет потоки:
-
outbound— транзакционные письма (order confirmation, reset password, invoice) -
broadcast— маркетинговые рассылки (нужно явно создать в дашборде)
Это гарантирует, что массовая рассылка не испортит репутацию для транзакционных писем.
Сроки
Интеграция Postmark + шаблоны + webhooks — 1–2 дня.







