Como faço para excluir permanentemente mensagens de email na fila do sendmail e impedi-las de voltar?

17

Eu tenho um problema muito chato aqui. Eu testei 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-mail de qualquer maneira). Obviamente, sendmail não é capaz de enviar essas mensagens e elas ficaram presas na fila sendmail . Desejo excluir manualmente as mensagens que estão sendo criadas na fila, em vez de esperar os 5 dias que o sendmail normalmente leva para parar de tentar novamente.

Estou usando o Ubuntu 10.04 e /var/spool/mqueue/ é o diretório no qual todos os procedimentos que lemos dizem que os e-mails enfileirados são mantidos. Quando eu apago os arquivos neste diretório, sendmail pára de tentar processar os e-mails até que o que parece ser um script cron é executado e re-preenche esse diretório com as mensagens que eu 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? Além disso, gostaria de saber se existe uma maneira de configurar sendmail para "falso" envio de e-mail. Existe?

    
por Steven Oxley 03.06.2010 / 02:51

5 respostas

25

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

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

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

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

NOTA: Com a maioria das distribuições do 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 flags de status que podem ser observados digitando o comando e o serviço sem os flags de status.

    
por 09.06.2010 / 15:31
9

Você encontrará frequentemente a sugestão para remover arquivos do diretório de mensagens do Sendmail com, por exemplo, rm /var/spool/mqueue/* ou pior ( rm -rf etc.). IMHO, isso é simplesmente perigoso. Ele vai funcionar em muitos casos, mas eu recomendo apertar seus cintos de segurança. A simples remoção de todos os arquivos do mqueue pode excluir mensagens legítimas.

Parar o Sendmail antes de remover mensagens na fila é um bom conselho, especialmente se muitas mensagens precisarem ser removidas. No entanto, se apenas algumas mensagens forem removidas ou se a fila for limpa regularmente, p. por meio de um cron job, não há necessidade de parar o Sendmail. No pior dos casos, uma das mensagens será enfileirada novamente, o que quase certamente será removido quando você tentar novamente.

Ao contrário, parar 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. Um teria que esperar até que terminassem (recomendado) ou os matasse.

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

mailq é geralmente usado para listar o conteúdo da fila. Mostra os IDs na primeira coluna. Além disso, você deve consultar a saída de mailq porque também mostra se uma mensagem está ativa / sendo processada atualmente. 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 ID oBDDuKAB023946 está sendo processada atualmente, mostrada pelo asterisco anexado. Outras mensagens estão seguras para serem removidas. Por exemplo, para remover a mensagem com ID oBAEMuV8000429 use

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

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

Mesmo assim, os scripts de Brandon não 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 "desejada", adicione um cheque para ignorar 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: -)

    
por 13.12.2010 / 17:36
4

Eu tive esse mesmo problema e descobri que havia duas pastas com mensagens na fila. A pasta / var / spool / clientmqueue / tinha mensagens que estavam terminando em / var / spool / mqueue / se elas não pudessem ser entregues. A exclusão dos arquivos de ambas as pastas era necessária para solucionar o problema.

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

    
por 09.07.2010 / 13:11
0

Eu não acho que este é o trabalho de um script cron, é mais provável que seja um problema de aplicativo, ou algo relacionado ao próprio sendmail; De qualquer forma, para descartar qualquer trabalho cron fazendo isso, você pode simplesmente parar crond por um tempo e ver se isso continua acontecendo.

    
por 09.06.2010 / 15:35
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
    
por 16.06.2014 / 19:39