Guia
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 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 |
| Verified identities: domínios e endereços de e-mail | Domínios de envio. 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. 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: e-mails por segundo e por dia, renovados à meia-noite UTC |
| Credenciais do IAM e assinatura SigV4 | Chaves de API 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 que enviam JSON assinado para o seu endpoint HTTPS |
| Account-level suppression list | Lista de supressão do workspace |
| Email templates | Templates com alias e versões |
| Receipt rules | Recebimento de e-mails com o webhook email.received |
| Email tags | meta |
| Dedicated IPs | IPs dedicados sob solicitação |
| Contact lists | Contatos, listas de contatos e campanhas |
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 para a sua linguagem. Em Node.js:
import { SESv2Client, SendEmailCommand } from '@aws-sdk/client-sesv2';
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>' },
},
},
},
}));import { Emailit } from '@emailit/node';
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 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.
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.
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} |
O payload também muda:
- Cada requisição do Emailit é um array JSON de até 100 eventos, com o nome em
typee o e-mail emdata.object. - Use
data.object.id, o IDem_da resposta do envio, em vez domessageIddo SES. Os seus valores demetaficam emdata.object.meta. - Em vez de conferir as assinaturas das mensagens do SNS, 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 a account-level suppression list do SES com a AWS CLI. Se a saída incluir um
NextToken, repita o comando com--next-tokenaté ter todas as páginas.aws sesv2 list-suppressed-destinations --output json \ | jq -r '(["email","type","reason"] | @csv), (.SuppressedDestinationSummaries[] | [.EmailAddress, "recipient", ("ses " + .Reason)] | @csv)' \ > suppressions.csvIsso grava um CSV com as colunas
email,type,reason. Todas as linhas usam o tiporecipient, que bloqueia envios pela API, por SMTP e de campanhas para o endereço. -
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.
-
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
Obtenha cada template com aws sesv2 get-email-template --template-name <name> e depois importe o HTML dele em Email MarketingTemplates ou crie-o com a API de templates. 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.
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 os CNAMEs do Easy DKIM do SES nem com um subdomínio de custom MAIL FROM. Mantenha o seu registro DMARC. Consulte Registros DNS.
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 do Emailit.
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ê