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).
| Bucket | Domínios incluídos | Comportamento |
|---|---|---|
| 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 warmup | gmail / microsoft | yahoo / icloud / other |
|---|---|---|
| Dia 1-3 | 2.0% | 3.0% |
| Dia 4-6 | 2.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
/infrastructuremostra 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?
| Tipo | DSN típico | Significado | Açã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 permanenteinvalid— 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
- Yahoo CFL (Complaint Feedback Loop) — pipeline ARF ativo desde S50. Cadastro manual obrigatório em senders.yahooinc.com.
- Gmail — não tem FBL público. Use Postmaster Tools pra ver spam rate agregado.
- Microsoft SNDS / JMRP — telemetria de IP, não ARF clássico. sendersupport.olc.protection.outlook.com.
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ão | O que prova | Como |
|---|---|---|
| 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 ~allConflito 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.