Você está na página 1de 3

Muitas vezes temos que deletar e-mails específicos da nossa fila do servidor.

Podendo
ser um Postfix ou outra Servidor qualquer.

Neste contexto estarei falando do Postfix.

Sabemos que o comando mailq consulta nossa fila, bem como o comando postsuper
gerencia a fila de e-mail, fazendo reenvio, deleção, entre outros. O grande problema do
postsuper é sua limitação, pois podemos deletar a fila toda (superpost –d ALL) ou email
através do ID destes (postsuper –d EAD00151DFE6). Mas não permite que especificassem,
por exemplo, uma origem ou destino.

Bem, neste Post veremos como podemos deletar determinados e-mails com uso de
pipeline de comandos no Shell. Através do uso de alguns comandos com awk, mailq e mais
alguns.

Primeiro devemos ver como funciona o comando de consulta da fila de mensagens que
é o mailq.

Podemos ver vários campos, o primeiro campo é o ID da mensagem, é o que usamos


normalmente para gerenciar essa mensagem, seja para deletar, pausar, reenviar e etc

Uma junção dos comandos mail, grep, awk irá nos trazer a informação que precisamos.

mailq | tail –n +2 | grep –v ‘^*(‘ | awk –v “address=email@deletar” ‘BEGIN { RS == “” } { if


( $7 == address) print $1’

Esse comando extenso e complexo, irá nos trazer o ID das mensagens de origem de
email@deletar. Tendo esses ID podemos usar o xargs para passar o comando de deleção, ou
passar diretamente para o postsuper.

Mas acredito que seja mais simples, um uso do grep diretamente para filtrar o email,
ao invés do awk.

mailq | grep email@deletar | grep –v ‘^*|(‘ | awk ‘{print $1}’

Com isso filtramos os e-mails que contenham email@deletar tanto na origem como no
destino. Se for crucial trazer somente origem, o primeiro comando é o suficiente.
Após todo esse filtro, podemos usar simples postsuper –d – ao final do comando para
deletarmos os e-mails especificado. O mesmo serve para e-mail com erro MAILER DAEMON.

Para facilitar nossa vida podemos então criar um script, que irá apagar o que
desejarmos.

#!/bin/bash
EMAIL=$1

if [ -z "$EMAIL" ]
then
echo "Usage: $0 <email adres>"
exit
fi

echo "Delete todos email com origem $EMAILADDY"

mailq | tail -n +2 | grep -v '^ *(' | awk -v "address=$EMAIL" 'BEGIN { RS = "" }


{
# outros exemplos e condições:
if ( $7 == address )
print $1
}
' | tr -d '*!' | postsuper -d -

E para executarmos basta rodar:

./deletar-email.sh joao@stato.blog.br

Desta forma estaríamos excluindo todos os e-mails que foram enviados por
joao@stato.blog.br.

Podemos também deletar de outras forma, indo direto na fila em /var/spool/postfix.


Imagine temos que deletar mensagens de um endereço especifico, como no caso acima. Um
find fará a busca, o grep o filtro e por fim teremos que trazer o id desta mensagem, para isso
usará o sed, e por fim o postsuper para deletar.

find /var/spool/postfix –type f | xargs –n 1000 grep email@dominio.com.br | sed


‘s/.*\///g’ | awk ‘{ print $2}’ | postsuper –d -

Parece complicado, mas não é. O find busca por arquivos comuns, o xargs pega os
arquivos achados e passa o grep filtrar pelo e-mail procurado, o sed remove toda linha até
encontrar o ID do e-mail (.*\/ igual qualquer caractere e uma barra) e por fim sobram dois
campos o e-mail e o restante a palavra matches. Então o awk remove a segunda coluna que
por sua vez envia para o postsuper deletar.

Desta forma também é possível remover e-mail de um determinado domínio,


informando apenas o domínio, ao invés do e-mail especifico.

find /var/spool/postfix –type f | xargs –n 1000 grep dominio.com.br | sed ‘s/.*\///g’ | awk
‘{ print $2}’ | postsuper –d -

Também é possível usar todo esse conceito com o zimbra, já que o mesmo
normalmente usa o postfix para envio de mensagens.

Espero que aproveitem, e até a próxima.

Você também pode gostar