Migration illustration Guia de migração

Migrar do SendGrid para o Mailtrap

Um guia técnico completo para mudar facilmente do SendGrid para o Mailtrap. A maioria das equipas conclui o processo de migração em menos de uma hora.

Checklist de Migração

  1. Autentique o seu domínio
    Adicione e verifique o seu domínio antes de enviar. Siga o artigo de configuração de domínio em docs.mailtrap.io.

Precisa de ajuda?

Contacte o nosso suporte e os nossos programadores vão ajudá-lo.

Precisa de ajuda?
  1. Obtenha o seu token de API
    O Mailtrap gera automaticamente um token quando adiciona um domínio. Encontre-o em “Settings” → “API Tokens”. Leia mais sobre tokens de API.
  2. Atualize a sua integração
    Substitua os endpoints e as credenciais do SendGrid pelos do Mailtrap (API ou SMTP). Veja as secções de migração abaixo.
  3. Migre os templates
    Ambas as plataformas usam Handlebars, pelo que o conteúdo é migrado diretamente. Veja as secções de templates abaixo.
  4. Migre as supressões
    Exporte as supressões do SendGrid e importe-as para o Mailtrap via CSV ou manualmente. Clique aqui para mais informações.
  5. Migre os utilizadores
    Adicione utilizadores a partir da aba “User Management” e reveja as permissões durante a migração.
  6. Configure os webhooks
    Siga o guia passo a passo de webhooks do Mailtrap.
  7. Segurança e conformidade
    Visite a página do Trust Center para rever as práticas de segurança e os padrões de conformidade do Mailtrap.

Dica do Mailtrap

Pode usar o gem Ruby do ActionMailer Balancer para distribuir proporcionalmente a carga de envio de emails entre os dois serviços de envio (ex.: 70% SendGrid e 30% Mailtrap) e mitigar os riscos de envio.

Dica do Mailtrap

Conceitos

Antes de analisar os detalhes técnicos, é importante esclarecer alguns conceitos-chave.

Domínios de envio

No Mailtrap: Sending Domains

Equivalente no SendGrid: Domain Authentication

Antes de poder enviar emails com o Mailtrap, precisa de adicionar e verificar o seu domínio de envio. Para a verificação do domínio, o Mailtrap fornece registos DNS que seguem os mesmos padrões em que o SendGrid se baseia.

Os registos DKIM podem ser adicionados em conjunto com os do SendGrid (seletores diferentes, sem conflito), e um registo DMARC cobre ambos. Para o SPF, no entanto, deve intercalar o include do Mailtrap no seu registo SPF existente, em vez de adicionar um registo separado.

Para saber como verificar o seu domínio, pode ler o nosso guia passo-a-passo na documentação oficial ou ver o vídeo que preparámos para si. Todo o processo demora cerca de 15 minutos.

Fluxos de envio separados

No Mailtrap: Separate Sending Streams

Equivalente no SendGrid: N/A

O Mailtrap fornece duas infraestruturas de email separadas, ou fluxos de envio:

  • Fluxo transacional – Para o envio de emails acionados pelo utilizador, como emails de boas-vindas e redefinições de palavra-passe.
  • Fluxo de envio em massa – Para o envio de emails promocionais e de marketing, como newsletters e atualizações de produtos.

Ao manter as infraestruturas de envio separadas, consegue:

  • Proteger a reputação dos seus emails transacionais do impacto das suas campanhas em massa
  • Garantir que cada fluxo é encaminhado através dos pools de IP corretos
  • Dar aos provedores de email os sinais de que precisam para categorizar e entregar os seus emails corretamente

Categorias de email

No Mailtrap: Email Categories

Equivalente no SendGrid: Categories

Tal como o SendGrid, o Mailtrap oferece uma funcionalidade de Categorias de Email que lhe permite acompanhar o desempenho de diferentes tipos de emails (ex: emails de boas-vindas, redefinições de palavra-passe, etc.).

  • Utilizar as Email Categories com o Mailtrap: insira um nome de categoria no cabeçalho X-MT-Category se estiver a usar SMTP. Ou passe o nome da categoria no campo category se estiver a enviar via API.
  • Utilizar as Categories com o SendGrid: Passe as categorias dentro do cabeçalho JSON X-SMTPAPI se estiver a usar SMTP. Ou passe uma série de strings no campo categories se estiver a enviar via API. O SendGrid suporta até 10 categorias por email.

Organização e subcontas

No Mailtrap: Organization & Sub-accounts

Equivalente no SendGrid: Subusers

O Mailtrap oferece a funcionalidade Organization & Sub-accounts, que lhe permite gerir configurações complexas envolvendo múltiplas equipas, clientes, ambientes ou produtos sob uma única Organização. Para começar a usar a funcionalidade, precisa primeiro de a ativar na aba “Organization”.

Nota: a funcionalidade está disponível a partir do plano Business.

Comparação de terminologia

Migração da API

Autenticação

Ambas as plataformas usam autenticação por token Bearer no cabeçalho Authorization – o mesmo padrão, chave diferente.

SendGridMailtrap
MétodoAPI key (token Bearer)API token (token Bearer)
CabeçalhoAuthorization: Bearer YOUR_SENDGRID_API_KEYAuthorization: Bearer YOUR_MAILTRAP_API_KEY
Gestão de chaves“Settings” → “API Keys” (acesso total, restrito, faturação)“Settings” → “API Tokens” (gerado automaticamente por domínio, permissões editáveis)

Não é necessária nenhuma alteração de código além da substituição do valor da chave. O formato do cabeçalho é idêntico.

Mapeamento da API

Tipo de APISendGridMailtrapNotas
Email transacionalPOST https://api.sendgrid.com/v3/mail/sendPOST https://send.api.mailtrap.io/api/sendO SendGrid envolve os destinatários em personalizations[]; o Mailtrap usa JSON simples
Envio em massaO mesmo endpoint (/v3/mail/send) com agrupamento em personalizations[]POST https://bulk.api.mailtrap.io/api/sendO Mailtrap isola o envio em massa num host separado para proteger a reputação transacional
Envio de templatesO mesmo endpoint com template_id + dynamic_template_dataO mesmo endpoint de envio com template_uuid + template_variablesOs IDs de templates dinâmicos do SendGrid começam com d-
SupressõesGET/DELETE https://api.sendgrid.com/v3/suppression/* (bounces, blocks, spam_reports, invalid_emails, unsubscribes)https://mailtrap.io/pt/pt/api/accounts/{account_id}/suppressionsO SendGrid divide as supressões por múltiplos endpoints de acordo com o tipo
EstatísticasGET https://api.sendgrid.com/v3/stats (global), /categories/stats, /mailbox_providers/statsGET/api/accounts/{account_id}/stats, /stats/domains, /stats/categories, /stats/email_service_providers, e /stats/dateO SendGrid oferece estatísticas com mais filtros (por categoria, fornecedor de caixa de correio, navegador, etc.)
Registos de emailGET https://api.sendgrid.com/v3/messages (Email Activity Feed)POST /api/1.0/messages/{search,info,content}.jsonO feed de atividade do SendGrid requer um add-on para um histórico alargado

Mapeamento de campos JSON da API de envio

O SendGrid usa POST https://api.sendgrid.com/v3/mail/send; o Mailtrap usa POST https://send.api.mailtrap.io/api/send. Ambos aceitam application/json.

CampoSendGridMailtrap
Endereço do remetentefrom.emailfrom.email
Nome do remetentefrom.namefrom.name
Destinatáriospersonalizations[].to[].emailto[].email
Nome do destinatáriopersonalizations[].to[].nameto[].name
Destinatários em CCpersonalizations[].cc[].emailcc[].email
Nome em CCpersonalizations[].cc[].namecc[].name
Destinatários em BCCpersonalizations[].bcc[].emailbcc[].email
Nome em BCCpersonalizations[].bcc[].namebcc[].name
Assuntosubject (raiz ou personalizations[].subject)subject
Corpo HTMLcontent[].value (onde type = text/html)html
Corpo em texto simplescontent[].value (onde type = text/plain)text
Endereço de resposta (Reply-to)reply_to.emailreply_to.email
Nome de resposta (Reply-to)reply_to.namereply_to.name
Lista de resposta (Reply-to list)reply_to_list[]
Cabeçalhos personalizadosheaders (raiz ou personalizations[].headers)headers
Categoriascategories[] (array, até 10)category (string única)
Metadados personalizadoscustom_args (raiz ou personalizations[].custom_args)custom_variables
ID do templatetemplate_idtemplate_uuid
Dados do templatepersonalizations[].dynamic_template_datatemplate_variables
Substituiçõespersonalizations[].substitutions
Conteúdo do anexoattachments[].content (Base64)attachments[].content (Base64)
Nome do ficheiro do anexoattachments[].filenameattachments[].filename
Tipo MIME do anexoattachments[].typeattachments[].type
Disposição do anexoattachments[].dispositionattachments[].disposition
ID do conteúdo do anexoattachments[].content_idattachments[].content_id
Agendamento do enviosend_at (Unix timestamp)
ID do lote (Batch ID)batch_id
Pool de IPip_pool_name
Rastreio de aberturastracking_settings.open_tracking.enableVia definições de conta ou cabeçalhos
Rastreio de cliquestracking_settings.click_tracking.enableVia definições de conta ou cabeçalhos
Aglomeração de vários destinatáriospersonalizations[] (até 1000 destinatários por pedido)
Fluxo de envioEndpoint único para todos os tipos de emailDeterminado pelo endpoint: send.api.mailtrap.io (transacional) ou bulk.api.mailtrap.io (em massa)
Envio em massaVia personalizations[] num único pedidoPOST /api/batch (até 500 emails)

Trechos de código

  • Mailtrap cURL SDK code snippet cURL
  • Mailtrap PHP SDK code snippet PHP
SendGrid SendGrid
curl --request POST \
  --url https://api.sendgrid.com/v3/mail/send \
  --header 'Authorization: Bearer CHAVE_DA_API_SENDGRID' \
  --header 'Content-Type: application/json' \
  --data '{
  "personalizations": [
    {
      "to": [
        {
          "email": "destinatario@exemplo.com",
          "name": "Jane Doe"
        }
      ]
    }
  ],
  "from": {
    "email": "remetente@oseudominio.com",
    "name": "Your App"
  },
  "subject": "Confirmação de encomenda #1234",
  "content": [
    {
      "type": "text/plain",
      "value": "A sua encomenda foi confirmada."
    },
    {
      "type": "text/html",
      "value": "<h1>Encomenda confirmada</h1><p>A sua encomenda #1234 foi confirmada.</p>"
    }
  ]
}'
Mailtrap Mailtrap

Copiar

curl --request POST \
  --url https://send.api.mailtrap.io/api/send \
  --header 'Authorization: Bearer CHAVE_DA_API_MAILTRAP' \
  --header 'Content-Type: application/json' \
  --data '{
  "from": {
    "email": "remetente@oseudominio.com",
    "name": "A Sua App"
  },
  "to": [
    {
      "email": "destinatario@exemplo.com",
      "name": "Jane Doe"
    }
  ],
  "subject": "Confirmação de encomenda #1234",
  "text": "A sua encomenda foi confirmada.",
  "html": "<h1>Encomenda confirmada</h1><p>A sua encomenda #1234 foi confirmada.</p>"
}'

Nota:

  • Estrutura simples vs. o wrapper personalizations. O SendGrid aninha destinatários, assuntos e dados dinâmicos dentro de uma série personalizations. O Mailtrap mantém as coisas simples: to, cc, bcc, subject e template_variables vivem todos na raiz do corpo do pedido. Para chamadas transacionais de um único email (o caso mais comum), isto elimina o aninhamento e o código repetitivo (“boilerplate”).
  • Campos do corpo: array content[] vs. html/text. O SendGrid envolve o conteúdo do corpo num array chamado content, onde cada elemento declara um type MIME e um value. O Mailtrap usa campos dedicados html e text na raiz. Assim, é mais direto e mais fácil de ler num diff.
  • Autenticação: padrão idêntico. Ambos usam Authorization: Bearer <api_key>. Substitua a chave, atualize o URL do endpoint e ajuste a estrutura do “payload”.
  • A seleção do fluxo de envio é estrutural. O SendGrid encaminha todos os emails através de um único endpoint (/v3/mail/send). O Mailtrap usa endpoints separados – send.api.mailtrap.io para emails transacionais e bulk.api.mailtrap.io para envios em massa – isolando os dois ao nível da infraestrutura.

Migração de SMTP

ConfiguraçãoSendGridMailtrap (transacional)Mailtrap (em massa)
Hostsmtp.sendgrid.netlive.smtp.mailtrap.iobulk.smtp.mailtrap.io
Porta587 (recomendada), 465, 25587 (recomendada), 25, 2525587 (recomendada), 25, 2525
TLSNão necessárioNecessárioNecessário
AutenticaçãoPLAIN, LOGINPLAIN, LOGINPLAIN, LOGIN
Nome de utilizadorstring apikeystring apistring api
Palavra-passeChave de APIToken de APIToken de API

Notas de migração:

  • O Mailtrap usa hosts SMTP separados para fluxos transacionais (live.smtp.mailtrap.io) e em massa (bulk.smtp.mailtrap.io). O SendGrid usa um único host (smtp.sendgrid.net) para todos os envios.
  • O nome de utilizador SMTP é uma string literal em ambos os casos, mas diferem: o Mailtrap usa api e o SendGrid usa apikey. Ambos devem ser inseridos exatamente como demonstrado, ou seja, não substitua api ou apikey com outros dados.

Para mais informações sobre como migrar a sua configuração de SMTP, clique neste link. ⬅️

Limites de tráfego e quotas

LimiteSendGridMailtrap
Limite de tráfego da API (endpoint de envio)~600 pedidos/minuto (API Geral)150 pedidos por 10 segundos por token de API
Tamanho do lote (máx. de emails por chamada)Sem endpoint de lote nativo (1000 destinatários por envio único)500 emails por chamada de lote
Limite de tamanho da mensagem (incluindo anexos)30 MB10 MB por defeito (extensível até 30 MB sob pedido)
Máx. de destinatários por envio único1000 (entre to, cc, bcc)Envio único ( /api/send ) → 1 email, até 1000 destinatários por campo ( to / cc / bcc )
Envio em lote ( /api/batch ) → até 500 emails separados por chamada de API

Templates de email

Tanto o SendGrid como o Mailtrap usam a sintaxe Handlebars para templates dinâmicos. A inserção básica de variáveis ({{variable}}), condicionais ({{#if}}), iteração ({{#each}}) e HTML não escapado ({{{variable}}}) funcionam da mesma forma em ambas as plataformas. O markup do seu template será, na sua maioria, portado diretamente; as diferenças estão nas funções helper, na sintaxe do valor por defeito e na forma como as variáveis são passadas através da API.

Comparação de sintaxe

PadrãoSendGridMailtrap
Inserção de variável{{variable_name}}{{variable_name}}
Acesso aninhado{{user.profile.firstName}}{{user.profile.firstName}}
HTML não escapado{{{variable}}}{{{variable}}}
Valor por defeito/fallback{{insert name "default=Customer"}} (via helper insert){{#if name}}{{name}}{{else}}Customer{{/if}}
Condicionais{{#if condition}}...{{else}}...{{/if}}{{#if condition}}...{{else}}...{{/if}}
Condicional negada{{#unless condition}}...{{/unless}}{{#unless condition}}...{{/unless}}
Verificação de igualdade{{#equals status "active"}}...{{/equals}}
Helpers de comparação{{#greaterThan a b}}, {{#lessThan a b}}, {{#notEquals a b}}
Operadores lógicos{{#and condition1 condition2}}, {{#or condition1 condition2}}
Verificação de comprimento{{#length items}}
Iteração{{#each items}}...{{/each}}{{#each items}}...{{/each}}
Formatação de data{{formatDate timestamp "MMMM DD, YYYY"}} (helper integrado, aceita “epoch” ou ISO 8601, suporta diferenças de fuso horário)Não suportado – formate as datas antes de as passar para o template
Passar variáveis via APIpersonalizations[].dynamic_template_data (objeto JSON)template_variables (objeto JSON)
Identificador de templatetemplate_id (templates dinâmicos com o prefixo d-, ex.: d-abc123)template_uuid
Substituições legacypersonalizations[].substitutions (para templates não dinâmicos)

Notas de migração

  • As variáveis e loops são transferidos diretamente. Ambas as plataformas usam Handlebars padrão – {{var}}, {{#if}}, {{#each}} e {{{unescaped}}} funcionam de forma idêntica. Não são necessárias alterações na formatação, ou markup, do template para estes casos.
  • Os valores por defeito precisam de ser reescritos. O helper insert do SendGrid ({{insert name "default=Customer"}}) é uma extensão específica do SendGrid. No Mailtrap, pode usar um bloco standard de Handlebars {{#if}} / {{else}}, como: {{#if name}}{{name}}{{else}}Customer{{/if}}. É mais longo, mas são Handlebars padrão – sem dependência de fornecedor.
  • A formatação de datas passa para a sua camada de aplicação. O helper {{formatDate timestamp "MM/DD/YYYY"}} do SendGrid formata datas dentro do template. O Mailtrap não suporta um helper de formatação de datas, pelo que deve formatar as datas no seu código antes de as passar como variáveis de template. Se tiver templates com chamadas formatDate, substitua cada uma por uma variável de string pré-formatada (ex.: {{formatted_date}}) e calcule o valor no lado do servidor.
  • Os helpers lógicos e de comparação não estão disponíveis. O SendGrid suporta os helpers greaterThan, lessThan, notEquals, and, or e length para lógica interna do template. O Mailtrap usa Handlebars padrão, que não inclui estes recursos. Mova essa lógica para a sua aplicação: calcule o resultado e passe um boolean ou um valor pré-resolvido como variável de template.
  • A passagem de variáveis é quase idêntica. Ambos usam um objeto JSON – dê um novo nome ao campo dynamic_template_data (dentro de personalizations[]) para template_variables (ao nível da raiz). A estrutura da própria variável permanece a mesma.
  • Os IDs dos templates mudam de formato. Os templates dinâmicos do SendGrid usam uma string com o prefixo d- (ex.: d-abc123def456). O Mailtrap usa template_uuid. Terá de recriar os templates no Mailtrap e atualizar os IDs no seu código.
  • Os templates sobrepõem-se ao assunto e ao conteúdo. No SendGrid, um template dinâmico com uma linha de assunto sobrepõe-se a qualquer subject definido no pedido da API. O Mailtrap comporta-se da mesma forma – se o template incluir um assunto, o campo subject no pedido da API é ignorado.

Question icon

Perguntas Frequentes

  • Preciso de voltar a verificar o meu domínio se já o tiver configurado no SendGrid?

    Sim, terá de voltar a verificar o seu domínio. Veja a Documentação Oficial do Mailtrap para orientações atualizadas.

  • Porque é que o Mailtrap tem dois hosts SMTP separados?

    O Mailtrap separa os fluxos transacionais e em massa para proteger a sua reputação de remetente e garantir o envio adequado para cada tipo de email.

  • O cabeçalho de autenticação parece o mesmo. Basta substituir a chave de API?

    Quase. Ambos os serviços usam Authorization: Bearer <api_key>, pelo que o formato do cabeçalho é idêntico. Substitua o valor da chave, atualize o URL do endpoint de api.sendgrid.com/v3/mail/send para send.api.mailtrap.io/api/send e ajuste a estrutura do payload JSON (ver abaixo ⬇️).

  • Quanto do meu payload de pedido preciso de reescrever?

    A estrutura central muda, mas os dados permanecem os mesmos. Remova o wrapper personalizations e mova to, cc, bcc e subject para o nível da raiz. Substitua o array content[] por campos simples de html e text. Se estiver a enviar um único email transacional (o caso comum), isto simplifica significativamente o payload.

  • Eu uso múltiplas ‘categories’ do SendGrid por email. Como lido com isso no Mailtrap?

    O Mailtrap aceita uma única string category em vez do array categories[] do SendGrid (até 10). Escolha a sua categoria principal para o campo category e mova quaisquer etiquetas secundárias para custom_variables, onde pode armazenar metadados arbitrários do tipo chave-valor.

  • O Mailtrap suporta as ‘personalizations’ do SendGrid para envio em massa?

    Não como um array de chamada única. O SendGrid permite-lhe agrupar múltiplos grupos de destinatários com diferentes assuntos e substituições num único pedido através de personalizations[]. No Mailtrap, use o endpoint de envio em massa (bulk.api.mailtrap.io/api/send) e envie até 500 emails por chamada. Cada email no lote é um objeto separado com os seus próprios destinatários e variáveis.

  • O Mailtrap oferece assistência à migração?

    Sim, o Mailtrap oferece assistência à migração a partir do plano Business.

  • Como migrar templates?

    Ambas as plataformas usam a sintaxe Handlebars, pelo que a formatação padrão do template é portada diretamente. A única exceção é o helper {{#equals}} do SendGrid, que não é suportado no Mailtrap. Substitua as verificações de igualdade por variáveis boolean pré-calculadas, passadas no momento do envio.

    Do lado da API, substitua template_id por template_uuid e personalizations[].dynamic_template_data por template_variables. Armazene os seus UUIDs com cuidado – o Mailtrap não permite recuperá-los ou reatribuí-los após a eliminação.