Guia
Migrar do Postmark
Migre do Postmark para o Emailit. Faça a correspondência de servers, message streams e tokens, converta os campos da API, troque as configurações SMTP e migre webhooks, supressões e templates.
Este guia mostra a correspondência entre os conceitos, as chamadas à API, os webhooks, as supressões e os templates do Postmark e os equivalentes no Emailit. Leia antes Migrar para o Emailit para conhecer a ordem geral e saber como usar os dois provedores em paralelo.
Conceitos
| Postmark | Emailit |
|---|---|
| Account | Conta |
| Server | Workspace, ou um workspace com vários domínios de envio |
| Server API token | Chave de API Sending Only, que pode ser restrita a um domínio |
| Account API token | Chave de API Full Access |
| Transactional message stream | A API de e-mail e o SMTP relay |
| Broadcast message stream | Campanhas para listas de contatos, ou a API com o seu próprio cabeçalho List-Unsubscribe |
| Inbound message stream | Recebimento de e-mails em um subdomínio como inbound.acme.com |
| Sender signatures e domínios | Domínios de envio. Sender signatures de um único endereço não estão disponíveis. |
| Templates e layouts | Templates com alias e versões. Não há layouts. |
| Webhooks por stream | Webhooks por workspace |
| Suppressions por stream | Uma lista de supressão por workspace |
| Activity | Email APIEmails e Email APILogs |
Tag e Metadata |
meta |
Para manter separadas a reputação transacional e a de marketing, envie de domínios ou subdomínios diferentes, como mail.acme.com para recibos e news.acme.com para newsletters.
Atualizar as chamadas à API
O POST /email do Postmark com um X-Postmark-Server-Token passa a ser POST /v2/emails com um bearer token. Os nomes dos campos mudam de PascalCase para snake_case:
curl https://api.postmarkapp.com/email \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "X-Postmark-Server-Token: $POSTMARK_SERVER_TOKEN" \
-d '{
"From": "Acme <hello@acme.com>",
"To": "ada@example.com",
"Subject": "Your receipt",
"TextBody": "Thanks for your order.",
"HtmlBody": "<p>Thanks for your order.</p>",
"MessageStream": "outbound"
}'curl https://api.emailit.com/v2/emails \
-H "Authorization: Bearer $EMAILIT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"from": "Acme <hello@acme.com>",
"to": "ada@example.com",
"subject": "Your receipt",
"text": "Thanks for your order.",
"html": "<p>Thanks for your order.</p>"
}'| Postmark | Emailit |
|---|---|
Cabeçalho X-Postmark-Server-Token |
Authorization: Bearer secret_… |
From |
from |
To, Cc, Bcc (strings separadas por vírgula) |
to, cc, bcc como string ou array de até 50 cada |
ReplyTo |
reply_to |
Subject |
subject |
HtmlBody, TextBody |
html, text |
Headers: [{ "Name": "…", "Value": "…" }] |
headers: { "Name": "Value" } |
Metadata, Tag |
meta, devolvido nos eventos de webhook |
TrackOpens, TrackLinks |
tracking: { "loads": true, "clicks": true } |
Attachments[] com Name, Content, ContentType, ContentID |
attachments[] com filename, content, content_type, content_id |
MessageStream |
Não é necessário |
POST /email/withTemplate com TemplateAlias ou TemplateId e TemplateModel |
O mesmo POST /v2/emails com template (um alias ou ID) e variables |
Resposta com MessageID e ErrorCode: 0 |
200 com id (em_…), status: "accepted" e ids por destinatário. Os erros usam códigos de status HTTP. |
O Emailit não tem endpoint de lote. Envie uma requisição por mensagem, cada uma com até 50 destinatários, e adicione um cabeçalho Idempotency-Key para que as novas tentativas sejam seguras. Consulte Enviar um e-mail.
Mudar as configurações SMTP
| Configuração | Postmark | Emailit |
|---|---|---|
| Host | smtp.postmarkapp.com |
smtp.emailit.com |
| Porta | 587, 2525 ou 25 |
587 (STARTTLS), 465 (TLS), 2525, 2587 ou 25 |
| Usuário | O seu server API token | emailit |
| Senha | O seu server API token | A sua chave de API do Emailit |
O Emailit não lê cabeçalhos X-PM-*, como X-PM-Message-Stream ou X-PM-Tag. Remova-os e configure o rastreamento no domínio. Consulte Configurações SMTP.
Correspondência dos eventos de webhook
| Webhook do Postmark | Evento do Emailit |
|---|---|
| Delivery | email.delivered |
| Bounce, tipos de hard bounce | email.bounced |
| Bounce, tipos soft ou transient | email.attempted enquanto o Emailit faz novas tentativas, e depois email.bounced se todas as novas tentativas falharem |
| Spam complaint | email.complained |
| Open | email.loaded |
| Click | email.clicked |
| Subscription change | email.unsubscribed para e-mails de campanha, e suppression.created ou suppression.deleted para as supressões que você adiciona ou remove pela API |
| Inbound | email.received; depois, busque o conteúdo com GET /emails/{id} |
O Emailit também envia email.accepted quando a API aceita um e-mail, algo para o qual o Postmark não tem webhook.
O formato da requisição muda:
- O Postmark envia um registro por requisição e o identifica em
RecordType. O Emailit envia um array JSON de até 100 eventos, com o nome emtypee o e-mail emdata.object. - Use
data.object.id, o IDem_da resposta do envio, em vez deMessageID. Os seus valores demetaficam emdata.object.meta. - Os webhooks do Postmark costumam ser protegidos com credenciais de autenticação básica na URL. O Emailit, em vez disso, assina cada requisição: verifique
X-Emailit-SignaturecomX-Emailit-Timestampe o seu segredowhsec_. Consulte Assinatura das requisições.
for (const event of req.body) {
const email = event.data.object;
if (event.type === 'email.bounced') markBounced(email.to, email.id);
if (event.type === 'email.complained') unsubscribe(email.to);
}Migrar as supressões
-
Exporte as supressões de cada message stream do Postmark de onde você envia, pela página de supressões do stream ou pela API de dump de supressões. Inclua hard bounces, reclamações de spam e supressões manuais.
-
Monte um único CSV com as colunas
email,type,reason:email,type,reason old-address@example.com,recipient,postmark hard bounce angry@example.com,recipient,postmark spam complaintUse o tipo
recipientpara endereços que nunca devem receber e-mails. Ele bloqueia envios pela API, por SMTP e de campanhas. Para pessoas que só cancelaram o recebimento dos seus broadcasts, use o tipounsubscribe, que bloqueia campanhas, mas ainda deixa passar os e-mails transacionais. -
Em Email APISuppressions, selecione Import e envie o arquivo. Cada arquivo pode ter até 10.000 linhas e no máximo 8 MB. Os duplicados são ignorados.
Consulte Gerenciar supressões.
Migrar os templates
Copie o HTML de cada template do Postmark, incluindo o layout dele, e depois importe-o em Email MarketingTemplates ou crie-o com a API de templates. O Emailit não tem layouts, então junte o layout e o conteúdo em um único template. Use o mesmo alias que você usava no Postmark para que as mudanças no seu código sejam pequenas.
Os templates do Postmark usam Mustachio. O Temple cobre valores simples e condições:
| Postmark (Mustachio) | Emailit (Temple) |
|---|---|
{{name}} |
{{name}} |
{{company.name}} |
{{company.name}} |
Seções {{#company}}…{{/company}} |
{{#if company}}…{{/if}}, com caminhos completos como {{company.name}} dentro |
Seções invertidas {{^name}}…{{/name}} |
{{#if name}}{{else}}…{{/if}} |
{{#each items}}…{{/each}} |
Não suportado. Renderize a lista no seu código e passe-a como uma única variável. |
TemplateModel |
variables |
O Temple nunca escapa HTML, então escape o que vier dos usuários antes de passar. Um valor ausente é renderizado como string vazia, a menos que você adicione um valor padrão, como {{name|"there"}}. Consulte Temple.
Alterar o DNS
Adicione o seu domínio em Email APIDomains e publique os registros do Emailit. Eles usam nomes próprios (emailit._domainkey, emailit.<domain> e, opcionalmente, go e inbound), então não entram em conflito com o registro DKIM do Postmark nem com o CNAME de return path pm-bounces dele. Mantenha o seu registro DMARC. Depois da virada, remova os registros do Postmark. Consulte Registros DNS.
Se você processa e-mails recebidos com o Postmark, mude para um subdomínio de recebimento do Emailit e atualize os endereços que a sua aplicação divulga. Consulte Configurar o recebimento de e-mails.
Próximos passos
- Checklist para entrar em produção
- Configurar webhooks
- Migração prioritária: deixe os engenheiros do Emailit fazerem a migração com você