Voici une liste désordonnée de recettes de base qui pourront être utiles, et qui sont légèrement différentes des règles qu'on trouve dans les pages de manuel de procmail.
:0 Wh: msgid.lock | formail -D 8192 msgid.cache
Imaginons que je sois abonné à la liste Postfix-Fr. L'adresse pour envoyer un message à cette liste est postfix-fr@lists.freenix.org, mais quand vous en recevez, l'adresse de l'expéditeur est postfix-fr-owner@lists.freenix.org. Il nous faut donc trouver une expression suffisamment complète qui nous permette de repérer un tel message sans ambiguïté. Une telle expression peut être exprimée par la règle suivante :
:0: * ^From.*postfix-fr-owner postfix-fr
Dans cette règle, nous recherchons si l'en-tête représentant l'expéditeur (la
partie ^From de l'expression rationnelle) contient la chaîne
postfix-fr-owner, et si c'est le cas, plaçons le courrier
dans la boîte aux lettres nommée « postfix-fr ».
Pour trier d'autres listes de diffusion, le principe est le même : trouvez
dans les en-têtes des courriers des éléments suffisamment significatifs sur
lesquels vous baserez votre tri (From.*liste-owner pour une
liste Sympa, From.*owner-liste pour une liste Majordomo,
From.*liste-admin pour une liste Mailman, etc.).
:0: * ^Subject:.*blague copains/blagues
Tous les courriers dont le sujet contient la chaîne blague iront dans le dossier blagues se trouvant dans le sous-répertoire copains de votre répertoire de courrier.
Ce n'est pas très pratique : tous les courriers dont le sujet contient le mot
« blague » se retrouveront dans ce dossier, ce n'est pas forcément le résultat
souhaité. Pour cela, vous indiquez à vos amis que vous préférez mettre une
balise, en entourant le mot blague de crochets : [blague]. Traiter les
crochets avec procmail est plus difficile qu'on ne croit : les mettre
littéralement dans la règle, ou échappés avec des anti-slashes (exemple :
* ^Subject:.*\[blague\]) ne résout pas le problème.
La solution retenue est assez grossière, mais fonctionne :
:0: * ^Subject:.*[[]blague[]] copains/blagues
en effet, les caractères [ et ] agissent
comme des délimiteurs de classes de caractères : c'est courant dans les
expressions rationnelles.
;-) :
:0 H * ^X-Mailing-List:.*[<].*lists\.debian\.org[>] * ^X-Mailing-List:.*[<] *\/[^ ][^@]* $MATCH
Cette règle à l'apparence barbare s'appuie sur le fait que les courriers des
listes Debian contiennent l'en-tête X-Mailing-List:
debian-nom-liste@debian.org, et que la variable
$MATCH contient ce qui a été trouvé dans l'expression
rationnelle précédente à partir de \/. Pour clarifier,
l'expression \/[^ ][^@]* « correspondra » à un début
d'adresse électronique (sans la partie domaine) et sera affecté à la variable
$MATCH. Pour la liste
debian-french@lists.debian.org par exemple, le courrier
sera donc placé dans le dossier debian-french.
Cette méthode fonctionne pour toutes les listes Debian, si vous êtes comme moi abonné à plusieurs d'entre elles.
Attention : Alain Thivillon4 m'a signalé un problème de sécurité sur cette règle. Celle-ci écrit en effet dans des fichiers en fonction d'un champ qu'on ne maîtrise pas ; n'importe qui peut alors utiliser le champ X-Mailing-List: pour permettre d'écrire dans un fichier arbitraire. L'exemple qui suit devrait suffire à vous convaincre.
X-Mailing-List: <../.profile@lists.debian.org>
Procmail enverra le courrier reçu dans le fichier ../.profile, imaginez les dégâts possibles...
Une solution peut être d'utiliser fetchmail et son mode multidrop, ou bien les règles procmail suivantes :
:0 * ^TO_Suzanne.*Dupont ! suzanne :0 * ^TO_Jean.*Dupont ! jean
Assurez-vous toutefois qu'une boîte aux lettres récupère le courrier qui serait éventuellement passé à travers ; ce sera le cas quand l'adresse du destinataire n'aura pas la forme souhaitée. C'est en tout cas une façon rapide, mais peu efficace, de distribuer du courrier en provenance d'une seule adresse à destination de plusieurs personnes. Une solution plus pratique, par exemple, est d'utiliser UUCP.
Un autre exemple d'utilisation multi-utilisateurs est de dispatcher la réception d'une liste de diffusion à plusieurs personnes. Ceci permet, par exemple, d'économiser de la bande passante en abonnant une seul personne à une liste extérieure, et en distribuant les courriers reçus à toutes les personnes intéressées. Ceci permet de gérer des listes de diffusion à moindre coût, surtout si on n'a pas le droit d'installer un tel outil sur le serveur.
Supposons que je reçoive la lettre Crypto-Gram de Bruce Schneier (un mail tous les 15 de chaque mois), pour la distribuer à 3 utilisateurs locaux (Pim, Pam, Poum), ainsi qu'à moi-même. La règle sera la suivante :
:0
* ^From.*crypto-gram-return
{
:0 c
! pim,pam,poum
:0:
listes/crypto
}
Notez que la première ligne n'a pas de signe deux-points terminal, car
l'action à effectuer est un bloc imbriqué (entre les accolades). L'imbrication
est illimitée. À l'intérieur, vous pouvez encore avoir d'autres conditions, et
d'autres actions. Dans notre cas, la première action est de faire une copie du
courrier (drapeau c), de le transmettre à nos trois
larrons. La deuxième action (agissant sur le courrier que nous venons de
copier) me permet de recevoir le courrier dans une boîte aux lettres
personnelle.
La règle qui suit utilise la méthode de la « liste noire », que l'on gère en insérant dans un fichier une adresse non désirée, voire une expression rationnelle si l'on veut bloquer un domaine entier, par exemple. Elle utilise deux programmes, extract-addrs et match-email-addr tirés de la définition de cette règle adaptée de liste noire. Pour l'historique, je me suis basé sur les règles de Larz Wirzenius (fameux ancien modérateur de comp.os.linux.announce) disponibles à http://www.iki.fi/liw/mailfilter.html ; Richard Gooch (fameux « hacker » du noyau Linux, entre autres) a adouci ces règles et met les sources des deux programmes cités à disposition à ftp://ftp.atnf.csiro.au/pub/people/rgooch/ 5.
Compilez ces deux programmes, mettez-les à un endroit accessible par procmail (rappelez-vous de la variable PATH du .procmailrc), et incluez la règle suivante :
# À modifier selon les cas
BLACKLIST=$MAILDIR/.blacklist
:0 Whic
| extract-addrs | match-email-addr $BLACKLIST
# Si on a trouvé une adresse de spammeur (ci-dessus), alors...
:0 a
{
:0:
junk/spam
}
Mettez de préférence cette règle vers la fin de votre fichier de configuration procmail, car elle passe le courrier à travers deux tubes et est un peu plus gourmande que les autres vues auparavant. Les deux premières lignes envoient le courrier sur extract-addrs qui extrait les adresses électroniques du message et les envoie à match-email-addr qui les comparera avec le contenu de la liste noire.
En cas de correspondance, le résultat de la commande sera positif et la règle suivante sera exécutée, ce qui a basiquement pour effet de mettre le courrier de côté. Lisez cette boîte de temps en temps, on ne sait jamais...
Le contenu du fichier de liste noire est le suivant. Je vous conseille vivement de créer vous-même votre fichier de liste noire, au fur et à mesure des nouveaux spams. Couplée à d'autres règles (pas de HTML, est-ce que le courrier m'est bien adressé, etc.), cette méthode réduit énormément le nombre de spams dans la boîte principale (mais pas le nombre absolu de courriers non sollicités, hélas).
# Les commentaires ainsi sont possibles -- en tout cas, ça marche chez moi # (tm) -- voir le source de match-email-addr pour plus de détails # quelques adresses « connues » Friend@public.com friend@everywhere.com BeSeen@At.Our.Site.com # quelques expressions rationnelles ; je suis un peu bourrin sur ce coup # le mot-clé !regexp est important !regexp [@.]msn\.com !regexp [@.]aol\.com !regexp [.@]writeme\.com
Note : ce passage sur le spam devrait faire l'objet d'une section complète pour la prochaine révision du document.