Pour se faire il faut tout d'abord installer spamassassin:

apt-get install spamassassin

Ensuite, partons éditer /etc/postfix/master.cf:

smtp      inet  n       -       -       -       -       smtpd

Vous devrez ajouter le filtre à ce niveau. Ceci aura pour conséquence d'indiquer au serveur smtp de passer tout mail entrant par un filtre. Cela donnera donc:

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

En fin de fichier, ajoutez la directive suivante:

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

Postfix est donc prêt à gérer le filtre.

Nous allons donc ensuite configurer le script qui va gérer ce filtre. Pour cela, il faut créer un fichier /usr/local/bin/spamchk:

#!/bin/sh

# -
# File:        spamchk
#
# Purpose:     SPAMASSASIN shell-based filter
#
# Location:    /usr/local/bin
#
# Usage:       Call this script from master.cf (Postfix)
#
# Certified:   GENTOO Linux, Spamassassin 3.0, Postfix
# -

# Variables
SENDMAIL="/usr/sbin/sendmail -i"
EGREP=/bin/egrep

# Exit codes from <sysexits.h>
EX_UNAVAILABLE=69

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

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

# Pipe message to spamc
cat | /usr/bin/spamc -u nobody > /tmp/out.$$

# Are there more than $SPAMLIMIT stars in X-Spam-Level header? :
if $EGREP -q "^X-Spam-Level: \*{$SPAMLIMIT,}" < /tmp/out.$$
then
  # Option 1: Move high scoring messages to sideline dir so
  # a human can look at them later:
  # mv out.[1]

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

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

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

Dans cette configuration, tout mail considéré comme spam avec un niveau égal ou supérieur à 5 sera supprimé.

Ne pas oublier de rendre exécutable ce script:

chmod +x /usr/local/bin/spamchk

Il faut maintenant éditer le fichier /etc/default/spamassassin pour mettre les options suivantes:

OPTIONS="--nouser-config --max-children 5 --helper-home-dir"

Rafraîchir la configuration postfix:

postfix reload

Le tour est joué. Exemple de logs (piochés dans /var/log/mail.info indiquant que c'est fonctionnel):

  • Avec spam (donc suppression du mail)
Jul 17 18:46:50 sdxxx postfix/smtpd27083: connect from smtp.sivit.org194.146.224.121
Jul 17 18:46:50 sdxxx postfix/smtpd27083: C7A96142FD: client=smtp.sivit.org194.146.224.121
Jul 17 18:46:50 sdxxx postfix/cleanup27089: C7A96142FD: message-id=<469CF27A.1030107@sivit.fr>
Jul 17 18:46:50 sdxxx postfix/qmgr15184: C7A96142FD: from=<xxx@sivit.fr>, size=831, nrcpt=1 (queue active)
Jul 17 18:46:50 sdxxx postfix/smtpd27083: disconnect from smtp.sivit.org194.146.224.121
Jul 17 18:46:51 sdxxx spamd20281: connection from localhost 127.0.0.1 at port 1436 
Jul 17 18:46:51 sdxxx spamd20281: info: setuid to nobody succeeded 
Jul 17 18:46:52 sdxxx spamd20281: processing message <469CF27A.1030107@sivit.fr> for nobody:65534. 
Jul 17 18:46:53 sdxxx spamd20281: identified spam (1001.1/5.0) for nobody:65534 in 2.8 seconds, 842 bytes. 
Jul 17 18:46:53 sdxxx spamd20281: result: Y 1001 - BLANK_LINES_70_80,GTUBE scantime=2.8,size=842,mid=<469CF27A.1030107@sivit.fr>,autolearn=no 
Jul 17 18:46:53 sdxxx postfix/pipe27091: C7A96142FD: to=<destinataire@domaine.com>, relay=spamchk, delay=3, status=sent (sdxxx.sivit.org)
Jul 17 18:46:53 sdxxx postfix/qmgr15184: C7A96142FD: removed
  • Sans spam (livraison du mail au destinataire)
Jul 17 18:45:25 sdxxx postfix/smtpd27083: connect from smtp.sivit.org194.146.224.121
Jul 17 18:45:25 sdxxx postfix/smtpd27083: 7E7C6142FD: client=smtp.sivit.org194.146.224.121
Jul 17 18:45:25 sdxxx postfix/cleanup27089: 7E7C6142FD: message-id=<469CF224.6010806@sivit.fr>
Jul 17 18:45:25 sdxxx postfix/qmgr15184: 7E7C6142FD: from=<xxx@sivit.fr>, size=761, nrcpt=1 (queue active)
Jul 17 18:45:25 sdxxx postfix/smtpd27083: disconnect from smtp.sivit.org194.146.224.121
Jul 17 18:45:28 sdxxx spamd25290: connection from localhost 127.0.0.1 at port 4374 
Jul 17 18:45:28 sdxxx spamd25290: info: setuid to nobody succeeded 
Jul 17 18:45:32 sdxxx spamd25290: processing message <469CF224.6010806@sivit.fr> for nobody:65534. 
Jul 17 18:45:37 sdxxx spamd25290: clean message (0.0/5.0) for nobody:65534 in 10.9 seconds, 775 bytes. 
Jul 17 18:45:37 sdxxx spamd25290: result: .  0 -  scantime=10.9,size=775,mid=<469CF224.6010806@sivit.fr>,autolearn=failed 
Jul 17 18:45:38 sdxxx postfix/pipe27091: 7E7C6142FD: to=<destinataire@domaine.com>, relay=spamchk, delay=13, status=sent (sdxxx.sivit.org)
Jul 17 18:45:38 sdxxx postfix/qmgr15184: 7E7C6142FD: removed
Jul 17 18:45:38 sdxxx postfix/pickup27045: AE40014317: uid=65534 from=<xxx@sivit.fr>
Jul 17 18:45:38 sdxxx postfix/cleanup27089: AE40014317: message-id=<469CF224.6010806@sivit.fr>
Jul 17 18:45:38 sdxxx postfix/qmgr15184: AE40014317: from=<xxx@sivit.fr>, size=1058, nrcpt=1 (queue active)
Jul 17 18:45:39 sdxxx postfix/virtual27099: AE40014317: to=<destinataire@domaine.com>, relay=virtual, delay=1, status=sent (delivered to maildir)
Jul 17 18:45:39 sdxxx postfix/qmgr15184: AE40014317: removed

Vous noterez la différence entre les 2 logs, l'un le mail est 'delivered to maildir' (non spam), tandis que l'autre est tout simplement 'removed'

Notes

[1] $SIDELINE_DIR/`date +%Y-%m-%d_%R`-