Mise en place de DSPAM comme agent de livraison pour Postfix

2009-06-13
Thomas Martin


DSPAM est un logiciel anti-spam pouvant aisément être utilisé comme agent de livraison Postfix. Cela évite d'utiliser certains hacks, comme la réinjection SMTP. Dans ce mode, DSPAM agit comme un relai qui accepte un mail sur son entrée standard, le traite en fonction de votre configuration (ajout d'en-têtes, préfixage de [SPAM] au sujet, etc), et le délivre à un agent de livraison final (directive TrustedDeliveryAgent dans dspam.conf).

Pour cela il suffit d'ajouter une ligne de ce type à votre master.cf :

dspam unix - n n - 1 pipe flags=DORqhu user=dspam:mail argv=/usr/local/bin/dspam-wrapper --user ${recipient} --deliver=innocent,spam

Et de positionner ensuite une directive virtual_transport = dspam, dans le cas de l'utilisation de comptes virtuels. Il est aussi possible de l'activer seulement pour certains utilisateurs à l'aide de la table transport(5).

Toutefois, pour que cela reste fiable, il est nécessaire que DSPAM retourne un code d'erreur 75 (tempfail) en cas de soucis, afin que Postfix conserve celui-ci en file d'attente. Sur ce point, la version courante de DSPAM (3.8.0) souffre d'un bug génant : si l'agent de livraison final retourne un code d'erreur, DSPAM ne retournera pas ce même code (contrairement à ce qui est indiqué dans la section EXIT VALUE de la page de man), mais 255. Ce qui entraîne une perte pure et simple du mail !

En attendant, pour contourner ce problème, il est possible de mettre en place un wrapper qui retournera le code 75 dans toutes les situations d'erreur.

Exemple d'un fichier dspam-wrapper :

#!/bin/sh

cat | /usr/local/bin/dspam $* || return 75