| InstallationD'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 BaseProcmail 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. ConfigurationLe 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:  MAILDIRIndique à 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é.
 LOGFILEIndique le nom du fichier d'appel noté où procmail laisse les 	enregistrements de toutes les transactions.
 SENDMAILIndique où trouver sendmail qui sera utilisé automatiquement lors des 	messages réponses.
 FORMAILIndique 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.
 DEFAULTFichier 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 diffusionSituation 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 automatiquesDans 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" 
 Où 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écodageUne 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. ConclusionAprè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. |