DOCUMENTATION RAPIDE SUR PROCMAIL


 

SOMMAIRE :

1. INTRODUCTION :

Procmail est un MDA (Mail Delivery Agent) qui permet de faire des filtres pourvant servir dans plusieurs cas. Typiquement il est possible de filtrer les messages des importuns et les mettre automatiquement à la poubelle, trier les messages provenant de diverses mailing-listes, etc. jusqu'à faire un serveur de fichiers...

L'anatomie d'une configuration procmail est organisée en 2 fichiers indispensables : ~/.forward et ~/.procmailrc

2. LE FICHIER ~/.forward :

Il ne doit contenir qu'une seule ligne (concernant l'utilisation de procmail -- car il peut faire d'autres choses comme la redirection) :

    "| IFS=' ' && exec /usr/bin/procmail -f- || exit 75 #login"
    

En gardant les guillemets, remplaçant le chemin vers procmail par le bon et en remplaçant #login par #votre-login.

3. LE FICHIER ~/.procmailrc :

Ce fichier contient plusieurs éléments. Tout d'abord il contient des définitions de variables dont certaines sont indispensables et d'autre que vous pouvez définir par vous-même. Ensuite il y a les recettes qui permettent, en appliquant des recherches d'expressions rationnelles (regexp en anglais), de déterminer si le traitement qui concerne cette cette recette sera appliqué au message qui passe par procmail. Plusieurs recettes peuvent s'enchaîner et / ou se suivent.

3.1 Les variables en tête du fichier .procmailrc

Il est IMPORTANT et même INDISPENSABLE de renseigner correctement les variables suivantes car elles ne le sont pas par le shell :

SHELL=/bin/sh : shell utilisé -- cette valeur est IMPOSÉE sous risque que procmail ne marche pas correctement.
MAILDIR : Répertoire de spool de mails.
LOGNAME : Votre login local
ORGMAIL : Répertoire de stockage des mails.
DEFAULT : Répertoire où iront les mails par défaut.

La suivante est aussi très utile pur déboguer le .procmailrc :

LOGFILE : Fichier contenant les sorties de débogage.

Voici un exemple de ce qui peut être mis en tête du ~./procmailrc :

------8<----------------------------------------------------------------------
######
# Mon procmailrc de base
#
SHELL=/bin/sh
MAILDIR=/var/mail           # Répertoire où se trouvent le spool de mails
LOGNAME=login               # Votre login local
ORGMAIL=$MAILDIR/$LOGNAME
DEFAULT=$ORGMAIL
VERBOSE=yeah
MOI=moi@fai.fr              # Votre adresse email chez votre fai.

######
# UNIQUEMENT POUR LE DEBUG => génère beaucoup de texte.
#
#LOGFILE=$HOME/.procmail/logfile

------8<----------------------------------------------------------------------
    

3.2. Bases des recettes procmail

Les recettes procmail sont composées de 3 parties :

3.2.1 Les entêtes

Toutes les recettes commencent par :0 [options][: [fichier]], les noms entre crochets étant optionnelles et à remplacer par les bonnes valeurs.

Les options les plus utilisées sont :

H : passe l'expression rationnelle sur les entêtes du message
B : idem sur le corps
h : utilise les entêtes pour le traitement
b : idem sur le corps
c : travaille sur une copie du message

Le ":" et le fichier servent à générer un fichier verrou (automatique si aucun nom n'est donné).

3.2.2 Les règles (expressions rationnelles)

Les expressions rationnelles permettent de faire correspondre une partie du message à un motif. Leur description se trouve dans le manuel de sed et awk (Le livre de O'Reilly à ce sujet est très bien fait).

Ces expressions rationnelles (regexp en anglais) doivent toutes commencer par une étoile suivie d'une espace : "* " (sans les guillemets). Il peut y en avoir plusieurs pour une même recette. Les différentes règles sont traitées de cette façons comme s'il y avait un ET logique entre elles :

:O
* expression1
* expression2
...
* expressionN
    

Pour faire un OU logique, il faut mettre sur une même ligne les expressions de la manière suivante :

:0
* expression1|expression2|...
    

Notez bien qu'il ne faut pas d'espace. Les 2 formes sont bien entendu mélangeables.

3.2.3 Les actions

Une action est le traitement à effectuer si les expressions rationnelles pour cette recette ont été vérifiées. Dans ce cas il y a 2 actions principalement utilisées (et une troisième qui l'est moins) :

Des exemples de ces 2 cas sont données plus bas.

Pour plus d'informations se reporter aux liens et aux docs fournies à la fin du document. La FAQ procmail est d'une très grande aide pour les problèmes courants ou déjà traités (et il y en a peu qui ne le sont pas).

4. QUELQUES EXEMPLES DE RECETTES PROCMAIL :

Dans cette section j'utiliserai des messages stockés sous forme de fichiers texte dans le répertoire créé pour l'occasion : ~/.procmail/

4.1 Mettre à la poubelle tous les messages que mon procmail a envoyé et auquel un système automatique a répondu

    
:0
*$ ^X-Loop:.*$MOI
/dev/null
    

le $ après l'étoile dit qu'il faut interprêter le signe $ dans l'expression rationnelle comme étant une utilisation de variable. Ici $MOI a été rempli avec moi@fai.fr.

4.2 Mettre à la poubelle tous les messages qui contiennent un fichier .exe, .dot ou .vbs

:0 HBhb
* ^Content-Type:.*\.(exe|dot|vbs).*
| ( formail -rtk -p '| ' \
    -A "X-Loop: $MOI" \
    -A "Precedence: junk"; \
    cat $HOME/.procmail/badfile ) | $SENDMAIL -t -oi
    

L'action utilisée affiche un message rédigé en français et en anglais demandant gentilment à l'émetteur du message de ne plus envoyer ce genre de fichier.
Le message est entièrement utilisé avec cette recette et n'est donc ensuite plus disponible pour un traitement ultérieur.

4.3 Répondre à ceux qui envoient des messages contenant des .doc, des .ppt, des .pps et des .xls

:0 HBhbc
* ^Content-Type:.*\.(doc|ppt|pps|xls).*
| (formail -rtk -p '| ' \
    -A "X-Loop: $MOI" \
    -A "Precedence: junk"; \
    cat $HOME/.procmail/badattach ) | $SENDMAIL -t -oi
    

Nous travaillons ici sur une copie du message et donc celui-ci va parcourrir les recettes qui suivent dans le fichier .procmailrc au cas où un autre traitement serait à y appliquer. Si aucun autre traitement n'est effectué il sera tout simplement ajouté dans la boite à lettre locale.

4.4 Répondre enfin à ceux qui envoient des messages en HTML, en quoted-printable ou contenant une vcard alakon

:0 HBhbc
* ^Content-Transfer-Encoding: quoted-printable|^Content-Type: text/html|^Content-Type: text/x-vcard
| (formail -rtk -p '| ' \
    -A "X-Loop: $MOI" \
    -A "Precedence: junk"; \
    cat $HOME/.procmail/badformat ) | $SENDMAIL -t -oi
    

Rien de neuf pour cette règle :)

4.5 Extensions

Il serait interessant de faire une recette permettant de vérifier le contenu des fichiers de type archive (.zip, .tar, .tar.gz, .tar.Z, .tar.bz2, .tgz), ce qui doit être faisable avec AmaVis (qui est un détecteur de virus pour systèmes de mail) et metamail.

5. QUELQUES EXPLICATIONS :

Un élément important a garder en mémoire lorsqu'on fait des recettes procmail est le fait de savoir sur quoi on applique la recette en fonction de ce qu'on veut obtenir par la suite.
En effet, si on ne travaille pas sur une copie du message (ce qui arrive dans la recette 2), l'intégralité du message est traité par cette recette, ce qui fait que s'il n'est pas copié dans la boite locale ou dans un fichier, il sera définitivement perdu. C'est pourquoi, malgré les inconvénients des messages contenant des données non agréables à lire (.doc, etc...), certaines recettes travaillent sur des copies permettant ainsi de garder le message -- qui pourra d'ailleurs subir des traitements ultérieurs s'il lui arrivait de satisfaire aux expressions rationnelles des recettes suivantes.

6. LIENS :

7. FICHIERS :

Ici vous trouverez des exemples que j'utilise et qui illustrent les recettes ci-dessus :


Thomas Nemeth :
email
Linux Power
back
Page modifiée le 17 mars 2001