# 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](/pt/docs/migrate/) para conhecer a ordem geral e saber como usar os dois provedores em paralelo.

## Conceitos

| Postmark | Emailit |
| --- | --- |
| Account | Conta |
| Server | [Workspace](/pt/docs/workspaces/), ou um workspace com vários domínios de envio |
| Server API token | [Chave de API](/pt/docs/developers/api-keys/) **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](/pt/docs/email-api/) e o [SMTP relay](/pt/docs/smtp/) |
| Broadcast message stream | [Campanhas](/pt/docs/campaigns/) para [listas de contatos](/pt/docs/audiences/), ou a API com o seu próprio cabeçalho `List-Unsubscribe` |
| Inbound message stream | [Recebimento de e-mails](/pt/docs/inbound/) em um subdomínio como `inbound.acme.com` |
| Sender signatures e domínios | [Domínios de envio](/pt/docs/domains/). Sender signatures de um único endereço não estão disponíveis. |
| Templates e layouts | [Templates](/pt/docs/templates/) com alias e versões. Não há layouts. |
| Webhooks por stream | [Webhooks](/pt/docs/webhooks/) por workspace |
| Suppressions por stream | Uma [lista de supressão](/pt/docs/suppressions/) por workspace |
| Activity | **Email API → Emails** e **Email API → Logs** |
| `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:

```bash title="Antes: Postmark"
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"
  }'
```

```bash title="Depois: Emailit"
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](/pt/docs/email-api/send-email/).

## 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](/pt/docs/smtp/settings/).

## 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}`](/pt/docs/api-reference/emails/get/) |

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 em `type` e o e-mail em `data.object`.
- Use `data.object.id`, o ID `em_` da resposta do envio, em vez de `MessageID`. Os seus valores de `meta` ficam em `data.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-Signature` com `X-Emailit-Timestamp` e o seu segredo `whsec_`. Consulte [Assinatura das requisições](/pt/docs/webhooks/request-signature/).

```javascript
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

1. 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.

2. Monte um único CSV com as colunas `email,type,reason`:

```csv
email,type,reason
old-address@example.com,recipient,postmark hard bounce
angry@example.com,recipient,postmark spam complaint
```

   Use o tipo `recipient` para 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 tipo `unsubscribe`, que bloqueia campanhas, mas ainda deixa passar os e-mails transacionais.

3. Em **Email API → Suppressions**, 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](/pt/docs/suppressions/manage/).

## Migrar os templates

Copie o HTML de cada template do Postmark, incluindo o layout dele, e depois importe-o em **Email Marketing → Templates** ou crie-o com a [API de templates](/pt/docs/api-reference/templates/create/). 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](/pt/docs/templates/temple/).

## Alterar o DNS

Adicione o seu domínio em **Email API → Domains** 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](/pt/docs/domains/dns-records/).

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](/pt/docs/inbound/set-up/).

## Próximos passos

- [Checklist para entrar em produção](/pt/docs/get-started/go-live/)
- [Configurar webhooks](/pt/docs/webhooks/set-up/)
- [Migração prioritária](/pt/docs/programs/priority-migration/): deixe os engenheiros do Emailit fazerem a migração com você

---
Fonte: https://emailit.com/pt/docs/migrate/postmark/
