Conceitos fundamentais

Entregabilidade na prática

3 mecanismos que decidem se seu email chega na inbox ou no spam: warmup automático que cuida da reputação do IP, classificação de bounces que protege sua reputação retroativamente, e autenticação DKIM/SPF/DMARC que prova que você é quem diz ser.

Warmup

Como funciona

IP novo não tem reputação. Se você dispara 100.000 emails no primeiro dia, provedores grandes (Gmail, Outlook) tratam como spam por default. Warmup é o processo de aquecer o IP gradualmente até atingir capacidade plena, sinalizando aos provedores que o tráfego é legítimo.

No RaviMail, todo IP novo passa por warmup automático de 7 dias. O dispatcher central limita o volume por dia por bucket de provedor. Não precisa configurar nada — você dispara campanhas normalmente e o sistema garante que cada bucket recebe só o volume seguro pra fase atual.

Importante: warmup é throttle, não bloqueio. Sua campanha não fica "esperando" — ela dispara o que pode dentro do cap diário e o restante vai pro dia seguinte automaticamente.

Buckets por provedor

Provedores diferentes têm filtros diferentes. O RaviMail agrupa os destinatários em 5 buckets e aplica warmup separado pra cada um. Isso é importante porque problemas com gmail não devem impactar envio pra outlook (e vice-versa).

BucketDomínios incluídosComportamento
gmail gmail.com, googlemail.com + Google Workspace (MX em google) Mais rigoroso. Threshold default 2% nos dias 1-3.
microsoft outlook.com, hotmail.com, live.com, msn.com + Microsoft 365 (MX em outlook/protection) Rigoroso similar ao Gmail. Threshold 2% inicial.
yahoo yahoo.com, yahoo.com.br, ymail.com, rocketmail.com Médio rigor. Suporta FBL via ARF (S50).
icloud icloud.com, me.com, mac.com Discreto — sem postmaster público, mas filtra parecido com Gmail.
other uol, locaweb, terra, correios, providers BR menores, corporativos Bucket mais perigoso. Concentra complaints 5.7.1 e bloqueios silenciosos. Rampa conservadora.

Por que "other" é perigoso: mistura muitos provedores com filtros diferentes (uol/locaweb/terra agrupam volume B2B BR). Um único bloqueio nesse bucket frequentemente vira complaint silenciosa antes de aparecer como hard bounce. Por isso o cap diário "other" é o menor dos 5.

Thresholds e auto-pause

Pra cada bucket, o RaviMail acompanha em tempo real a taxa de bounce (apenas hard + complaint — soft/throttle não inflam o número). Se passar do threshold, o bucket entra em auto-pause e retoma só no vira-dia (00:30 UTC).

Threshold padrão por idade do IP

Dia em warmupgmail / microsoftyahoo / icloud / other
Dia 1-32.0%3.0%
Dia 4-62.5%3.5%
Dia 7+3.0%5.0%

O que dispara auto-pause

  • Threshold diário batido: hard rate do bucket no dia ≥ threshold da fase. Volume mínimo (~50 mensagens) pra evitar falsos positivos em volume pequeno.
  • POLICY keyword-gated (S43): 5.7.1 com "low reputation" pausa per-bucket independente. Threshold 10% gmail/MS, 15% outros, min 50.
  • RBL externa (S44+S45): Spamhaus DBL listou seu domínio? Pause em todos os nós, manual-only resume.

Como você vê

  • Campanha mostra status Aguardando dia seguinte quando 100% dos pendentes estão em buckets pausados
  • Notificação WhatsApp se você tiver configurado alert warmup_paused
  • Dashboard /infrastructure mostra score por IP/bucket + histórico de pause events

Vira-dia retoma automaticamente. Se foi pause de threshold diário, não precisa fazer nada — o cap zera às 00:30 UTC e o bucket volta. Pause por RBL ou POLICY exige resume manual (você precisa ter agido sobre a causa raiz).

Customizar limites

Conta com histórico de envio limpo + IP dedicado pode pedir threshold maior. O painel /infrastructure/warmup-config aceita multiplicador per-user (cap 0.5% mínimo, 25% máximo). Aplica via API admin PUT /v1/admin/warmup-config.

Aumentar threshold não acelera warmup. O cap diário (quantos emails pode enviar por bucket por dia) continua o mesmo. Threshold só afeta quanto bounce o sistema tolera antes de pausar.

Anatomia de Bounces

Os 6 tipos de bounce

Bounce não é só "deu erro". O RaviMail classifica via DSN code (Delivery Status Notification) em 6 categorias com comportamento diferente. Cada categoria decide: retry ou desistir? suppression ou não? pause de IP ou não?

TipoDSN típicoSignificadoAção
hard 5.1.1, 5.1.2, 5.1.10 Caixa inexistente, domínio inválido Terminal. Suppression automática. Conta inflama warmup.
complaint FBL/ARF do provedor Destinatário marcou como spam Terminal. Suppression. Conta inflama warmup. Mais grave que hard.
soft 4.2.2, 4.3.1, 4.7.1 Caixa cheia, problema temporário do destinatário Retry day+1, max 3 tentativas → failed.
throttle 4.7.x rate limit Provedor pedindo pra desacelerar Retry day+1, NÃO conta no warmup. Sinal de IP "fresco".
policy 5.7.x sem ARF (S40) Política de conteúdo, baixa reputação, bloqueio explícito Retry day+1. Se keyword "low reputation" → pause per-bucket (S43).
unknown Sem DSN parseable DSN malformado ou não-padrão Terminal sem retry (S44, migration 014). UI destaca em amber.

Toda mensagem que recebe DSN passa pelo DSN Classifier. A coluna bounces.type guarda o resultado. Use isso pra diagnóstico — agrupar bounces por type + dsn_code mostra padrões (throttle 4.7.x = warmup natural; 5.1.x = lista ruim; 5.7.x = conteúdo).

Retry policy

Tipos não-terminais (soft, throttle, policy) entram em fila de retry. Política simples e previsível:

  • 1ª retry: dia seguinte (vira-dia)
  • 2ª retry: +1 dia
  • 3ª retry: +1 dia
  • Após 3 tentativas falhadas: marca como failed. Sem retry adicional.

Reenvio ≠ envio único (S40): total_sent = entregas confirmadas via webhook delivered; total_attempts = tentativas (originais + retries). Reenvio só pra soft/throttle/policy não-terminais.

Failed manual: tela /retry-failed (S42) permite resetar attempts=0 e reenfileirar bulk via CSRF + modal de confirmação. Histórico fica em audit log.

Suppression automática

Pra proteger sua reputação, o RaviMail mantém uma suppression list global por user. Contatos suprimidos NÃO recebem mais email seu, em nenhuma lista. Pré-bloqueio acontece antes do envio — não queima crédito.

Razões de suppression automática

  • unsubscribed — destinatário clicou no link de descadastro (obrigatório por LGPD)
  • bounced — hard bounce permanente
  • invalid — complaint do destinatário

Adicionar manualmente via POST /v1/suppression (veja docs). Reativar é cauteloso (DELETE /v1/suppression/{email}) — só se você corrigiu o motivo raiz.

ARF / FBL — Feedback Loop dos provedores

ARF (Abuse Reporting Format, RFC 5965) é o formato padrão que provedores usam pra te notificar quando um usuário clicou "marcar como spam". Sem ARF, você não fica sabendo do complaint e continua enviando pra alguém que já te marcou como abuse — caminho rápido pra reputação destruída.

Provedores com ARF integrado

Quando o ARF chega, o reply_poller do nó faz parse, gera evento complaint com source yahoo_fbl, dispara suppression automática + webhook pro seu app, e contabiliza no warmup. Tudo em background sem ação sua.

Autenticação (DKIM/SPF/DMARC)

Por que importa

SMTP foi desenhado nos anos 80 — qualquer servidor pode declarar "sou noreply@empresa.com" sem provar nada. Spammers exploraram isso por décadas. DKIM/SPF/DMARC são 3 camadas de prova criptográfica que provedores usam pra decidir se confiam no seu email.

Sem os 3 configurados, Gmail/Outlook tratam seu email como suspeito por default — vai pro spam ou nem é aceito. Por isso é o primeiro passo de qualquer setup sério de email marketing.

PadrãoO que provaComo
DKIM Que o conteúdo não foi alterado em trânsito Assinatura criptográfica RSA 2048-bit no header da mensagem
SPF Que esse IP está autorizado a enviar pelo seu domínio Registro TXT com lista de IPs/includes permitidos
DMARC O que fazer quando DKIM ou SPF falhar Registro TXT com política (none, quarantine, reject)

DKIM — assinatura criptográfica

Quando você adiciona um domínio no RaviMail, o nó gera um par de chaves RSA 2048-bit. A privada fica no nó; a pública é publicada no DNS do seu domínio como TXT em default._domainkey.<seu-domínio>. Toda mensagem enviada recebe header DKIM-Signature assinado com a privada.

Registro TXT que você publica

Host:  default._domainkey.meudominio.com.br
Tipo:  TXT
Valor: v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB...

O painel mostra o valor exato com a chave pública gerada pro seu domínio. Propagação leva de 5 minutos a 48 horas dependendo do seu DNS. Re-verificação consulta 3 resolvers públicos em paralelo (8.8.8.8, 1.1.1.1, 9.9.9.9).

SPF — autorização de IPs

SPF lista quais servidores podem enviar email com seu domínio no MAIL FROM. O RaviMail usa include de subdomínios — você inclui _spf.<nó>.ravimail.com.br e a gente cuida de atualizar os IPs quando rotamos.

Registro TXT que você publica

Host:  meudominio.com.br (apex — domínio raiz, sem subdomínio)
Tipo:  TXT
Valor: v=spf1 include:_spf.ravinode01.ravimail.com.br ~all

Conflito com SPF existente: só pode ter UM registro SPF por domínio (regra RFC). Se já tem outro provedor (Google Workspace, etc), você precisa juntar os includes em um único registro:

v=spf1 include:_spf.google.com include:_spf.ravinode01.ravimail.com.br ~all

Por que ~all e não -all: ~all = "softfail" (provedor decide; flexível com edge cases). -all = "hardfail" (rejeitar). Comece com ~all e, depois de meses sem problema, considere -all pra extra-rigor.

DMARC — política de falha

DMARC junta DKIM + SPF e diz aos provedores "se uma das checagens falhar, faça X". Sem DMARC, provedores decidem sozinhos (pode ser inconsistente). Com DMARC, você controla.

Registro TXT que você publica

Host:  _dmarc.meudominio.com.br
Tipo:  TXT
Valor: v=DMARC1; p=quarantine; adkim=s; aspf=s

Tradução da política:

  • p=quarantine — se DKIM e SPF falharem, mande pro spam (recomendado pra produção)
  • adkim=s — DKIM alignment estrito (domínio do header From DEVE bater com o domínio assinante)
  • aspf=s — SPF alignment estrito (idem pra SPF)

Começando do zero: use p=none nas primeiras semanas pra apenas monitorar sem afetar entrega. Depois evolua pra quarantine e eventualmente reject.

Per-user tracking subdomain

Tracking de open (pixel 1x1) e click (redirect) tradicionalmente usa subdomínio compartilhado da plataforma — todos os clientes do ESP "competem" pela mesma reputação de tracking. Se outro cliente abusar, sua reputação afunda junto.

O RaviMail isola via per-user tracking subdomain (S52b). Cada user ganha automaticamente i{userId}.ravimail.com.br com wildcard DNS+TLS. URLs de tracking ficam https://i42.ravimail.com.br/o/... (open) e https://i42.ravimail.com.br/c/... (click) — reputação por user.

Zero configuração sua. Subdomínio + cert wildcard são provisionados automaticamente no signup via Ravi DNS API. Auto-renovação do cert via Let's Encrypt + hook DNS-01.

From: transacional usa domain do nó

Pra emails transacionais (sem domínio próprio ainda verificado), o RaviMail monta o From com domain do nó (noreply@<nó>) e display "RaviMail" (S53). Garante DKIM/SPF/DMARC alinhados ao nó, reputação isolada por nó.

A central (ravimail.com.br) nunca aparece em DKIM/SPF/DMARC dos seus envios. Isso protege o domínio principal da plataforma e garante que sua reputação de envio não depende de nada que aconteça em outros usuários.

Pronto pra colocar em prática?

Cadastre seu domínio em Domínios → Adicionar. O painel gera os 3 TXT (DKIM + SPF + DMARC) com os valores exatos pro seu setup. Re-verificação automática a cada 5 minutos até propagar.