O SPF é um registro DNS que lista quais servidores podem enviar email pelo seu domínio. A regra mais importante: apenas um registro SPF por domínio. Se você tem dois, o protocolo falha completamente — todos os seus emails ficam sem autenticação SPF.
A regra do SPF único
O padrão SPF (RFC 7208, seção 3.2) é explícito:
"A domain name MUST NOT have multiple records that would cause an authorization check to select more than one record."
Em português: o domínio não deve ter mais de um registro SPF. Se tiver, todos são considerados inválidos por receptores rigorosos (Gmail, Outlook, Yahoo).
Como o problema aparece
O cenário típico é o seguinte:
- Você configurou SPF antes para outro serviço de email (ex: Mailchimp, RD Station)
- Ao conectar o ShopIA com domínio próprio, recebe instrução de adicionar
include:amazonses.comao SPF - Em vez de modificar o registro existente, você adiciona um novo registro TXT separado
- O domínio passa a ter dois registros SPF
- Os dois invalidam-se mutuamente
Como verificar se você tem o problema
Opção 1 — comando dig
Em qualquer terminal:
dig +short suamarca.com.br TXT | grep spf
Se retornar mais de uma linha começando com v=spf1, você tem o problema.
Opção 2 — ferramenta web
Use uma das seguintes:
mxtoolbox.com/spf.aspxdmarcian.com/spf-survey/
Cole seu domínio. Se houver múltiplos SPFs, a ferramenta destaca em vermelho.
Opção 3 — painel de DNS
No seu provedor de DNS (Cloudflare, Registro.br, GoDaddy), filtre os registros TXT do domínio raiz. Se houver dois ou mais começando com v=spf1, você tem o problema.
Como resolver: consolidar em um único registro
A solução é mesclar os registros existentes em um só. Cada serviço normalmente fornece um trecho include: que você adiciona à linha existente.
Exemplo prático
Antes (problema):
v=spf1 include:_spf.google.com ~all
v=spf1 include:amazonses.com ~all
Depois (correto):
v=spf1 include:_spf.google.com include:amazonses.com ~all
Apenas uma linha com todos os include: necessários.
Includes mais comuns
| Serviço | Include a usar |
|---|---|
| ShopIA (envios via SES) | include:amazonses.com |
| Google Workspace | include:_spf.google.com |
| Microsoft 365 | include:spf.protection.outlook.com |
| Mailchimp | include:servers.mcsv.net |
| RD Station | include:_spf.rdstation.com.br |
| SendGrid | include:sendgrid.net |
| HubSpot | include:_spf.hubspotemail.net |
Some quantos include: precisar — porém atenção ao limite de 10 lookups DNS por SPF (regra do RFC). Cada include: conta como pelo menos 1 lookup.
Limite de 10 lookups DNS
O SPF tem um limite técnico: no máximo 10 consultas DNS durante a validação. Cada include: aninhado conta. Se você ultrapassa o limite, o SPF falha com erro permerror.
Como saber se está perto do limite
Ferramentas como mxtoolbox.com/spf.aspx exibem o número de lookups consumidos. Se passar de 10, o relatório mostra alerta.
Como reduzir lookups
- Remover serviços não usados. Se você cancelou Mailchimp ano passado, remova o
include:correspondente. - Usar
ip4:em vez deinclude:quando possível. Para serviços que publicam IPs fixos,ip4:consome 0 lookups (vs 1 doinclude:). - Considerar SPF flattening. Ferramentas pagas (como
dmarcian.com) automatizam a expansão dosinclude:em IPs literais. Solução de último caso.
Passo a passo para corrigir SPF duplicado
- Identifique os dois (ou mais) registros SPF existentes. Anote os
include:de cada um. - Componha um registro consolidado. Combine os
include:em uma única linha começando comv=spf1. - No DNS do seu domínio, edite o registro mais antigo colocando o valor consolidado.
- Delete os outros registros SPF. Deixe apenas o consolidado.
- Aguarde propagação (alguns minutos a algumas horas).
- Valide com
digou ferramenta web. Deve retornar apenas uma linha SPF.
O parâmetro final: ~all vs -all
Toda linha SPF termina com ~all ou -all. A diferença:
~all— softfail. Email de servidor não listado é marcado como suspeito mas não rejeitado.-all— hardfail. Email de servidor não listado é rejeitado.
Recomendamos ~all durante migração e estabilização. Após confirmar que todos os serviços de envio estão listados corretamente (e que o DMARC está em p=quarantine ou p=reject), pode evoluir para -all.