next up previous contents
suivant: Utilisation en dehors d'un monter: Configuration de procmail précédent: Recettes   Table des matières

Quelques recettes utiles

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.

  1. Ne garder qu'un seul exemplaire d'un mail, même si on le reçoit deux fois ; utile, par exemple, quand on reçoit une réponse d'une liste de diffusion, à la fois directement et par l'intermédiaire de la liste. Il est possible de régler la taille du cache en changeant le nombre (8192).

    :0 Wh: msgid.lock
    | formail -D 8192 msgid.cache
    

  2. Ces règles permettent de trier une liste de diffusion dans un dossier séparé, afin de ne pas trop encombrer la boîte aux lettres normale.

    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.).

  3. La règle qui suit permet de trier un courrier sur son sujet, ce qui permet de filtrer certaines listes de diffusion ajoutant systématiquement leur nom dans le sujet du courrier. Vous pouvez aussi discuter d'un thème précis avec des amis, des collègues en convenant d'un mot-clé dans le sujet.

    :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.

  4. La règle suivante, assez impressionnante, permet de trier en un seul coup tous les courriers arrivant de listes de diffusion similaires. L'exemple typique en est les listes de diffusion du projet Debian (http://www.debian.org/), auxquelles la règle fait référence (mais cela pourrait fonctionner aussi pour les listes FreeBSD ;-) :

    :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...

  5. Question : je récupère mon courrier depuis une seule adresse, et j'aimerais le trier en fonction du destinataire, selon que l'adresse soit Jean Dupont <toto@fai.fr> ou Suzanne Dupont <toto@fai.fr>.

    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.

  6. L'utilisation la plus attendue de procmail est le traitement des spams. Bien qu'il soit possible de les bloquer plus en amont (listes noires avec les serveurs de courriers, comme RSS, ORBS, MAPS, etc.), on déteste généralement les voir arriver dans la boîte aux lettres. Je vous renvoie sur les sites style Cauce (http://www.cauce.org/) pour les raisons philosophiques de la lutte contre le spam et propose une solution simple pour mettre de côté les courriers non désirés. Je n'indique pas comment les jeter (/dev/null) car j'ai eu de mauvaises surprises : mieux vaut avoir un ou deux spams dans la boîte qu'un courrier important à la trappe !

    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.


next up previous contents
suivant: Utilisation en dehors d'un monter: Configuration de procmail précédent: Recettes   Table des matières
Olivier Tharan 2002-06-09