# Migrar do SendGrid

> Migre do SendGrid para o Emailit. Faça a correspondência de conceitos, campos da API, configurações SMTP e nomes do Event Webhook e depois traga as supressões, os dynamic templates e o DNS.

Este guia mostra a correspondência entre os conceitos, as chamadas à API, os webhooks, as supressões e os templates do SendGrid 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

| SendGrid | Emailit |
| --- | --- |
| Conta e subusers | Conta e [workspaces](/pt/docs/workspaces/). Cada workspace tem os seus próprios domínios, chaves, membros e créditos. |
| Chave de API com permissões | [Chave de API](/pt/docs/developers/api-keys/): **Full Access**, ou **Sending Only**, que pode ser restrita a um domínio |
| Domain authentication | [Domínio de envio](/pt/docs/domains/) com registros SPF, DKIM e de return path |
| Link branding | [Subdomínio de rastreamento](/pt/docs/tracking/), um CNAME como `go.acme.com` |
| Single sender verification | Não disponível. Todo endereço From deve estar em um domínio verificado. |
| Dynamic templates | [Templates](/pt/docs/templates/) com alias e versões, renderizados com o [Temple](/pt/docs/templates/temple/) |
| Event Webhook | [Webhooks](/pt/docs/webhooks/) |
| Inbound Parse | [Recebimento de e-mails](/pt/docs/inbound/) |
| Suppressions | [Supressões](/pt/docs/suppressions/) |
| Unsubscribe groups | Não disponível. Use [listas de contatos](/pt/docs/audiences/) e os links de descadastro das campanhas. |
| Marketing contacts e listas | [Contatos](/pt/docs/contacts/) e [listas de contatos](/pt/docs/audiences/) |
| Single Sends | [Campanhas](/pt/docs/campaigns/) |
| Email Activity | **Email API → Emails** e **Email API → Logs** |
| Categories e custom args | `meta` |
| IPs dedicados e IP pools | [IPs dedicados](/pt/docs/deliverability/dedicated-ips/) sob solicitação |
| Email address validation | [Verificação de e-mails](/pt/docs/email-verification/) |

## Atualizar as chamadas à API

O `POST /v3/mail/send` do SendGrid passa a ser `POST /v2/emails`. A requisição é mais simples: não há `personalizations`, e os endereços são strings simples.

```bash title="Antes: SendGrid"
curl https://api.sendgrid.com/v3/mail/send \
  -H "Authorization: Bearer $SENDGRID_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "personalizations": [{ "to": [{ "email": "ada@example.com" }] }],
    "from": { "email": "hello@acme.com", "name": "Acme" },
    "subject": "Your receipt",
    "content": [
      { "type": "text/plain", "value": "Thanks for your order." },
      { "type": "text/html", "value": "<p>Thanks for your order.</p>" }
    ]
  }'
```

```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>"
  }'
```

| SendGrid | Emailit |
| --- | --- |
| `Authorization: Bearer SG.…` | `Authorization: Bearer secret_…` |
| `from: { email, name }` | `from: "Name "` |
| `personalizations[].to[]` | `to`, uma string ou um array de até 50 endereços |
| `personalizations[].cc[]`, `bcc[]` | `cc`, `bcc` |
| `reply_to: { email }` | `reply_to` |
| `subject` | `subject` |
| `content[]` com `text/plain` e `text/html` | `text` e `html` |
| `template_id` | `template`, um ID ou alias de template |
| `personalizations[].dynamic_template_data` | `variables` |
| `attachments[]` com `content`, `filename`, `type`, `content_id` | `attachments[]` com `content`, `filename`, `content_type`, `content_id`, ou uma `url` no lugar de `content` |
| `headers` | `headers` |
| `custom_args`, `categories` | `meta`, um objeto com valores em string devolvido nos eventos de webhook |
| `send_at` (horário Unix) | `scheduled_at`, que aceita o mesmo horário Unix, ISO 8601 ou inglês simples |
| `tracking_settings.open_tracking` e `click_tracking` | `tracking: { "loads": true, "clicks": true }` |
| `asm` (unsubscribe groups) | Não disponível |
| `202 Accepted` com um cabeçalho `X-Message-Id` | `200` com um corpo JSON: `id`, `status: "accepted"` e `ids`, com um ID por destinatário |

Cada destinatário de uma requisição do Emailit vira um e-mail próprio, com o seu próprio ID. Para enviar variáveis diferentes para pessoas diferentes, o que o SendGrid faz com várias `personalizations`, envie uma requisição por destinatário. 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 | SendGrid | Emailit |
| --- | --- | --- |
| Host | `smtp.sendgrid.net` | `smtp.emailit.com` |
| Porta | `587`, `465`, `2525` ou `25` | `587` (STARTTLS), `465` (TLS), `2525`, `2587` ou `25` |
| Usuário | `apikey` | `emailit` |
| Senha | A sua chave de API do SendGrid | A sua chave de API do Emailit |

O Emailit não lê o cabeçalho `X-SMTPAPI`. Remova-o e configure o rastreamento no domínio. Consulte [Configurações SMTP](/pt/docs/smtp/settings/).

## Correspondência dos eventos de webhook

| Evento do SendGrid | Evento do Emailit |
| --- | --- |
| `processed` | `email.accepted` (somente API) |
| `deferred` | `email.attempted` |
| `delivered` | `email.delivered` |
| `bounce` | `email.bounced` |
| `dropped` | `email.suppressed`, quando o destinatário está na lista de supressão |
| `open` | `email.loaded` |
| `click` | `email.clicked` |
| `spamreport` | `email.complained` |
| `unsubscribe`, `group_unsubscribe` | `email.unsubscribed`, somente para e-mails de campanha |
| POST do Inbound Parse | `email.received`; depois, busque o conteúdo com [`GET /emails/{id}`](/pt/docs/api-reference/emails/get/) |

Assim como o SendGrid, o Emailit envia um array JSON de eventos. Os campos são diferentes:

- O nome do evento fica em `type`, e o e-mail fica em `data.object`. Use `data.object.id` (o ID `em_` da resposta do envio) em vez de `sg_message_id`, e `data.object.to` em vez de `email`.
- Os seus valores de `meta` voltam em `data.object.meta`.
- O Emailit assina as requisições com HMAC-SHA256, em vez da chave pública ECDSA do SendGrid. Verifique `X-Emailit-Signature` com 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. No SendGrid, exporte **Bounces**, **Spam Reports**, **Invalid Emails** e **Global Unsubscribes**, pelas páginas de supressão ou pelos endpoints de API `/v3/suppression/*`. Os bloqueios (Blocks) costumam ser temporários, então você pode deixá-los de fora.

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

```csv
email,type,reason
old-address@example.com,recipient,sendgrid bounce
angry@example.com,recipient,sendgrid spam report
```

   Use o tipo `recipient` para endereços que nunca devem receber e-mails. Ele bloqueia envios pela API, por SMTP e de campanhas. Os tipos `bounce`, `complaint` e `unsubscribe` só bloqueiam campanhas.

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, então divida as listas maiores. Os duplicados são ignorados.

Para quem se descadastrou de grupos de e-mail de marketing, importe essas pessoas como contatos marcados como **unsubscribed**, em vez de suprimi-las de todos os e-mails. Consulte [Gerenciar supressões](/pt/docs/suppressions/manage/).

## Migrar os templates

Exporte o HTML de cada dynamic template do SendGrid e depois importe-o em **Email Marketing → Templates** ou crie-o com a [API de templates](/pt/docs/api-reference/templates/create/). Dê a cada template um alias, como `receipt`, e envie-o com `"template": "receipt"`.

Os dois usam chaves duplas, mas o Temple é menor que o Handlebars:

| SendGrid (Handlebars) | Emailit (Temple) |
| --- | --- |
| `{{first_name}}` | `{{first_name}}` |
| `{{{html_block}}}` | `{{html_block}}`. O Temple nunca escapa HTML, então escape você mesmo o que vier dos usuários. |
| `{{insert name "default=there"}}` | `{{name\|"there"}}` |
| `{{#if plan}}…{{else}}…{{/if}}` | Igual |
| `{{#each items}}…{{/each}}` | Não suportado. Renderize a lista no seu código e passe-a como uma única variável. |
| `{{#equals plan "pro"}}…{{/equals}}` | Não suportado. Passe um booleano como `is_pro` e use `{{#if is_pro}}`. |

Consulte [Temple](/pt/docs/templates/temple/) e [Importar e exportar templates](/pt/docs/templates/import-export/).

## 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 os CNAMEs de domain authentication ou de link branding do SendGrid. Mantenha o seu registro DMARC. Depois da virada, remova os CNAMEs do SendGrid. Consulte [Registros DNS](/pt/docs/domains/dns-records/).

Se você usava o Inbound Parse, aponte o registro MX do hostname de parse para o Emailit. Para manter o mesmo hostname, como `parse.acme.com`, defina o `inbound_key` do domínio como `parse` pela API. 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/sendgrid/
