Fila alta no Exim não é só problema de volume. Pode ser indício de conta comprometida, script malicioso, destino recusando autenticação ou degradação de reputação do IP.
Neste runbook, o foco é: investigar primeiro, remover depois. Isso evita apagar mensagem legítima no pânico e preserva evidência para correção definitiva.
0) Erro conceitual que derruba troubleshooting
Muita gente tenta operar a fila por endereço e tropeça logo no início.
Exemplo clássico (incorreto):
exim -Mvh silvana@domain.com
Os comandos -Mvh, -Mvb e -Mrm não aceitam endereço. Eles exigem Message-ID (ex.: 1tXyZ-0004p-2A).
Por isso o exiqgrep é a ponte certa entre e-mail e ID:
- destinatário:
exiqgrep -i -r silvana@domain.com - remetente:
exiqgrep -i -f silvana@domain.com
Sem o -i, a saída vem com metadados extras e quebra automação por pipe.
1) Triagem inicial da fila
1.1 Volume e estado geral
exim -bp
exim -bp | exiqsumm
1.2 Quantidade total de mensagens
exim -bpc
1.3 Separar mensagens congeladas
exiqgrep -z -i
Se a fila tem muito frozen , geralmente há bounce loop, destino inexistente ou envio abusivo bloqueado repetidamente.
2) Inspeção forense por ID antes de remover
Com ID da mensagem:
exim -Mvh ID_DA_MENSAGEM # headers
exim -Mvb ID_DA_MENSAGEM # body
exim -Mvl ID_DA_MENSAGEM # log detalhado da mensagem
Pontos que eu sempre valido:
- remetente real (
Return-PatheFrom); - rota (
Received) e host de origem; - motivo da retenção (timeout, auth fail, SPF, RBL, quota, destino inválido);
- padrão repetitivo em múltiplas mensagens.
3) Limpeza seletiva (cirúrgica)
3.1 Remover por remetente
exiqgrep -i -f 'user@domain.com' | xargs -r exim -Mrm
3.2 Remover por destinatário
exiqgrep -i -r 'target@otherdomain.com' | xargs -r exim -Mrm
3.3 Remover apenas congeladas
exiqgrep -z -i | xargs -r exim -Mrm
3.4 Reprocessar fila sem remover (quando necessário)
exim -qff
3.5 Limpeza por idade (bounce eterno / retry antigo)
Remover mensagens mais antigas que 7 dias (604800 segundos):
exiqgrep -i -o 604800 | xargs -r exim -Mrm
Esse filtro é útil quando há cauda antiga travando a operação, sem tocar em mensagens recentes ainda válidas.
3.6 Emergência total (somente quando validado)
Se fila estiver comprometida ao ponto de risco operacional:
exiqgrep -i | xargs -r exim -Mrm
Antes da execução, rode:
exim -bp | exiqsumm
para confirmar volume por domínio e evitar apagar tráfego legítimo por impulso.
4) Padrões de incidente que encontrei em produção
- Plugin WordPress comprometido disparando spam via
mail(). - Conta SMTP vazada enviando por script externo.
- Destino bloqueando por RBL e acumulando retry.
- Domínio com DNS quebrado causando defers contínuos.
Comandos de apoio para investigação:
grep -i "cwd=/home" /var/log/exim_mainlog | tail -n 200
grep -i "A=dovecot_login" /var/log/exim_mainlog | tail -n 200
grep -i "rejected\|blacklist\|spam" /var/log/exim_mainlog | tail -n 200
grep 'silvana@domain.com' /var/log/exim_mainlog | tail -n 20
5) Prevenção de recorrência no WHM/cPanel
5.1 Limite por domínio (global)
WHM > Tweak Settings > Mail > Max hourly emails per domain
5.2 Limite por conta
WHM > Modify an Account > Resource Limits > Maximum Hourly Email by Domain Relayed
5.3 Sinais de hardening que implementei
- bloqueio de função
mail()em apps não confiáveis; - revisão de credenciais SMTP e rotação de senha;
- MFA nos acessos administrativos;
- scan de malware em
public_htmle cronjobs de usuários.
6) Checklist pós-incidente (aceite)
- fila estabilizada abaixo do baseline definido;
- sem crescimento anômalo por 24h;
- origem do abuso identificada e bloqueada;
- limites de envio aplicados;
- reputação do IP monitorada em RBLs.
Gerenciar fila Exim em produção não é comando único de limpeza. É processo de triagem, evidência, ação seletiva e prevenção. Esse método reduz reincidência e preserva entregabilidade dos e-mails legítimos.
Este post está licenciado sob CC BY-NC.
Comentários
Participe da discussão abaixo.
Comentários ainda não configurados. Adicione as opções do Cusdis em /assets/json/config/blog-comments-config.json.