Como ler cabeçalhos de e-mail para resolver problemas de entrega
O cabeçalho de um e-mail é um registro escrito por cada servidor por onde a mensagem passou, com a entrada mais nova no topo. Para resolver problemas de entregabilidade, leia três coisas: a linha Authentication-Results que o seu próprio provedor de e-mail adicionou, a cadeia Received de baixo para cima para ver a rota e os atrasos, e os domínios de DKIM-Signature e Return-Path para conferir o alinhamento com o From.
Este post percorre linha por linha cabeçalhos reais e publicados. Se você está tentando descobrir por que uma mensagem específica caiu na pasta de spam do Gmail, comece pelo diagnóstico de spam no Gmail, que é mais curto, e volte aqui quando precisar entender o que uma linha significa.
Como obter o cabeçalho completo
Todos os principais clientes de e-mail mostram o cabeçalho bruto, normalmente numa opção chamada "Show original" (Mostrar original), "View source" (Ver código-fonte) ou "View message details" (Ver detalhes da mensagem).
- Gmail (web): abra a mensagem, clique em Mais ao lado de Responder e depois em Show original (Mostrar original). A página de ajuda do Google diz que o cabeçalho completo abre numa nova janela com um botão Copy to clipboard (Copiar para a área de transferência).
- Outlook e Apple Mail: os dois mostram o código-fonte na visualização da mensagem; o nome do menu muda conforme a versão, então procure "view message headers" na ajuda do seu cliente.
Copie sempre o cabeçalho do lado do destinatário. A cópia na sua pasta Enviados não passou pelos servidores de recebimento, então não tem as linhas Received deles nem o Authentication-Results do receptor, que são as linhas que importam.
A regra que torna os cabeçalhos legíveis
Cada servidor adiciona suas linhas no topo, então o cabeçalho se lê como uma pilha: o mais novo em cima, a origem embaixo.
Isso não é convenção, é o protocolo. A RFC 5321, seção 4.4 diz: "SMTP servers MUST prepend Received lines to messages; they MUST NOT change the order of existing lines or insert Received lines in any other location." (Servidores SMTP DEVEM adicionar as linhas Received no início das mensagens; NÃO DEVEM mudar a ordem das linhas existentes nem inserir linhas Received em nenhum outro lugar.)
Duas consequências práticas:
- Para seguir a rota, leia as linhas
Receivedde baixo para cima. - As linhas perto do topo foram escritas pelo seu próprio provedor. As de baixo foram escritas por servidores que você nunca viu, e algumas podem ter sido escritas pelo remetente. A confiança diminui à medida que você desce.
Um cabeçalho real, comentado
O exemplo real mais limpo de um cabeçalho com vários saltos e resultados de autenticação está na própria especificação. Este é o Exemplo 5 da RFC 8601, Apêndice B.5, citado exatamente (a assinatura DKIM aparece cortada com ... no original):
Authentication-Results: example.com;
dkim=pass (good signature) header.d=example.com
Received: from mail-router.example.com
(mail-router.example.com [192.0.2.1])
by auth-checker.example.com (8.11.6/8.11.6)
with ESMTP id i7PK0sH7021929;
Fri, Feb 15 2002 17:19:22 -0800
DKIM-Signature: v=1; a=rsa-sha256; s=gatsby; d=example.com;
t=1188964191; c=simple/simple; h=From:Date:To:Subject:
Message-Id:Authentication-Results;
bh=sEuZGD/pSr7ANysbY3jtdaQ3Xv9xPQtS0m70;
b=EToRSuvUfQVP3Bkz ... rTB0t0gYnBVCM=
Authentication-Results: example.com;
auth=pass (cram-md5) smtp.auth=sender@example.com;
spf=fail smtp.mailfrom=example.com
Received: from dialup-1-2-3-4.example.net
(dialup-1-2-3-4.example.net [192.0.2.200])
by mail-router.example.com (8.11.6/8.11.6)
with ESMTPA id g1G0r1kA003489;
Fri, Feb 15 2002 17:19:07 -0800
From: sender@example.com
Date: Fri, Feb 15 2002 16:54:30 -0800
To: receiver@example.com
Message-Id: <12345.abc@example.com>
Subject: here's a sample
Leia a partir de baixo.
| Ordem | Linha | O que ela diz |
|---|---|---|
| 1 | From, Date, Subject, Message-Id |
Escritos pelo programa de e-mail do remetente. Todos são alegações, não fatos. |
| 2 | Received de baixo |
mail-router.example.com aceitou a mensagem de um host de acesso discado em 192.0.2.200. ESMTPA significa que o remetente fez login com SMTP AUTH. |
| 3 | Authentication-Results de baixo |
O roteador registrou que o SMTP AUTH passou e que o SPF falhou: a rede de acesso discado não estava listada no SPF de example.com. |
| 4 | DKIM-Signature |
O roteador assinou a mensagem como d=example.com, seletor gatsby, e incluiu o Authentication-Results de baixo nos cabeçalhos assinados (h=). |
| 5 | Received de cima |
auth-checker.example.com recebeu a mensagem do roteador em 192.0.2.1. |
| 6 | Authentication-Results de cima |
O verificador conferiu a assinatura DKIM: pass. |
A explicação da própria RFC bate com isso: o usuário era legítimo (autenticou com senha), o SPF falhou porque a rede de acesso discado não estava autorizada, e o DKIM passou porque o roteador assinou com uma chave que example.com publica.
Essa é a principal lição do exemplo, e ela vale diretamente para a entregabilidade de hoje: uma falha de SPF sozinha não significa que o e-mail é ilegítimo, e o DKIM é o que sobrevive ao trajeto.
Medindo atrasos pela cadeia Received
Cada linha Received termina com um carimbo de data e hora, então a diferença entre linhas consecutivas é quanto tempo cada salto levou.
A RFC 5321 pede que os servidores usem fusos explícitos como -0800, o que permite comparar entre fusos horários. Escrevemos um script curto para isso e o rodamos no exemplo da RFC acima. O script completo está abaixo.
import sys, re
from email import message_from_string
from email.utils import parsedate_to_datetime
msg = message_from_string(open(sys.argv[1]).read())
hops = msg.get_all("Received") or []
prev = None
for i, h in enumerate(reversed(hops), 1):
h = " ".join(h.split())
stamp = h.rsplit(";", 1)[-1].strip()
try:
when = parsedate_to_datetime(stamp)
except Exception:
when = None
m = re.search(r"from (\S+).*?by (\S+)", h)
gap = f"+{(when - prev).total_seconds():.0f}s" if when and prev else "-"
print(f"hop {i}: {m.group(1) if m else '?'} -> {m.group(2) if m else '?'} {stamp} {gap}")
prev = when or prev
Saída, executada em 1º de outubro de 2026 (python3 hops.py header.txt):
hop 1: dialup-1-2-3-4.example.net -> mail-router.example.com Fri, Feb 15 2002 17:19:07 -0800 -
hop 2: mail-router.example.com -> auth-checker.example.com Fri, Feb 15 2002 17:19:22 -0800 +15s
O salto entre os dois servidores levou 15 segundos. O intervalo maior está entre o cabeçalho Date, 16:54:30, e a primeira linha Received, 17:19:07: cerca de 25 minutos antes de qualquer servidor ver a mensagem. O Date é definido pelo software do remetente, então um intervalo ali aponta para o lado do remetente (uma caixa de saída na fila, um envio agendado ou um relógio errado), não para algum relay.
Se você prefere não rodar código, a ferramenta Messageheader do Google faz a mesma conta: cole um cabeçalho e ela identifica atrasos de entrega e a origem aproximada.
Lendo o Authentication-Results do jeito certo
O Authentication-Results registra cada verificação como método=resultado, seguido da identidade que foi verificada. É a linha mais útil do cabeçalho e a mais mal interpretada.
O formato, segundo a RFC 8601, é:
Authentication-Results: <authserv-id>; <method>=<result> [reason] <ptype>.<property>=<value>
- authserv-id é quem fez a verificação, por exemplo
mx.google.com. - method=result é a verificação e o resultado:
spf=pass,dkim=fail,dmarc=pass. - ptype.property diz qual identidade foi verificada:
smtp.mailfrom(o remetente do envelope),header.douheader.i(o domínio que assina com DKIM),header.from(o domínio visível no From). - Tudo o que está entre parênteses é um comentário em texto livre, e cada receptor escreve de um jeito.
Os resultados possíveis que a RFC define para SPF são none, pass, fail, softfail, neutral, temperror, permerror e policy; o DKIM usa none, pass, fail, policy, neutral, temperror e permerror.
Confie só no que o seu provedor escreveu
A RFC 8601 deixa claro que esse cabeçalho só deve ser levado em conta quando vem de um servidor dentro do seu próprio limite administrativo, e que um servidor em conformidade deve apagar cópias que dizem vir dele mas chegam de fora. Na prática: use o Authentication-Results mais alto cujo authserv-id seja o seu próprio provedor. Qualquer cópia mais abaixo foi escrita por outra pessoa, possivelmente o remetente.
Um exemplo real do Gmail, conferido no DNS
A Valimail publicou este cabeçalho de uma mensagem recebida no Gmail (fonte):
Authentication-Results: mx.google.com;
dkim=pass header.i=@valimail.com header.s=google2048 header.b=Z8L6tjHb;
spf=pass (google.com: domain of [redacted]@valimail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=[redacted]@valimail.com;
dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=valimail.com
Cada afirmação nele pode ser conferida no seu próprio terminal. Fizemos isso em 1º de outubro de 2026:
| O cabeçalho diz | Comando | O que o DNS retornou |
|---|---|---|
Seletor DKIM google2048 em valimail.com |
dig +short TXT google2048._domainkey.valimail.com |
Um registro de chave começando com "v=DKIM1; k=rsa; p=MIIBIjAN..." |
Política DMARC p=REJECT |
dig +short TXT _dmarc.valimail.com |
"v=DMARC1; p=reject; rua=..." |
Enviado de 209.85.220.41 |
dig +short -x 209.85.220.41 |
mail-sor-f41.google.com. |
Ou seja, o seletor citado em s= existe, a política que o Gmail informou bate com o registro publicado, e o IP de envio é da infraestrutura de saída do próprio Google. Vale criar o hábito dessa conferência: o cabeçalho diz o que o receptor concluiu, e o DNS diz se essa conclusão ainda vale hoje. O nosso verificador de DKIM e o verificador de DMARC fazem as mesmas consultas sem terminal.
Alinhamento: a verificação que você faz no olho
O DMARC compara o domínio de header.from com os domínios que passaram no SPF e no DKIM. Pelo menos um precisa corresponder à organização do domínio do From.
No exemplo do Gmail os três são valimail.com, então o DMARC passa por qualquer uma das verificações. A falha comum, por outro lado, fica assim:
| Identidade | Domínio | Resultado |
|---|---|---|
smtp.mailfrom (Return-Path) |
bounces.sendingplatform.example |
spf=pass |
header.d (DKIM) |
sendingplatform.example |
dkim=pass |
header.from |
yourcompany.example |
dmarc=fail |
Dois pass e um fail, porque nada do que passou pertence ao domínio do From. A especificação atual do DMARC (RFC 9989, maio de 2026, que substitui a RFC 7489) só exige um pass alinhado, e a correção habitual é ativar o DKIM personalizado para o seu próprio domínio na plataforma de envio.
Return-Path: para onde vão os bounces
O Return-Path é o remetente do envelope, adicionado na entrega final, e é o endereço para onde os bounces são enviados. Também é a identidade que o SPF verifica.
A RFC 5321 diz que o servidor que entrega a mensagem o insere na entrega final, preservando o endereço do comando MAIL FROM, e que seu objetivo principal é dizer para onde vão os avisos de não entrega. Ele costuma ser diferente do From, principalmente com uma plataforma de envio que cuida dos seus bounces. Isso é normal. Mas se ele aponta para um lugar que você não controla, os bounces que você precisa ver estão indo para outro lugar, e isso importa para manter uma lista limpa.
O que os cabeçalhos não conseguem dizer
Os cabeçalhos mostram a autenticação e a rota, não por que um filtro escolheu Spam. O Gmail não escreve a pontuação de reputação no cabeçalho.
Se tudo no cabeçalho passa e a mensagem ainda cai em Spam, a resposta está nos dados de reputação, não no cabeçalho. No Gmail, isso significa o Postmaster Tools. Para a ordem de investigação dessas causas, veja o diagnóstico do Gmail.
Um checklist para qualquer cabeçalho
- Copie o cabeçalho da cópia do destinatário, nunca de Enviados.
- Encontre o
Authentication-Resultsmais alto escrito pelo seu provedor. Ignore os outros. - Confira os resultados de
spf,dkimedmarc. Anote o domínio ao lado de cada um. - Compare esses domínios com
header.from. Pelo menos um pass precisa estar alinhado. - Consulte no DNS o seletor DKIM (
s=) e o registro DMARC para confirmar que ainda existem. - Leia as linhas
Receivedde baixo para cima. Anote o primeiro IP que o seu provedor registrou e qualquer salto com um intervalo longo. - Compare o
Datecom o horário do primeiroReceivedpara separar atraso do lado do remetente de atraso nos relays.
Para rodar a parte de DNS deste checklist no seu próprio domínio de uma vez, use a auditoria de entregabilidade gratuita.
Perguntas frequentes
Em que ordem devo ler os cabeçalhos de um e-mail?
Leia as linhas Received de baixo para cima, porque cada servidor adiciona a sua linha no topo. A de baixo é a mais próxima do remetente e a de cima é a entrega final. Os Authentication-Results devem ser lidos a partir do topo, já que o que o seu próprio provedor adicionou é o único em que você pode confiar.
Cabeçalhos de e-mail podem ser falsificados?
Tudo o que o remetente escreve pode ser falsificado, incluindo From, Date e qualquer linha Received adicionada antes de a mensagem chegar a um servidor confiável. As linhas que o seu próprio provedor adiciona não podem ser forjadas pelo remetente, por isso você confia no topo do cabeçalho e trata a parte de baixo como alegações.
Qual é a diferença entre Return-Path e From?
Return-Path é o remetente do envelope, para onde vão os bounces, e é o que o SPF verifica. From é o endereço que o destinatário vê, e é o que o DMARC protege. Quando você envia por uma plataforma, eles costumam ser domínios diferentes, o que não é problema desde que DKIM ou SPF estejam alinhados com o domínio do From.
Como encontro o IP de envio no cabeçalho de um e-mail?
Procure a linha Received adicionada pelo primeiro servidor confiável, normalmente o servidor de entrada do seu próprio provedor, e pegue o IP entre colchetes na cláusula 'from'. Muitos receptores também o repetem na parte de SPF do Authentication-Results.
Verifique e-mails por USD 39,00/mês, sem bloqueio
Checagem SMTP real da caixa postal. Sem créditos e sem cobrança por e-mail.
Começar agora