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
- 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.
- 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. - 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. - Migre os templates
Ambas as plataformas usam Handlebars, pelo que o conteúdo é migrado diretamente. Veja as secções de templates abaixo. - 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. - Migre os utilizadores
Adicione utilizadores a partir da aba “User Management” e reveja as permissões durante a migração. - Configure os webhooks
Siga o guia passo a passo de webhooks do Mailtrap. - 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.
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-Categoryse estiver a usar SMTP. Ou passe o nome da categoria no campocategoryse estiver a enviar via API. - Utilizar as Categories com o SendGrid: Passe as categorias dentro do cabeçalho JSON
X-SMTPAPIse estiver a usar SMTP. Ou passe uma série de strings no campocategoriesse 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
- Sending Domains
- Email Logs
- User Management
- Email Templates
- Email Categories
- Headers
- X-MT-Custom-Variables
- Audit Logs
- Domain Authentication
- Email Activity
- Teammates
- SendGrid Templates
- Categories
- X-SMTPAPI
- Unique Arguments
- Activity
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.
| SendGrid | Mailtrap | |
| Método | API key (token Bearer) | API token (token Bearer) |
| Cabeçalho | Authorization: Bearer YOUR_SENDGRID_API_KEY | Authorization: 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 API | SendGrid | Mailtrap | Notas |
| Email transacional | POST https://api.sendgrid.com/v3/mail/send | POST https://send.api.mailtrap.io/api/send | O SendGrid envolve os destinatários em personalizations[]; o Mailtrap usa JSON simples |
| Envio em massa | O mesmo endpoint (/v3/mail/send) com agrupamento em personalizations[] | POST https://bulk.api.mailtrap.io/api/send | O Mailtrap isola o envio em massa num host separado para proteger a reputação transacional |
| Envio de templates | O mesmo endpoint com template_id + dynamic_template_data | O mesmo endpoint de envio com template_uuid + template_variables | Os IDs de templates dinâmicos do SendGrid começam com d- |
| Supressões | GET/DELETE https://api.sendgrid.com/v3/suppression/* (bounces, blocks, spam_reports, invalid_emails, unsubscribes) | https://mailtrap.io/pt/pt/api/accounts/{account_id}/suppressions | O SendGrid divide as supressões por múltiplos endpoints de acordo com o tipo |
| Estatísticas | GET https://api.sendgrid.com/v3/stats (global), /categories/stats, /mailbox_providers/stats | GET/api/accounts/{account_id}/stats, /stats/domains, /stats/categories, /stats/email_service_providers, e /stats/date | O SendGrid oferece estatísticas com mais filtros (por categoria, fornecedor de caixa de correio, navegador, etc.) |
| Registos de email | GET https://api.sendgrid.com/v3/messages (Email Activity Feed) | POST /api/1.0/messages/{search,info,content}.json | O 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.
| Campo | SendGrid | Mailtrap |
| Endereço do remetente | from.email | from.email |
| Nome do remetente | from.name | from.name |
| Destinatários | personalizations[].to[].email | to[].email |
| Nome do destinatário | personalizations[].to[].name | to[].name |
| Destinatários em CC | personalizations[].cc[].email | cc[].email |
| Nome em CC | personalizations[].cc[].name | cc[].name |
| Destinatários em BCC | personalizations[].bcc[].email | bcc[].email |
| Nome em BCC | personalizations[].bcc[].name | bcc[].name |
| Assunto | subject (raiz ou personalizations[].subject) | subject |
| Corpo HTML | content[].value (onde type = text/html) | html |
| Corpo em texto simples | content[].value (onde type = text/plain) | text |
| Endereço de resposta (Reply-to) | reply_to.email | reply_to.email |
| Nome de resposta (Reply-to) | reply_to.name | reply_to.name |
| Lista de resposta (Reply-to list) | reply_to_list[] | – |
| Cabeçalhos personalizados | headers (raiz ou personalizations[].headers) | headers |
| Categorias | categories[] (array, até 10) | category (string única) |
| Metadados personalizados | custom_args (raiz ou personalizations[].custom_args) | custom_variables |
| ID do template | template_id | template_uuid |
| Dados do template | personalizations[].dynamic_template_data | template_variables |
| Substituições | personalizations[].substitutions | – |
| Conteúdo do anexo | attachments[].content (Base64) | attachments[].content (Base64) |
| Nome do ficheiro do anexo | attachments[].filename | attachments[].filename |
| Tipo MIME do anexo | attachments[].type | attachments[].type |
| Disposição do anexo | attachments[].disposition | attachments[].disposition |
| ID do conteúdo do anexo | attachments[].content_id | attachments[].content_id |
| Agendamento do envio | send_at (Unix timestamp) | – |
| ID do lote (Batch ID) | batch_id | – |
| Pool de IP | ip_pool_name | – |
| Rastreio de aberturas | tracking_settings.open_tracking.enable | Via definições de conta ou cabeçalhos |
| Rastreio de cliques | tracking_settings.click_tracking.enable | Via definições de conta ou cabeçalhos |
| Aglomeração de vários destinatários | personalizations[] (até 1000 destinatários por pedido) | – |
| Fluxo de envio | Endpoint único para todos os tipos de email | Determinado pelo endpoint: send.api.mailtrap.io (transacional) ou bulk.api.mailtrap.io (em massa) |
| Envio em massa | Via personalizations[] num único pedido | POST /api/batch (até 500 emails) |
Trechos de código
-
cURL
-
PHP
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>"
}
]
}'
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ériepersonalizations. O Mailtrap mantém as coisas simples:to,cc,bcc,subjectetemplate_variablesvivem 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 chamadocontent, onde cada elemento declara umtypeMIME e umvalue. O Mailtrap usa campos dedicadoshtmletextna 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.iopara emails transacionais ebulk.api.mailtrap.iopara envios em massa – isolando os dois ao nível da infraestrutura.
Migração de SMTP
| Configuração | SendGrid | Mailtrap (transacional) | Mailtrap (em massa) |
| Host | smtp.sendgrid.net | live.smtp.mailtrap.io | bulk.smtp.mailtrap.io |
| Porta | 587 (recomendada), 465, 25 | 587 (recomendada), 25, 2525 | 587 (recomendada), 25, 2525 |
| TLS | Não necessário | Necessário | Necessário |
| Autenticação | PLAIN, LOGIN | PLAIN, LOGIN | PLAIN, LOGIN |
| Nome de utilizador | string apikey | string api | string api |
| Palavra-passe | Chave de API | Token de API | Token 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
apie o SendGrid usaapikey. Ambos devem ser inseridos exatamente como demonstrado, ou seja, não substituaapiouapikeycom outros dados.

Para mais informações sobre como migrar a sua configuração de SMTP, clique neste link. ⬅️
Limites de tráfego e quotas
| Limite | SendGrid | Mailtrap |
| 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 MB | 10 MB por defeito (extensível até 30 MB sob pedido) |
| Máx. de destinatários por envio único | 1000 (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ão | SendGrid | Mailtrap |
| 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 API | personalizations[].dynamic_template_data (objeto JSON) | template_variables (objeto JSON) |
| Identificador de template | template_id (templates dinâmicos com o prefixo d-, ex.: d-abc123) | template_uuid |
| Substituições legacy | personalizations[].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
insertdo 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 chamadasformatDate, 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,orelengthpara 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 depersonalizations[]) paratemplate_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 usatemplate_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
subjectdefinido no pedido da API. O Mailtrap comporta-se da mesma forma – se o template incluir um assunto, o camposubjectno pedido da API é ignorado.
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 deapi.sendgrid.com/v3/mail/sendparasend.api.mailtrap.io/api/sende 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
personalizationse movato,cc,bccesubjectpara o nível da raiz. Substitua o arraycontent[]por campos simples dehtmletext. 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
categoryem vez do arraycategories[]do SendGrid (até 10). Escolha a sua categoria principal para o campocategorye mova quaisquer etiquetas secundárias paracustom_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_idportemplate_uuidepersonalizations[].dynamic_template_dataportemplate_variables. Armazene os seus UUIDs com cuidado – o Mailtrap não permite recuperá-los ou reatribuí-los após a eliminação.