Como contornar o limite global de e-mails no cPanel e CloudLinux: resolvendo o erro XID psafa9
Voltar para blog

Como contornar o limite global de e-mails no cPanel e CloudLinux: resolvendo o erro XID psafa9

24/10/2026 · 7 min · Infraestrutura

Em servidores compartilhados ou VPS com cPanel e CloudLinux, é muito comum definir um teto preventivo para disparos de mensagens. No menu Tweak Settings do WHM, podemos configurar, por exemplo, o parâmetro Max hourly emails per domain para 500 mensagens por hora. Essa trava serve para conter disparos em massa acidentais ou abusos provocados por contas comprometidas.

O problema aparece quando um cliente específico precisa de uma cota maior, como 1000 e-mails por hora, para transações legítimas ou notificações de e-commerce.

Ao tentar editar o pacote ou a conta diretamente pelo painel web do WHM, a interface recusa a alteração com o seguinte erro:

(XID psafa9) The value “1000” exceeds the server-wide limit of “500” set in Tweak Settings interface for “Max hourly emails per domain”.

Neste artigo, vamos entender como essa validação funciona nos bastidores, como aplicar a cota desejada diretamente no sistema de arquivos e como auditar o comportamento do servidor de e-mail sem abrir brechas de entrega.


1. Por que o erro XID psafa9 acontece no WHM#

Camada visual em perl versus o motor real de entrega em c#

A interface administrativa do cPanel e do WHM é desenvolvida em grande parte em Perl. Quando você submete uma alteração de pacote ou conta pelo navegador, módulos internos (como Whostmgr::Packages) realizam uma checagem de consistência.

O script lê o arquivo global /var/cpanel/cpanel.config, extrai a chave maxemailsperhour e compara o valor com o que foi digitado no formulário. Se o valor solicitado for maior do que o limite global, o script interrompe a execução com um die() e devolve a mensagem de erro XID psafa9 na tela.

O propósito dessa trava na interface é puramente administrativo: impedir que revendedores com acesso à criação de planos definam limites arbitrários que sobrecarreguem a fila de mensagens do servidor.

No entanto, o mecanismo que de fato entrega as mensagens, o Exim (escrito em C), não consulta a interface do WHM no momento do envio. Quando uma mensagem é enfileirada no sistema operacional, as regras de controle de acesso (ACLs) do Exim em /etc/exim.conf buscam os limites em um local individual: o arquivo de metadados da própria conta.


2. Ajuste manual no sistema de arquivos e armadilhas no terminal#

Para conceder os 1000 envios por hora a uma conta sem mexer na regra global do servidor, basta editar o arquivo de metadados do usuário em texto puro:

/var/cpanel/users/nome_do_usuario

O erro comum ao tentar usar sed com aspas simples#

Uma tentativa comum de automação no terminal é rodar um comando sed direto para substituir o valor:

# Exemplo com erro de sintaxe
TOTAL="1000" && sed -i 's/MAX_EMAIL_PER_HOUR=/MAX_EMAIL_PER_HOUR=$TOTAL/'g /var/cpanel/users/usuario

Esse comando falha por dois motivos:

  1. Aspas simples impedem a expansão de variáveis: no Bash, qualquer expressão entre aspas simples (' ') é tratada literalmente. O shell não substitui $TOTAL pelo número 1000. O arquivo passa a conter a string literal MAX_EMAIL_PER_HOUR=$TOTAL. Quando o cPanel tenta converter esse valor para número inteiro, a leitura resulta em zero ou nulo, bloqueando completamente os disparos da conta.
  2. Substituição sem âncora de linha: a expressão s/MAX_EMAIL_PER_HOUR=/.../ substitui apenas o nome da chave. Se o arquivo já tiver o valor 500, o resultado gravado no disco será MAX_EMAIL_PER_HOUR=1000500.

Como alterar o arquivo do usuário com segurança no shell#

O procedimento correto exige aspas duplas para permitir a expansão da variável e uma expressão regular ancorada no início da linha (^):

Caso 1: A chave já existe no arquivo

TOTAL="1000"
sed -i "s/^MAX_EMAIL_PER_HOUR=.*/MAX_EMAIL_PER_HOUR=$TOTAL/" /var/cpanel/users/usuario

Caso 2: A chave ainda não existe (conta usando o padrão global)

Se a conta nunca teve um limite personalizado, a linha MAX_EMAIL_PER_HOUR nem sequer constará no arquivo. O script defensivo abaixo verifica a existência da chave antes de decidir entre atualizar ou anexar a linha:

TOTAL="1000"
USER="usuario"

if ! grep -q "^MAX_EMAIL_PER_HOUR=" "/var/cpanel/users/$USER"; then
    echo "MAX_EMAIL_PER_HOUR=$TOTAL" >> "/var/cpanel/users/$USER"
else
    sed -i "s/^MAX_EMAIL_PER_HOUR=.*/MAX_EMAIL_PER_HOUR=$TOTAL/" "/var/cpanel/users/$USER"
fi

3. Sincronização de estado com o ecossistema do cPanel#

O papel do script updateuserdomains#

Apenas salvar o arquivo no disco não altera o comportamento imediato do servidor. Para não sobrecarregar o disco com operações constantes de leitura (stat), os serviços do cPanel (cpanellogd, queueprocd e o próprio exim) utilizam bancos indexados em Berkeley DB (.db) e estruturas em cache.

Para que a nova cota passe a valer, é obrigatório recompilar esses mapas com o utilitário oficial:

/usr/local/cpanel/scripts/updateuserdomains

Esse script processa todos os arquivos em /var/cpanel/users/, atualiza /etc/userdomains e /etc/trueuserdomains, sincroniza as pastas em /var/cpanel/userdata/ e emite sinais locais para os daemons recarregarem suas tabelas em memória.

Cuidados com sincronizações automáticas de pacotes#

Se no futuro alguém editar o plano da conta diretamente pelo WHM, o painel reconstruirá o arquivo /var/cpanel/users/usuario com base nas configurações do pacote, revertendo o limite personalizado de volta para o padrão.

Para evitar que isso aconteça:


4. Interações com o CloudLinux, LVE e governadores#

Em servidores rodando CloudLinux, os disparos originados por scripts PHP (como o wp_mail do WordPress ou sistemas de boletins informativos) passam pelo isolamento do LVE (Lightweight Virtual Environment).

Dois pontos merecem atenção quando uma conta começa a enviar volumes maiores de mensagens:

Limites de processos simultâneos no envio por PHP#

Se o script tentar abrir dezenas de conexões concorrentes para despachar mensagens de uma vez, a conta pode bater no limite de processos simultâneos (Entry Processes ou Number of Processes).

Para auditar se a conta está sofrendo bloqueios de processos:

lveinfo --user usuario --period 1h

Analise as colunas fEP (falhas de Entry Processes) e fNPROC (falhas de total de processos). Se houver números diferentes de zero, o script de e-mail está sendo estrangulado pelo kernel antes mesmo de falar com o Exim.

Consultas ao banco de dados e o MySQL governor#

Sistemas de envio em massa costumam consultar tabelas com milhares de contatos. Se essas consultas forem lentas ou não utilizarem índices adequados, o db_governor do CloudLinux colocará os processos da conta em fila de espera para poupar o restante do servidor.

Para verificar o estado do usuário no governador do banco:

dbgovctl --status usuario

5. Auditoria e validação da entrega de e-mails em tempo real#

Depois de editar o arquivo e rodar a sincronização, é recomendável checar se o sistema está realmente aceitando o novo volume de mensagens.

Acompanhando o diretório de contagem horária do cPanel#

O cPanel armazena o histórico do volume enviado em uma estrutura própria de arquivos de contagem:

ls -lah /var/cpanel/email_send_limits/track/dominio.com.br/

Cada envio gera registros dentro dessa pasta, permitindo ver quantas mensagens foram despachadas na janela atual de uma hora.

Registros de transação do Exim#

Para acompanhar o tráfego do domínio e conferir se nenhuma mensagem está sendo recusada por estouro de cota:

tail -f /var/log/exim_mainlog /var/log/exim_rejectlog | grep "dominio.com.br"

Se o limite tiver sido ultrapassado, o Exim registrará mensagens informando que o domínio excedeu a quantidade máxima permitida por hora.

Investigando chamadas de sistema com strace#

Se restar qualquer dúvida sobre qual arquivo o Exim está consultando durante o roteamento, podemos rastrear as chamadas de sistema simulando a entrega de um endereço:

strace -f -e trace=open,openat,stat,read exim -bt [email protected] 2>&1 | grep "usuario"

Na saída do comando, procure pela chamada openat ou stat acessando /var/cpanel/users/usuario. Isso confirma que o binário leu o arquivo de configuração correto e vinculou a cota ajustada na memória.

Monitorando a fila de mensagens do Exim#

Para checar se mensagens estão acumulando na fila do servidor:

# Exibe a contagem total de mensagens na fila
exim -bpc

# Lista as mensagens pertencentes ao usuario que possam estar retidas
exim -bp | grep "usuario"

6. Boas práticas para manter a reputação do servidor estável#

Permitir envios acima da média para contas específicas é perfeitamente viável, mas exige disciplina na administração do servidor:

  1. Monitore a taxa de rejeições (bounces): contas autorizadas a disparar volumes maiores devem manter listas de e-mails limpas. Uma taxa de erros acima de 5% pode manchar a reputação do IP do servidor perante grandes provedores.
  2. Utilize autenticação completa de e-mail: certifique-se de que o domínio possui registros SPF, DKIM e DMARC devidamente configurados antes de autorizar o aumento do volume de saída.
  3. Considere um serviço de relay externo para volumes elevados: se a conta precisar enviar mais de 5.000 ou 10.000 mensagens por hora com frequência, o caminho mais saudável para o servidor compartilhado é rotear esses envios por um smarthost dedicado (como SendGrid, Mailgun ou Amazon SES), preservando o IP principal para a comunicação do dia a dia dos demais clientes.

Este artigo foi útil?

Deixe uma reação rápida para apoiar o conteúdo:

CC BY-NC

Este post está licenciado sob CC BY-NC.

Comentários

Participe da discussão abaixo.

0 comentários