Avec encore une petite centaine de spam par jour sur ma boîte personnelle, Dspam se trompe en moyenne 1 fois ou 2. Des faux négatifs bien sûr, les faux positifs ceci à du m'arriver 4 fois en un an.
Donc à ma petite habitude - expliquée dans le tuto : SERVEUR DEBIAN : Antispam email- j'envoie le faux négatif à spam@domain.tld et hop il sera détecté la prochaine fois.

Donc ce score très honorable de 98 % méritait toutes les louanges jusqu'au jour où les performances diminuées de 30 %.
Que se passe t-il donc ?

La réponse était très simple et il n'a pas fallu chercher longtemps. Ma première idée était que les mails envoyés à spam@domain.tld n'était plus transférés ou mal intégrés donc la reconnaissance de spams s'en retrouvait altérée. Rien de cela en fait. Dès que j'ai ouvert le log mail.info j'ai découvert la mascarade :
Mes chères ennemis spammeurs envoient leurs courriers directement à ham@domain.tld qui les accepte gracieusement et - en quelque sorte - les whiteliste avant que le spammeur fasse un second envoie dans les boîtes réelles ce coup-ci.

Après la découverte de cette macabre entreprise, je me mis en tête de trouver une solution.
La première idée c'est de changer l'adresse ham@domain.tld. Pourquoi pas, c'est une idée simple et peu coûteuse. Mais embêtante pour les utilisateurs qui doivent mémoriser cette adresse qui pourrait, de plus, changer de nouveau etc... Si l'adresse ham@domain.tld à pu être trouver par déduction, en suivant mon tuto ou les autres ressource du web qui utilise cette méthode, comment l'adresse 1234@domain.tld pourrait-elle être trouvée ? Comme votre adresse personnelle à été trouvée par les spammeurs.
A partir du moment ou vous n'êtes pas le seul client de vos services, vous devez pensez aux utilisateurs. Prenons un utilisateur lambda - ou beta :]...

  1. Windows
  2. Outlook Express
  3. l'adresse 1234@domain.tld dans son carnet d'adresse
  4. Msn messenger
  5. une conversation msn
  6. clique (bêtement ?) sur votre ami(e) souhaite vous envoyer un fichier : photos_chaudes.zip

Qui ne cliquerai pas en fait ? :p
Bon vous avez compris l'utilisateur va être vérolé (s'il ne l'était pas déjà) et le virus fera joujou avec son carnet d'adresse... et 1234@domain.tld devra être changer vers une nouvelle adresse.
Tout ça pour dire que ma première idée ne va pas être celle que je vais prendre.

Cela faisait un moment que je souhaitais changer de système et c'était l'occasion d'en changer.
En effet transférer un mail ou deux à une adresse mail c'est cool de temps en temps mais quand la boite mail est toute neuve et le Dspam tout frais dessus, vous devez transférer 10 mails , 15 mails ou plus... Ceci devient rebutant.
De plus certains aiment transférer leurs mails en pièces jointes, souvent pour en transférer plusieurs d'un coup, ce qui est donc incompatible avec la méthode employée pour Dspam.
Le second problème de la solution « transférer à xxx » est que le système reste ouvert à l'extérieur donc toujours d'une manière ou d'une autre accessible à l'ennemi.

La solution pour moi est donc :
Pourquoi ne pas avoir un dossier dans la boîte mail ou l'on entreposerai les spams et les hams mal interprétés par Dspam afin qu'il puisse toujours apprendre et corriger ses erreurs.
Cette solution apporterai du confort pour l'utilisateur de la boîte qui n'aurai plus qu'à déplacer ses mails d'un dossier à l'autre et elle apporterai aussi une sécurité supplémentaire puisqu'elle ne serait pas accessible de l'extérieur.

Après n'avoir pu trouvé mon bonheur auprès de Maildrop ou Procmail pour gérer un tel échange avec Dspam (peut être ai-je mal recherché). J'ai donc décidé de faire le petit script ci-dessous pour traiter les mails mal interprétés.

Voici la démarche :
Les utilisateurs doivent créer - pour ceux qui souhaite profiter de Dspam – un dossier Antispam qui contiendra deux sous-dossiers : spam et non-spam.
Les spams non reconnus seront donc entreposés dans le dossier spam et les ham reconnu comme spam seront entreposés dans non-spam.

Il ne reste plus qu'à mettre sur le serveur ce script et d'automatiser la tâche avec Cron. J'ai choisi pour moi toute les 5 minutes.

#!/bin/bash

### Configuration
Dir=/var/mail/virtual
Spam=.Antispam.spam
Ham=.Antispam.non-spam
Trash=.Trash

### Ne plus toucher ici
parseDirToDspam()
{
	if [ $1 == "SPAM" ]
	then
		Type=spam
	else
		Type=innocent
	fi

	for Message in `ls $2/$3/$4/$5/cur`
	do
		echo "find $Type : $Message"

		# Vérifie si le message est flaggué
		if [ `echo $Message | grep : | wc -l` -lt 1 ]; then
			mv $2/$3/$4/$5/cur/$Message $2/$3/$4/$5/cur/${Message},2:
			Message=${Message},2:
		fi

		# Vérifie si le message est marqué comme lu
		if [ `echo $Message | cut -d: -f2 | grep S | wc -l` -lt 1 ]; then
			mv $2/$3/$4/$5/cur/$Message $2/$3/$4/$5/cur/${Message}S
			Message=${Message}S
		fi

		# Vérifie que le message n'est pas supprimé
		if [ `echo $Message | cut -d: -f2 | grep T | wc -l` == 1 ]; then
			continue
		fi

		# récupère la signature du message
		Signature=`cat $2/$3/$4/$5/cur/$Message | grep X-DSPAM-Signature | cut -d: -f2 | sed -n 's/ //p'`

		# envoie le message à DSPAM pour classification
		/usr/bin/dspam --user $4@$3 --class=$Type --source=error --signature=$Signature

		# Le nom du message qui va etre déplacé
		NewName=`echo $Message | cut -d: -f1`

		if [ $1 == "SPAM" ]; then
			echo "Suppression"
			cp $2/$3/$4/$5/cur/$Message $2/$3/$4/$6/new/${NewName}:2,S
			mv $2/$3/$4/$5/cur/$Message $2/$3/$4/$5/cur/${Message}T
		else
			echo "Restauration"
			sed -e 's/\[SPAM\]//' $2/$3/$4/$5/cur/$Message > $2/$3/$4/cur/${NewName}
			mv $2/$3/$4/$5/cur/$Message $2/$3/$4/$5/cur/${Message}T			
		fi
	done
}

# Parse les domaines présent dans le $Dir
for Domain in `ls $Dir`
do
	# entre dans le domaine	
	if [ ! -d $Dir/$Domain ]; then
		continue
	fi

	echo "Domaine : $Domain"

	for User in `ls $Dir/$Domain`
	do
		# entre dans l'utilisateur
		if [ ! -d $Dir/$Domain/$User ]; then
			continue
		fi

		echo "User : $User"

		if [ ! -d $Dir/$Domain/$User/$Spam ]; then
			continue
		fi

		parseDirToDspam SPAM $Dir $Domain $User $Spam $Trash

		if [ ! -d $Dir/$Domain/$User/$Ham ]; then
			continue
		fi

		parseDirToDspam HAM $Dir $Domain $User $Ham
	done
done

exit 0

Voici ce que ce script fait:

Il inspecte $Dir - ici : /var/mail/virtual - afin de trouver toutes les boites mails existantes. Pour chacune d'elle il vérifie la présence du dossier Antispam et des ses deux sous dossiers.

Si tout est présent il vient chercher les mails présent dans le dossier spam pour traitement :

  1. marque le message comme lu
  2. récupère la signature dans les entêtes du message
  3. demande à Dspam de reclassifier le mail identifié par sa signature
  4. déplace le mail dans la corbeille

Ensuite il vient chercher les mails présent dans le dossier non-spam pour traitement :

  1. marque le message comme lu
  2. récupère la signature dans les entêtes du message
  3. demande à Dspam de reclassifier le mail identifié par sa signature
  4. supprime la signature [spam] dans le sujet
  5. replace le mail dans la boite pricipale

Ainsi on peut y voir trois intérêts :

  1. La signature Dspam dans le contenu du mail devient inutile et l'on peut donc reparamétrer Dspam pour l'enlever.
  2. Les faux positifs se retrouve après traitement dans la boite email comme s'il avait été correctement reçu. (pas marqué comme transféré, pas de préfixe [spam] dans le sujet)
  3. La boîte d'envoi ne sera plus remplie des nombreux transferts vers spam@... que vous ne ferez plus.

Si toutefois vous avez des choses à apporter à cette solution, si vous avez trouvé des erreurs, n'hésitez pas. Je suis toujours preneur. Notamment s'il existe un moyen de coupler Maildrop ou Procmail à tout ça afin de ne plus utiliser Cron pour lancer le script ce qui diminuerai les ressources consommées.

Le choses à faire sont donc :

  1. Reparamétré dspam pour qu'il pose la signature dans les entêtes du mail et non plus dans le corps du mail.
  2. supprimer les deux adresses spam@domain.tld et ham@domain.tld.
  3. Copier le script dans un endroit qui vous plaît. par example /usr/local/sbin et appelé le ... dspam-classify ?
  4. paramétrez le script avec votre environnement.
  5. Le script est aussi prévu uniquement pour supprimé le préfixe [spam] dans le sujet du mail. Si vous utilisez un aute préfixe, il faudra changer la commande sed en conséquence.
  6. Créer un fichier dspam dans /etc/cron.d et mettez ceci dedans :
*/5 * * * *   root   /usr/local/sbin/dspam-classify > /dev/null

Merci pour la lecture de ce long sujet !