# Migrar do Amazon SES

> Migre do Amazon SES para o Emailit. Faça a correspondência de identities, sandbox e cotas, substitua as chamadas ao SDK e as credenciais SMTP e transforme os eventos do SNS em webhooks assinados.

Este guia mostra a correspondência entre os conceitos, as chamadas à API, as notificações de eventos, as supressões e os templates do Amazon SES 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

| Amazon SES | Emailit |
| --- | --- |
| Conta da AWS em uma região | [Workspace](/pt/docs/workspaces/) |
| Verified identities: domínios e endereços de e-mail | [Domínios de envio](/pt/docs/domains/). Identities de um único endereço de e-mail não estão disponíveis. |
| Registros CNAME do Easy DKIM | Um registro DKIM TXT, `emailit._domainkey` |
| Custom MAIL FROM domain | O return path `emailit.<your domain>`, que todo domínio tem |
| Sandbox e solicitação de acesso de produção | [Modo sandbox e acesso de produção](/pt/docs/workspaces/production-access/). No modo sandbox, você pode enviar para os e-mails das contas dos membros do workspace. |
| Sending quota e maximum send rate | [Limites de envio](/pt/docs/limits/): e-mails por segundo e por dia, renovados à meia-noite UTC |
| Credenciais do IAM e assinatura SigV4 | [Chaves de API](/pt/docs/developers/api-keys/) em um cabeçalho `Authorization: Bearer` |
| Credenciais SMTP | A sua chave de API, usada como senha do SMTP |
| Configuration sets e event destinations (SNS, EventBridge, Firehose) | [Webhooks](/pt/docs/webhooks/) que enviam JSON assinado para o seu endpoint HTTPS |
| Account-level suppression list | [Lista de supressão](/pt/docs/suppressions/) do workspace |
| Email templates | [Templates](/pt/docs/templates/) com alias e versões |
| Receipt rules | [Recebimento de e-mails](/pt/docs/inbound/) com o webhook `email.received` |
| Email tags | `meta` |
| Dedicated IPs | [IPs dedicados](/pt/docs/deliverability/dedicated-ips/) sob solicitação |
| Contact lists | [Contatos](/pt/docs/contacts/), [listas de contatos](/pt/docs/audiences/) e [campanhas](/pt/docs/campaigns/) |

## Atualizar as chamadas à API

As chamadas ao SES são assinadas com as suas credenciais da AWS, então normalmente você as faz por um SDK da AWS. Com o Emailit, você envia uma requisição JSON com uma chave de API ou usa o [SDK do Emailit](/pt/docs/sdks/) para a sua linguagem. Em Node.js:

```javascript title="Antes: Amazon SES (AWS SDK v3)"

const ses = new SESv2Client({ region: 'eu-west-1' });

await ses.send(new SendEmailCommand({
  FromEmailAddress: 'Acme <hello@acme.com>',
  Destination: { ToAddresses: ['ada@example.com'] },
  Content: {
    Simple: {
      Subject: { Data: 'Your receipt' },
      Body: {
        Text: { Data: 'Thanks for your order.' },
        Html: { Data: '<p>Thanks for your order.</p>' },
      },
    },
  },
}));
```

```javascript title="Depois: Emailit"

const emailit = new Emailit(process.env.EMAILIT_API_KEY);

await emailit.emails.send({
  from: 'Acme <hello@acme.com>',
  to: 'ada@example.com',
  subject: 'Your receipt',
  text: 'Thanks for your order.',
  html: '<p>Thanks for your order.</p>',
});
```

| Amazon SES (API v2 `SendEmail`) | Emailit (`POST /v2/emails`) |
| --- | --- |
| Credenciais da AWS e assinatura SigV4 | `Authorization: Bearer secret_…` |
| `FromEmailAddress` | `from` |
| `Destination.ToAddresses`, `CcAddresses`, `BccAddresses` | `to`, `cc`, `bcc`, até 50 cada |
| `ReplyToAddresses` | `reply_to` |
| `Content.Simple.Subject.Data` | `subject` |
| `Content.Simple.Body.Html.Data`, `Text.Data` | `html`, `text` |
| `Content.Template.TemplateName` | `template`, um alias ou ID |
| `Content.Template.TemplateData` (uma string JSON) | `variables` (um objeto JSON) |
| `Content.Raw` (uma mensagem MIME completa) | Envie a mensagem MIME pelo [SMTP relay](/pt/docs/smtp/) ou recrie-a com `html`, `text` e `attachments` |
| `EmailTags` | `meta`, devolvido nos eventos de webhook |
| `ConfigurationSetName` | Não é necessário. Os eventos vão para os seus webhooks, e o rastreamento é definido por domínio ou por e-mail com `tracking`. |
| Resposta `MessageId` | `200` com `id` (`em_…`), `message_id`, `status: "accepted"` e `ids` por destinatário |

O Emailit também oferece agendamento com `scheduled_at` e novas tentativas seguras com um cabeçalho `Idempotency-Key`, o que o SES não oferece no envio. Consulte [Enviar um e-mail](/pt/docs/email-api/send-email/).

## Mudar as configurações SMTP

| Configuração | Amazon SES | Emailit |
| --- | --- | --- |
| Host | `email-smtp.<region>.amazonaws.com` | `smtp.emailit.com` |
| Porta | `587`, `2587` ou `25` (STARTTLS), `465` ou `2465` (TLS) | `587`, `2587`, `2525` ou `25` (STARTTLS), `465` (TLS) |
| Usuário | O seu nome de usuário SMTP do SES | `emailit` |
| Senha | A sua senha SMTP do SES | A sua chave de API do Emailit |

O Emailit não lê cabeçalhos do SES como `X-SES-CONFIGURATION-SET`. Remova-os. Consulte [Configurações SMTP](/pt/docs/smtp/settings/).

## Correspondência das notificações de eventos

O SES publica os eventos por meio de configuration sets no SNS, no EventBridge ou no Firehose. O Emailit os envia diretamente para o seu endpoint HTTPS como webhooks, então não há tópico para assinar nem confirmar.

| Tipo de evento do SES | Evento do Emailit |
| --- | --- |
| `Send` | `email.accepted` (somente API) |
| `Delivery` | `email.delivered` |
| `DeliveryDelay` | `email.attempted` |
| `Bounce` com `bounceType` `Permanent` | `email.bounced` |
| `Bounce` com `bounceType` `Transient` | `email.attempted` enquanto o Emailit faz novas tentativas, e depois `email.bounced` se todas as novas tentativas falharem |
| `Complaint` | `email.complained` |
| `Open` | `email.loaded` |
| `Click` | `email.clicked` |
| `Subscription` | `email.unsubscribed`, somente para e-mails de campanha |
| `Reject`, `Rendering Failure` | Sem equivalente direto. Erros na requisição, como um template inexistente, são retornados pela API na hora, e as mensagens que o Emailit não vai entregar recebem o status `held`. |
| Receipt rule com uma ação do SNS ou do Lambda | `email.received`; depois, busque o conteúdo com [`GET /emails/{id}`](/pt/docs/api-reference/emails/get/) |

O payload também muda:

- Cada requisição do Emailit é 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 do `messageId` do SES. Os seus valores de `meta` ficam em `data.object.meta`.
- Em vez de conferir as assinaturas das mensagens do SNS, 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 a account-level suppression list do SES com a AWS CLI. Se a saída incluir um `NextToken`, repita o comando com `--next-token` até ter todas as páginas.

```bash
aws sesv2 list-suppressed-destinations --output json \
  | jq -r '(["email","type","reason"] | @csv),
           (.SuppressedDestinationSummaries[] | [.EmailAddress, "recipient", ("ses " + .Reason)] | @csv)' \
  > suppressions.csv
```

   Isso grava um CSV com as colunas `email,type,reason`. Todas as linhas usam o tipo `recipient`, que bloqueia envios pela API, por SMTP e de campanhas para o endereço.

2. Se você mantém a sua própria lista de bounces e reclamações vindos das notificações do SNS, adicione esses endereços também.

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

Obtenha cada template com `aws sesv2 get-email-template --template-name <name>` e depois importe o HTML dele em **Email Marketing → Templates** ou crie-o com a [API de templates](/pt/docs/api-reference/templates/create/). Use o nome do template no SES como alias no Emailit, se ele se encaixar no formato de alias: letras minúsculas, números, `-` e `_`.

Os templates do SES usam tags no estilo Handlebars. O Temple cobre as partes mais comuns:

| Amazon SES | Emailit (Temple) |
| --- | --- |
| `{{name}}`, `{{user.name}}` | Igual |
| `{{#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. |
| `TemplateData` como string JSON | `variables` como objeto JSON |
| Sem valor padrão embutido | `{{name\|"there"}}` adiciona um valor alternativo |

O Temple nunca escapa HTML, então escape o que vier dos usuários antes de passar. 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 os CNAMEs do Easy DKIM do SES nem com um subdomínio de custom MAIL FROM. Mantenha o seu registro DMARC. Consulte [Registros DNS](/pt/docs/domains/dns-records/).

Depois da virada, remova os CNAMEs de DKIM do SES e os registros do custom MAIL FROM e exclua as identities no SES. Se você recebe e-mails com receipt rules do SES, mude antes para um [subdomínio de recebimento](/pt/docs/inbound/set-up/) do Emailit.

## 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/amazon-ses/
