Guia
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 para conhecer a ordem geral e saber como usar os dois provedores em paralelo.
Conceitos
| SendGrid | Emailit |
|---|---|
| Conta e subusers | Conta e workspaces. Cada workspace tem os seus próprios domínios, chaves, membros e créditos. |
| Chave de API com permissões | Chave de API: Full Access, ou Sending Only, que pode ser restrita a um domínio |
| Domain authentication | Domínio de envio com registros SPF, DKIM e de return path |
| Link branding | Subdomínio de rastreamento, 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 com alias e versões, renderizados com o Temple |
| Event Webhook | Webhooks |
| Inbound Parse | Recebimento de e-mails |
| Suppressions | Supressões |
| Unsubscribe groups | Não disponível. Use listas de contatos e os links de descadastro das campanhas. |
| Marketing contacts e listas | Contatos e listas de contatos |
| Single Sends | Campanhas |
| Email Activity | Email APIEmails e Email APILogs |
| Categories e custom args | meta |
| IPs dedicados e IP pools | IPs dedicados sob solicitação |
| Email address validation | Verificação de e-mails |
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.
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>" }
]
}'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 <email>" |
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.
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.
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} |
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 emdata.object. Usedata.object.id(o IDem_da resposta do envio) em vez desg_message_id, edata.object.toem vez deemail. - Os seus valores de
metavoltam emdata.object.meta. - O Emailit assina as requisições com HMAC-SHA256, em vez da chave pública ECDSA do SendGrid. Verifique
X-Emailit-Signaturecom 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
-
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. -
Monte um único CSV com as colunas
email,type,reason:email,type,reason old-address@example.com,recipient,sendgrid bounce angry@example.com,recipient,sendgrid spam reportUse o tipo
recipientpara endereços que nunca devem receber e-mails. Ele bloqueia envios pela API, por SMTP e de campanhas. Os tiposbounce,complainteunsubscribesó bloqueiam campanhas. -
Em Email APISuppressions, 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.
Migrar os templates
Exporte o HTML de cada dynamic template do SendGrid e depois importe-o em Email MarketingTemplates ou crie-o com a API de templates. 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 e Importar e exportar templates.
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 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.
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.
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ê