Une introduction à Procmail

Sebastien Tanguy


Table des matières

1. Introduction

Le but de de court document est d'introduire le lecteur à l'utilisation possible de l'outil Procmail pour filtrer ses messages électroniques et éventuellement se prémunir des messages indésirables (aka, le SPAM).

2. Présentation de Procmail

Procmail est à la base un outil de traitement du courrier électronique. Il peut être utilisé par le MTA[1] pour déposer les messages dans la boîte aux lettres des utilisateurs, ou par ces derniers pour filtrer les messages suivant divers paramètres.

Dans le premier cas, le serveur de mail (Sendmail ou Postfix, par exemple) est configuré spécifiquement pour utiliser Procmail pour déposer les messages. Par exemple, pour Sendmail on peut retrouver un élément de configuration tel que le suivant dans le fichier de configuration sendmail.mc:

FEATURE(`local_procmail')dnl

Ou alors, pour Postfix, on peut ajouter dans le fichier de configuration main.cf une ligne:

mailbox_command = /usr/bin/procmail -a $EXTENSION

Si Procmail n'a pas été mis en place de cette manière par l'administrateur de la machine, il est toujours possible d'y faire appel pour gérer le courrier en mettant dans son fichier .forward une ligne tel que:

|/usr/bin/procmail

Une fois cette préparation terminée, il ne reste plus qu'à faire appel aux fonctionnalités réelles de Procmail, car par défaut celui-ci se contente juste de déposer les messages dans la boîte au lettre de base, mais peut faire du filtrage assez poussé.



[1] Le logiciel qui transporte le courrier électronique.

3. Le fichier de configuration

Sans fichier de configuration, bien sûr, Procmail n'apporte pas grand chose. Il nous faut donc le créer. En temps normal il se nomme .procmailrc et doit être situé dans le répertoire d'accueil.

3.1. Syntaxe de base

On peut distinguer 3 choses dans un fichier procmail:

  • Les commentaires. Ceux-ci sont introduits par le caractère # en début de ligne.

    # Ceci est un commentaire
  • Les affectations de variables. Si on veut affecter à un nom plus générique certaines valeurs plus ou moins complexes. On écrira donc le nom de la variable, un signe égal et la valeur

    nom=valeur
  • Les règles de filtrage proprement dit. Nous verrons cela en détail un peu plus loin.

3.2. Stratégie utilisée et fichier principal

Avant toute chose, dans le fichier principal de configuration de procmail, nous allons définir les variables nécessaires aux traitements suivants; par exemple:

MAILDIR=$HOME/.gnus.in
DEFAULT=$MAILDIR/spam
LOGFILE=$HOME/.procmail/data/from
LOCKFILE=$HOME/.lockmail

COMSAT=no
VERBOSE=no

INCLUDEDIR=$HOME/.procmail

La première variable, MAILDIR définit le répertoire sur lequel on se basera pour ensuite répartir les mails filtrés. Attention à ne pas confondre ce nom avec un quelconque format de stockage de mail répandu. Ici, la valeur choisie correspond au répertoire d'entrée utilisé par Gnus (logiciel de messagerie de Emacs)

La variable DEFAULT définit le dossier utilisé par défaut pour déposer le mail. À noter qu'on part sur le principe qu'on a filtré tous les mails qui nous intéressent et que ce qui reste peut être considéré comme du spam.

Les autres variables sont optionnelles et servent au bon fonctionnemen de procmail.

Procmail permet de faire appel à d'autres fichiers en cours de route. Pour plus de clarté, nous allons donc grouper les règles de filtrage en fonction du but recherché. Le fichier principal .procmailrc servira donc essentiellement à définir notre environnement, certaines préférences et à inclure les uns après les autres nos suites de règles.

INCLUDEDIR=$HOME/.procmail

On définit tout d'abord le répertoire de base de nos inclusions. Ensuite, pour inclure chaque fichier à proprement parler on va affecter à une variable particulière le nom du fichier à inclure.

INCLUDERC=$INCLUDEDIR/listes
INCLUDERC=$INCLUDEDIR/blacklist

INCLUDERC=$INCLUDEDIR/whitelist
INCLUDERC=$INCLUDEDIR/mail

Ici, donc, nous séparons notre configuration entre la gestion des mailing-lists, les listes blanches et noires de personnes et adresses et les messages qui nous sont explicitement destinés.

3.3. Gestion des mailing-lists

Le fichier s'occupant des listes de distribution est une suite de filtres permettant de répartir chacune des listes dans une dossier adapté.

Nous allons juste montrer quelques exemples de filtres à adapter en fonction des listes auxquelles vous êtes abonné et des logiciels que celles-ci utilisent (pour les entêtes générés).

:0
* ^List-Id: <mlfo@listes.linux-france.org>
mlfo

:0:
* ^Sender: gcc-announce-owner@gcc.gnu.org
annonces

3.4. Listes blanches et noires

On reprend le même principe des règles pour simplement mettre dans un dossier poubelle les messages qu'on ne souhaite vraiment pas recevoir (liste noire) et dans le dossier de mail normal (ou un spécifique) pour les gens dont on souhaite voir les messages en particulier (nottement si leurs messages devaient recevoir une mauvaise note par un filtre suivant)

:0
* ^Subject:.*Sujet abscons
/dev/null

:0
* ^From: <jerry.*@domaine.com>
/dev/null

Voici pour les listes noires. Pour les listes blanches on utilisera donc la même manière de faire mais en changeant le dossier de destination.

3.5. Traiter son mail

La manière dont nous allons filtrer notre mail implique que nous soyons toujours mis en copie directe d'un message (les envois en Bcc passeront donc à travers), donc nous avons une liste de nos adresses. Nous souhaitons aussi filtrer les messages via le client SpamAssassin.

Voici donc ce que nous obtenons:

HOSTED_DOMAIN1=mondomaine1.com
HOSTED_DOMAIN2=mondomaine2.org

HOSTED_DOMAINS=((${HOSTED_DOMAIN1})|(${HOSTED_DOMAIN2}))

ALIASES=myusername

HOSTED_EMAILS=(${ALIASES}@${HOSTED_DOMAINS})

Pour simplifier les règles, on utilise différentes variables pour désigner les différentes adresses qu'on peut utiliser.

:0
*$ ^TO_${HOSTED_EMAILS}
{

On définit ensuite une règle qui portera sur les adresses qu'on a définies plus tôt. Au lieu de rentrer directement dans un dossier, on ouvre une nouvelle suite de règles qui ne seront utilisées que dans ce cas spécifique.

    :0fw
    | spamc

    :0e
    {  
       EXITCODE=$?
    }

    :0:
    * ^Subject:.*\*\*\*\*SPAM\*\*\*\*
    $DEFAULT

Ceci est un exemple d'utilisation de SpamAssassin qui va renvoyer un mail marqué dans le dossier par défaut (qu'on a définit précédemment comme étant la destination des spams.

    :0
    mail
}

Enfin, on stocke les mails qui nous sont destinés et qui ne sont pas indésirables dans notre boîte aux lettres principale.