Como faço para excluir permanentemente as mensagens de email da fila do sendmail e impedir que elas voltem?

18

Eu tenho um problema bastante irritante aqui. Estou testando um aplicativo e criei alguns e-mails de teste para endereços de e-mail falsos (sem mencionar que meu servidor não está realmente configurado para enviar e-mails). Obviamente, sendmailnão é possível enviar essas mensagens e elas estão ficando presas na sendmailfila. Desejo excluir manualmente as mensagens que foram acumuladas na fila em vez de aguardar os 5 dias que sendmailnormalmente levam para parar de tentar novamente.

Estou usando o Ubuntu 10.04 e /var/spool/mqueue/é o diretório em que todas as instruções que li dizem que os e-mails na fila são mantidos. Quando eu excluo os arquivos desse diretório, sendmailpara de tentar processar os emails até que o que parece ser um script cron seja executado e repovoe esse diretório com as mensagens que não quero que sejam enviadas. Aqui estão algumas linhas do meu syslog:

Jun  2 17:35:19 sajo-laptop sm-mta[9367]: o530SlbK009365: to=, ctladdr= (33/33), delay=00:06:27, xdelay=00:06:22, mailer=esmtp, pri=120418, relay=e.mx.mail.yahoo.com. [67.195.168.230], dsn=4.0.0, stat=Deferred: Connection timed out with e.mx.mail.yahoo.com.
Jun  2 17:35:48 sajo-laptop sm-mta[9149]: o4VHn3cw003597: to=, ctladdr= (33/33), delay=2+06:46:45, xdelay=00:34:12, mailer=esmtp, pri=3540649, relay=mx2.hotmail.com. [65.54.188.94], dsn=4.0.0, stat=Deferred: Connection timed out with mx2.hotmail.com.
Jun  2 17:39:02 sajo-laptop CRON[9510]: (root) CMD (  [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -type f -cmin +$(/usr/lib/php5/maxlifetime) -print0 | xargs -n 200 -r -0 rm)
Jun  2 17:39:43 sajo-laptop sm-mta[9372]: o52LHK4s007585: to=, ctladdr= (33/33), delay=03:22:18, xdelay=00:06:28, mailer=esmtp, pri=1470404, relay=c.mx.mail.yahoo.com. [206.190.54.127], dsn=4.0.0, stat=Deferred: Connection timed out with c.mx.mail.yahoo.com.
Jun  2 17:39:50 sajo-laptop sm-mta[9149]: o51I8ieV004377: to=, ctladdr= (33/33), delay=1+06:31:06, xdelay=00:03:57, mailer=esmtp, pri=6601668, relay=alt4.gmail-smtp-in.l.google.com. [74.125.79.114], dsn=4.0.0, stat=Deferred: Connection timed out with alt4.gmail-smtp-in.l.google.com.
Jun  2 17:40:01 sajo-laptop CRON[9523]: (smmsp) CMD (test -x /etc/init.d/sendmail && /usr/share/sendmail/sendmail cron-msp)

Alguém sabe como posso me livrar dessas mensagens permanentemente? Como observação, eu também gostaria de saber se existe uma maneira de configurar o sendmailenvio de email "falso". Existe?

Steven Oxley
fonte
Ainda não encontrei nenhuma solução para esse problema. Ele definitivamente parece que é algum tipo de script cron que está causando isso acontecer, mas eu não consigo descobrir onde ele está armazenando as mensagens na fila ...
Steven Oxley

Respostas:

28

As mensagens que foram enviadas ou estão tentando ser enviadas são armazenadas /var/spool/mqueue. As mensagens que o Sendmail ainda não tentou enfileirar podem ser encontradas em /var/spool/mqueue-client.

Então tente isso (presumo que você queira se livrar de todas as mensagens na fila):

  • Parar o sendmail
  • rm /var/spool/mqueue/*
  • Se você deseja remover as mensagens em espera rm /var/spool/mqueue-client/*,.
  • Iniciar o sendmail

Isso limpará nossas pastas de fila até que o sistema receba outra mensagem. Você pode verificar novamente executando mailq(ambas as pastas da fila) ou sendmail -bp(apenas a pasta da fila).

NOTA: Com a maioria das distribuições Linux, você pode iniciar / parar serviços com service sendmail <start|stop|restart>ou /etc/init.d/sendmail <start|stop|restart>. Ambas as opções têm muitos outros sinalizadores de status que podem ser observados digitando o comando e o serviço sem os sinalizadores de status.

pesado
fonte
Ele disse que já tinha feito isso, mas as mensagens re-apareceu ...
Massimo
11
Mas sem parar o sendmail primeiro, esse é o ponto.
weeheavy
Bem, parece que você pode ter atingido o degrau que eu perdi.
Steven Oxley
No Fedora 19, vejo / var / spool / clientmqueue (assim como / var / spool / mqueue)
TomG
Por alguma razão, mesmo com o sudo, isso não funcionaria para mim (diria no matches found). Então chmodeditei as pastas 777e pude excluir o conteúdo.
Sridhar Sarnobat
9

Você encontrará frequentemente a sugestão de remover arquivos do diretório de fila do Sendmail, por exemplo, rm /var/spool/mqueue/*ou pior ( rm -rfetc.). IMHO, isso é perigoso. Funcionará em muitos casos, mas recomendo apertar os cintos de segurança. Simplesmente remover todos os arquivos do mqueue pode excluir mensagens legítimas.

Parar o Sendmail antes de remover as mensagens na fila é um bom conselho, especialmente se for necessário remover muitas mensagens. No entanto, se apenas algumas mensagens forem removidas ou se a fila é limpa regularmente, por exemplo, por meio de um trabalho cron, não há realmente nenhuma necessidade de interromper o Sendmail. Na pior das hipóteses, uma das mensagens será colocada na fila de espera, que quase certamente será removida quando você tentar novamente.

Pelo contrário, interromper o Sendmail (por exemplo, no Ubuntu com service sendmail stop) pode não ser suficiente. Mesmo quando parado, alguns processos (filhos) ainda podem estar em execução. É preciso esperar até que eles terminem (recomendado) ou matá-los.

Para remover com segurança as mensagens da fila, você precisa dos IDs da fila de mensagens. Os IDs são mostrados no log após "sm-mta [...]:". Os IDs do seu trecho log são o530SlbK009365, o4VHn3cw003597, ... Para cada um dos IDs 2 arquivos são armazenados em mqueue, um começando com "QF", a outra partida com "df".

mailqgeralmente é usado para listar o conteúdo da fila. Ele mostra os IDs na primeira coluna. Além disso, você deve consultar mailqa saída, pois ela também mostra se uma mensagem está ativa / sendo processada no momento. Por exemplo

-----Q-ID----- --Size-- -----Q-Time----- ------------Sender/Recipient----------
oBDDuKAB023946*    1058 Mon Dec 13 14:56 <[email protected]
                 (Deferred: 450-4.2.1 The user you are trying to contact is re)
                                         <[email protected]>
oBAEMuV8000429     1058 Fri Dec 10 15:22 <[email protected]
                 (Deferred: 450-4.2.1 The user you are trying to contact is re)
                                         <[email protected]>

Neste exemplo, a mensagem com o ID oBDDuKAB023946está sendo processada no momento, mostrada pelo asterisco anexado. Outras mensagens são seguras para serem removidas. Por exemplo, para remover a mensagem com ID, oBAEMuV8000429use

rm /var/spool/mqueue/{d,q}foBAEMuV8000429

Uma abordagem mais versátil para remover mensagens em fila é fornecida por Brandon Hutchinson em Excluindo emails da fila de emails . Brandon também inclui scripts para remover mensagens com base na parte do domínio, endereço de email etc. Os scripts de Brandon são muito úteis para limpeza regular ou remoção em massa.

No entanto, nem os scripts de Brandon estão cuidando do status das mensagens. No entanto, é fácil adicionar. Incluir no início de seus scripts

# Get current mailq status
my $mailq = `mailq`;

Em seguida, no início da sub-rotina "desejado", adicione uma verificação para pular as mensagens ativas, por exemplo, com

# skip if file is currently processed by MTA
if ($mailq =~ /\n$queue_id\*/) {
   $debug && print "$queue_id is locked.\n";
   last;
}

HTH. E lembre-se de fazer backups :-)

xebeche
fonte
4

Eu tive esse mesmo problema e descobri que havia 2 pastas com mensagens na fila. A pasta / var / spool / clientmqueue / tinha mensagens que estavam terminando em / var / spool / mqueue / se elas falharem na entrega. A exclusão dos arquivos das duas pastas era necessária para resolver o problema.

rm -f / var / spool / clientmqueue / * rm -f / var / spool / mqueue / *


fonte
0

Eu não acho que este seja o trabalho de um script cron, é mais provável que seja um problema de aplicativo ou algo relacionado ao sendmail; de qualquer forma, para descartar qualquer tarefa cron, você pode parar crondum pouco e ver se isso continua acontecendo.

Massimo
fonte
0

Eu consegui fazer isso usando este script bash

for i in `sudo ls /var/spool/mqueue`
do
    sudo rm -rv `echo /var/spool/mqueue/$i`
done
Shu Hikari
fonte
Então, você abre um subshell apenas para chamar echoe recuperar a saída do dito echopara uso como parâmetro para rm. Mesmo ignorando os garfos gratuitos de sudoe rm, esse subconjunto é um grande desperdício.
Felix Frank
Bem, se você tiver uma solução mais 'aceitável', não será uma perda de tempo explicar sua solução, em vez de apenas mostrar o quão inútil um comentário pode ser. Agradecemos antecipadamente
Shu Hikari
2
Desculpe se isso foi ofensivo e arrogante. Uma abordagem mais econômica seria sudo find /var/spool/mqueue -maxdepth 1 -delete. Eu achei importante salientar o que é problemático em particular no seu script. Desculpas pela falta de tato.
Felix Frank
2
Sim, mas agora você explicou seu ponto de vista e eu entendi completamente. E desculpas aceitas, não se preocupe. Obrigado: D
Shu Hikari