Postfix + Spamassassin: apagando emails marcados como SPAM

Após um periodo de execução do Spamassassin, percebemos que ele esta marcando as mensagens de Spam corretamente, podemos então querer excluir essas mensagens antes de cair para o usuário, ou redirecioná-las para outra pasta “.Spam” por exemplo caso use Imap com Maildir.

O Spamassassin nativamente não apaga os emails marcados como SPAM.
Podemos excluir ou fazer outra ação com o E-mail criando um próprio script para verificar o conteúdo das mensagens.
Abaixo segue um script para filtrar as mensagens com o postfix e o spamassassin.

Foi testado no Debian Squeeze 6.0.4 , Postfix 2.7.1 e Spamassassin 3.3.1

Criando o script

Crie o arquivo /bin/spamchk com o seguinte conteudo:

#!/bin/sh
# -----------------------------------------------------------------
# File:        spamchk
# Purpose:     SPAMASSASIN shell-based filter
# Location:    /usr/local/bin
# Usage:       Call this script from master.cf (Postfix)
# -----------------------------------------------------------------
# Variables
SENDMAIL="/usr/sbin/sendmail -i"
EGREP=/bin/egrep
TMPDIR=/var/tmp
# Exit codes from 
EX_UNAVAILABLE=69

# Number of *'s in X-Spam-level header needed to sideline message:
# (Eg. Score of 5.5 = "*****" )
SPAMLIMIT=6

# Clean up when done or when aborting.
trap "rm -f $TMPDIR/out.$$" 0 1 2 3 15

# Pipe message to spamc
cat | /usr/bin/spamc -u filter | sed 's/^\.$/../' > $TMPDIR/out.$$

# Are there more than $SPAMLIMIT stars in X-Spam-Level header? :
if $EGREP -q "^X-Spam-Level: \*{$SPAMLIMIT,}" < $TMPDIR/out.$$
then
  # Option 1: Move high scoring messages to sideline dir so
  # a human can look at them later:
  # mv out.$$ $SIDELINE_DIR/`date +%Y-%m-%d_%R`-$$

  # Option 2: Divert to an alternate e-mail address:
  #$SENDMAIL xyz@xxxx.xx < $TMPDIR/out.$$

  # Option 3: Delete the message
   rm -f $TMPDIR/out.$$
else
  $SENDMAIL "$@" < $TMPDIR/out.$$
fi

# Postfix returns the exit status of the Postfix sendmail command.
exit $?

Adicionando usuário e mudando a permissão para executar o script

Adicione o usuário e grupo filter:

groupadd -g 500 filter
useradd -u 500 -g 500 -d /home/filter -s /bin/false filter
chmod +x /bin/spamchk
chown filter.filter /bin/spamchk

Configurando o Postfix:

Modifique a linha do smtp no arquivo de configuração master.cf:

smtp      inet  n       -       n       -       -       smtpd -o content_filter=spamchk:dummy

Crie um transporte chamado spamchk no arquivo de configuração master.cf:

spamchk   unix  -       n       n       -       10      pipe flags=Rq user=filter argv=/bin/spamchk -f ${sender} ${recipient}

Concluindo

Recarrege as configurações do postfix:

service postfix reload

Faça os testes com mensagens que eram identificadas como SPAM e fique atento aos logs para ver se tudo esta certo:

tail -f /var/log/mail.lof

Jul 17 16:01:09 maximahost spamd[31927]: spamd: setuid to filter succeeded
Jul 17 16:01:09 maximahost spamd[31927]: spamd: processing message <222d9127-cb72-4a48-85b0-d09a92a3a361@xtnvmta1309.xt.local> for filter:500
Jul 17 16:01:11 maximahost spamd[28310]: spamd: identified spam (7.4/6.0) for filter:500 in 3.6 seconds, 10485 bytes.
Jul 17 16:01:11 maximahost spamd[28310]: spamd: result: Y 7 - ADVANCE_FEE_2,ADVANCE_FEE_3,BAYES_00,FILL_THIS_FORM_LONG,FREEMAIL_FROM,HTML_MESSAGE,RCVD_IN_DNSWL_LOW,SPF_PASS,T_FILL_THIS_FORM,T_LOTS_OF_MONEY,US_DOLLARS_3 scantime=3.6,size=10485,user=filter,uid=500,required_score=6.0,rhost=localhost,raddr=127.0.0.1,rport=58593,mid=,bayes=0.000000,autolearn=no

Jul 17 15:55:51 maximahost postfix/pipe[3812]: 5F14F9802F8: to=, relay=spamchk, delay=5.4, delays=1.8/0/0/3.6, dsn=2.0.0, status=sent (delivered via spamchk service)
Jul 17 15:55:51 maximahost postfix/qmgr[32767]: 5F14F9802F8: removed

Referências:
http://www.postfix.org/FILTER_README.html
http://www.akadia.com/services/postfix_spamassassin.html

Deixe uma resposta

Or