Home Index Search Links About Us
  Nouvelles   Archives

Gérer le courrier avec procmail

par Angel Lopez


Installation

Fonctions de base

Configuration

Listes de diffusion

Réponse au Courrier

Boucles infinies

Fichiers de décodage

Conclusion

Installation

D'abord, récupérons la dernière version de procmail. Lors de la rédaction de cet article, la dernière version était la 3.11pre7.

Après avoir récupéré le code source de ce logiciel, décompressons et désarchivons-le à l'aide de la commande:
tar -xzvf procmail.tar.gz

Ensuite éditons les fichiers Makefile et config.h. L'objectif de cet article étant seulement une introduction et afin de garder les choses simples, nous n'expliquerons pas les différentes options de configuration de ces fichiers. Le lecteur intéressé pourra consulter les pages du manuel et la documentation fournie avec les sources.

Cependant, il est utile de mentionner l'existence de l'option BASENAME dans Makefile. A l'aide de cette option, nous indiquerons le répertoire de base où procmail sera installé. De ce répertoire, nous indiquerons d'autres répertoires tels que bin et man.

Finalement, pour compiler le lot, exécutons la commande:
make install.

Procmail peut être installé, soit pour tout le système et ainsi être appelé selon certaines règles de sendmail(8), soit par chaque utilisateur pour son usage personnel. Dans ce cas, l'utilisateur indiquera l'usage de procmail dans son .forward, où sera présente une ligne telle que:

|IFS=' ' && exec /home/john/procmail/bin/procmail -f- || exit 75 #john

Dans cette ligne, je présume que l'utilisateur john a installé procmail dans son HOME. Pour cette ligne particulère, le BASENAME spécifié durant la compilation sera /home/john/procmail.

Fonctions de Base

Procmail lit à partir d'une entrée standard. Il vérifie le fichier .procmailrc qui est un fichier de configuration que l'utilisateur devrait avoir dans son HOME. Ce fichier définit certaines règles qui diront à procmail quoi faire après avoir lu un message. Il peut être configuré de façon à vérifier certaines chaînes de caractères dans l'en-tête du message soit pour le sauvegarder, soit pour l'ignorer, répondre automatiquement, etc...

Procmail permet le traitement automatique du courrier entrant ou du courrier accumulé dans un fichier.

Configuration

Le fichier de configuration se nomme.procmailrc et il doit être placé dans HOME.

Chaque ligne commençant par # est considérée comme un commentaire.

Les lignes commençant par :0 ou :0: indiquent le début d'une nouvelle règle qui dit à procmail quoi faire d'un message.

Les lignes commençant par * indiquent une condition qui doit être satisfaite pour l'application d'une règle. C'est la méthode que procmail utilise afin de sélectionner quels messages exigeront un traitement selon la règle ou non.

Les dernières lignes restantes, celles qui ne commencent ni par : ou par *, sont considérées comme des commandes. En d'autres termes, ces lignes spécifient l'action qui sera appliquée par procmail aux messages satisfaisant la condition. Les commandes possibles sont: l'effacement d'un message, le transfert d'un message, la sauvegarde d'un message...

La première chose à indiquer dans un .procmailrc sont les variables d'environnement Voici quelques unes de ces variables que je vous recommande de définir dans votre .procmailrc:

MAILDIR
Indique à procmail où sauvegarder les fichiers qui contiennent les messages (courrier) . Cette variable habituellement pointe vers $HOME/mail ou $HOME/Mail, dépendant du lecteur de courrier utilisé.

LOGFILE
Indique le nom du fichier d'appel noté où procmail laisse les enregistrements de toutes les transactions.

SENDMAIL
Indique où trouver sendmail qui sera utilisé automatiquement lors des messages réponses.

FORMAIL
Indique où trouver formail. Ce programme est distribué conjointement avec procmail et son but est de modifier les en-têtes de courrier ou de reformater un message avant son envoi ou son emmagasinage.

DEFAULT
Fichier où un message est sauvegardé lorsque procmail ne peut lui appliquer une des règles définies.

N'importe où dans .procmailrc, on doit définir une variable d'environnement. Si la variable est écrite sans le symbole = suivi d'une valeur, cette variable sera effacée.

Les règles sont de deux types: celles qui considèrent le message comme livré suite à leur action et celles qui ne le font pas.

Les premières règles sont simples: après l'application de leur action, elles considèrent qu'aucune autre règle ne sera appliquée au message qui sera livré d'office.

Le règles de deuxième type, celles qui considèrent que le message n'est pas livré et de là appliquent leur action, sont très utiles lorsqu'on envisage la possibilité d'application de multiples règles et actions au même message avant qu'il ne soit livré.

La syntaxe générale d'une règle est la suivante:

 
           :0 [options] [ : [exclusion file] ] 
           * condition 1 
           * condition 2 
                 . 
                 . 
                 . 
           * condition N 
           command 
           

Analysons étape par étape sa signification. D'abord, chaque règle commence par un :0. Ensuite, viennent l'une de ces options:

H La condition est appliquée à l'en-tête du courrier.
B La condition est recherchée dans le corps du message.
D Lorsque la condition est recherchée, les cas supérieurs et inférieurs sont distincts.
A Cette règle est appliquée seulement si la précédente l'est.
a Comme A, excepté si l'exécution de la règle précédente ne prévoit aucune erreur.
E Cette règle s'exécute si la précédente ne l'est pas.
e Cette règle sera exécutée si la précédente l'est sans erreur.
h L'en-tête du message est transmis à la commande.
b Le corps du message est transmis à la commande.
f La commande est interprétée comme un filtre.
c Produire une copie-cabone cc du message. Lorsque la règle d'exécution considère le message livré avec un indicateur, alors l'une accomplit le travail de livraison et les règles suivantes font la copie-carbone du message.
w Attendre que la commande aie fini l'exécution de la réception du code de sortie.
W Comme la précédente mais dans le cas d'une erreur empêchant l'émission du message.
i Ignorer la possibilité d'erreurs de frappe.
r Ecrire le message tel qu'il est. Il n'y aura aucun test si ça se termine par une ligne vierge.

Par défault, si aucune option n'est spécifiée, la condition est testée sur l'en-tête du message (option H). La commande reçoit simultanément (entrée standard) l'en-tête et le corps du message (options h et b). Il n'y a aucune distinction entre un cas supérieur ou inférieur.

Après :0 et les autres options, un deuxième : devrait suivre afin d'indiquer la destination du message où il sera écrit et ceci afin de bloquer deux processus qui pourraient s'exécuter simultanément sur le fichier. Optionnellement, nous pouvons indiquer l'exclusion d'un fichier utilisé comme verrou.

Les conditions suivantes, une par ligne, sont précédées du caractère *. Habituellement, les conditions sont écrites comme des expressions régulières de façon à trouver une chaîne de caractères à l'intérieur de l'en-tête et du corps du message. Les expressions régulières utilisent, parmi d'autres, les symboles suivants:

^ Début d'une ligne.
$ Fin d'une ligne.
. Aucun caratère excepté un retour chariot
* Zéro fois ou plus.
+ Une fois ou plus.
? Zéro fois ou plus.
[a-z] Rangée de caractères: dans cet exemple de a à z.
[^a-z]Aucun caratère à l'extérieur de la rangéee de a à z.
a|b Soit 'a' ou 'b'

Une commande simple suit les conditions. Si le premier caractère de la commande est l'un des suivants, alors débute un comportement spécial:

! Le message est redirigé vers toutes les adresses courriel indiquées.
| Si ce symbole est suivi d'un commande, elle s'exécutera chaque fois que la condition est satisfaite. Si rien ne suit ce symbole, le texte entier du message ira vers une sortie standard. Si aucune variable ne suit un |, le résultat d'une telle commande est sauvegardé à l'intérieur de cette variable.

Listes de diffusion

Situation où procmail se révèle très utile dans la gestion de notre courrier. Supposons que nous nous sommes abonnés à trois listes de diffusion Linux, chaque liste étant identifée par l'adresse de son origine. Par exemple, nous pourrions avoir les adresses suivantes:

 
           l-linux@calvo.teleco.ulpgc.es 
           linux@nuclecu.unam.mx 
           linux-security@redhat.com 
         

Dans des conditions normales, les messages de ces listes de diffusion arrivent ensemble dans la même boîte de courrier et si rien n'est fait, ils y resteront entremêlés. Il serait bien plus agréable que le courrier entrant soit classé et sauvegardé dans des fichiers appropriés.

Procmail peut résoudre facilement ce problème. Nous pouvons utiliser le fichier .procmailrc qui classera, à l'aide des lignes suivantes, notre courrier des listes de diffusion Linux:

 
:0 
* ^From.*l-linux@calvo.teleco.ulpgc.es 
l-linux 
 
:0 
* ^From.*linux@nuclecu.unam.mx 
linux-mx 
 
:0 
* ^From.*linux-security@redhat.com 
linux-security 

Examinons attentivement l'une de ces règles. Si nous comprenons le principe des règles internes, il devient facile de comprendre la suite parce que le mécanisme de base reste le même.

D'abord, nous trouvons une chaîne :0 qui indique le début d'une nouvelle règle. Vu qu'il n'y a pas d'autres options, procmail prendra automatiquement les options par défaut de cette règle: les cas supérieurs et inférieurs n'étant pas distincts, la condition s'appliquera seulement à l'en-tête du message bien que la commande reçoive l'en-tête et le corps du message.

Dans la ligne suivante, on trouve la condition et ce qui était mentionné au préalable est toujours identifiable à cause du premier caratère qui est un *. La condition est l'expression régulière suivante:

^From.*linux@nuclecu.unam.mx

La sous-chaîne ^From dit à procmail de rechercher les lignes commençant par la chaîne From

.

Le caractère .* signifie: "quel que soit le nombre de caractères". Devant une expression régulière, un caractère . fait référence à zéro ou plus. Dans ce cas, .* signifie qu'après le sigle From, il peut y avoir zéro ou plusieurs caractères.

Suit linux@nuclecu.unam.mx, qui est l'adresse d'où proviennent les messages.

Si nous réfléchissons quelque peu à propos de ces expressions régulières, nous constaterons que les lignes suivantes sont reconnues par cette règle:

 
From: linux@nuclecu.unam.mx 
From:linux@nuclecu.unam.mx 
FROM linux@nuclecu.unam.mx 

Cette règle permet déjà de distinguer les messages venant de ces adresses des autres messages.

La ligne suivante est une commande (ou action) et indique quoi faire de ce message. Dans ce cas, il est sensé être livré vers le fichier linux-mx où il sera sauvegardé. Si le chemin (path) est indiqué, il sera pris en considération par rapport à la variable d'environnement $MAILDIR.

Les messages provenant de différentes listes peuvent maintenant être distribués selon leur origine vers les différents fichiers (de leur domaine).

Réponses automatiques

Dans le cas des réponses automatiques, procmail est aussi très utile. Par exemple si vous désirez envoyer automatiquement votre clé publique PGP à qui en fait la requête par courriel.

Pour ce faire, il faut écrire une règle qui considérera votre clé publique PGP dans chaque message à l'aide de la chaîne de caractères PGP dans le sujet du message. On écrira cette règle de cette façon:

 
0: 
* ^Subject.*PGP 
| (formail -r ; cat $HOME/key.asc) | sendmail -t 

La même idée peut être appliquée pour écrire un programme afin d'avertir les abonnés que nous serons en congé et que nous leur répondrons dès notre retour:

 
0: 
| (formail -r; cat $HOME/vacations.txt) | sendmail -t 

Dans ce dernier cas, il n'y a aucune condition et tous les messages enverront la même note.

Eviter les boucles infinies dans les réponses automatiques

Dans les exemples précédents, aucune tentative ne fut faite pour traiter des boucles infinies qui surviennent parfois lors d'une réponse automatique au courrier.

Si un message dont l'origine est votre adresse courriel, le programme enverra une réponse à cette adresse courriel et la réponse nous reviendra. Ce message enverra de nouveau une réponse une fois de plus et ainsi de suite créant une boucle infinie. Afin d'éviter cela, une ligne supplémentaire sera ajoutée dans l'en-tête du message pour indiquer que ce message a déjà reçu une réponse: c'est l'option A de formail:

formail -r -A"X-Loop: dir@email.es"

dir@email.es devrait être votre adresse courriel. Cette voie, générant l'en-tête d'une réponse, la ligne X-Loop est ajoutée ce qui vérifie la nouvelle règle:

 
:0 
* !^X-Loop: dir@email.es 
| (formail -r -A"X-Loop: dir@email.es" ;  
    cat $HOME/vacation.txt) | sendmail -t 

Cette règle évite les boucles infinies vu qu'il n'y a aucun message qui contienne dans son en-tête une ligne X-Loop qui ne satisfairait pas la condition et aurait comme résultat de n'avoir aucune réponse de la part de procmail.

Fichiers de décodage

Une autre règle intéressante de .procmailrc, est le fait qu'il décode automatiquement le courrier entrant encodé avec uuencode(1). Celle règle donnerait:

 
:0 B 
* ^begin 644 .* 
{ 
	MAILDIR=$HOME/files 
	 
	:0 
	| uudecode 
} 

Ici, il est explicitement indiqué que l'option B de la condition de cette règle ne s'applique qu'au corps du message.

Si la règle trouve une ligne débutant par la chaîne de caractères "begin 644", cela signifie qu'il a trouvé le début d'un fichier encodé avec uuencode(1), de là il établit la variable d'environnement MAILDIR, qui est l'équivalent d'un changement de répertoire pointant vers cette variable. A partir de ce moment, toutes les commandes d'impression ou d'affichage s'exécuteront vers le répertoire de base indiqué. Dans notre cas, nous sommes intéressés à ce que les messages reçus soient sauvegardés dans $HOME/files.

D'autre part, il y a une règle qui décodifie sans condition les messages avec uudecode(1). Le fichier original se trouve dans $HOME/files.

Conclusion

Après cette brève introduction, il est évident que procmail, logiciel très versatile, peut vous aider à gérer facilement et convivialement votre courrier. Je vous recommande de l'essayer avec des expressions et des règles simples et de les adapter par la suite à vos besoins parce que les possibilités de procmail vont au-delà de ce qui est possible de discuter dans une brève introduction.


Pour plus d'informations:
© 1998 Angel Lopez
Ce site est maintenu par Miguel A Sepulveda.
@