Início Tratando e removendo Emails do Postfix
André Stato 13 de setembro de 2018 Comente! Servidores
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.
echo "Usage: $0 <email adres>"
echo "Delete todos email com origem $EMAILADDY"
mailq | tail -n +2 | grep -v '^ *(' | awk -v "address=$EMAIL" 'BEGIN { RS = "" }
if ( $7 == address ) print $1
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.