11.4. Agent de distribution de courrier (ADC)

Red Hat Enterprise Linux inclut deux ADC principaux, à savoir Procmail et mail. Ces deux applications sont considérées comme des agents de distribution locaux (ou ADL) et elles acheminent toutes les deux le courrier électronique du fichier spoule d'un ADC vers la boîte aux lettres de l'utilisateur. Toutefois, Procmail fournit un système de filtrage robuste.

Cette section examine seulement Procmail de façon détaillée. Pour toute information sur la commande mail, consultez la page de manuel qui lui est dédié.

Procmail distribue et filtre le courrier électronique dès qu'il est placé dans le fichier spoule de messagerie de l'hôte local. Il est puissant, peu exigeant en matière de ressources système et d'une utilisation courante. Procmail peut jouer un rôle critique dans la distribution du courrier qui sera lu par les applications client de messagerie.

Il existe différentes façons d'invoquer Procmail. Dès qu'un ATC dépose un message dans le fichier spoule de messagerie, Procmail est lancé. Ce dernier filtre et classe alors le message de manière à ce que l'AGC puisse le trouver puis quitte le processus. L'AGC peut également être configuré de sorte qu'il exécute Procmail chaque fois qu'un message est reçu afin que le courrier soit acheminé vers les boîtes aux lettres appropriées. Par défaut, la présence d'un fichier /etc/procmailrc ou d'un fichier .procmailrc (aussi appelé un fichier rc) dans le répertoire personnel d'un utilisateur invoquera Procmail dès qu'un ATC reçoit un nouveau message.

Toute action effectuée par Procmail sur un message électronique dépend de la capacité du message à satisfaire un ensemble de conditions ou recettes (aussi appelées recipes selon le terme anglais) particulières contenues dans le fichier rc. Si un message satisfait une recette, il peut alors être placé dans un fichier donné, être supprimé ou être traité d'une autre façon.

Lors du démarrage de Procmail, ce dernier lit les messages électroniques et sépare les informations relatives au corps du message de celles concernant l'en-tête. Ensuite, Procmail cherche les fichiers /etc/procmailrc et rc dans le répertoire /etc/procmailrcs pour trouver les variables d'environnement et recettes de Procmail s'appliquant par défaut à l'ensemble du système. Procmail cherche ensuite un fichier .procmailrc dans le répertoire personnel de l'utilisateur. De nombreux utilisateurs créent des fichiers rc supplémentaires pour Procmail, qui sont référencés dans leur fichier .procmailrc présent dans leur répertoire personnel.

Par défaut, aucun fichier rc s'appliquant à l'ensemble du système n'existe dans le répertoire /etc et aucun fichier .procmailrc n'existe dans le répertoire personnel de quelque utilisateur que ce soit. Par conséquent, pour utiliser Procmail, chaque utilisateur doit créer un fichier .procmailrc contenant des variables d'environnement et des règles spécifiques.

11.4.1. Configuration de Procmail

Les fichiers de configuration de Procmail contiennent des variables d'environnement importantes. Ces dernières précisent à Procmail les messages spécifiques devant être triés et le sort des messages qui ne satisfont aucune recette.

Ces variables d'environnement qui se trouvent généralement au début du fichier .procmailrc ont le format suivant :

<env-variable>="<value>"

Dans cet exemple, <env-variable> correspond au nom de la variable alors que l'élément <value> définit la variable elle-même.

La plupart des utilisateurs de Procmail De nombreuses n'utilisent pas de nombreuses variables d'environnement mais les plus importantes sont déjà définies par une valeur par défaut. La plupart du temps, les variables suivantes sont utilisées :

D'autres variables d'environnement importantes sont obtenues depuis le shell, comme LOGNAME, qui est le nom de connexion ; HOME, qui est l'emplacement du répertoire personnel ; et SHELL, qui est le shell par défaut.

Consultez la page de manuel de procmailrc pour obtenir des explications exhaustives sur les variables d'environnement ainsi que sur leurs valeurs par défaut.

11.4.2. Recettes Procmail

Les nouveaux utilisateurs trouvent généralement que les recettes constituent l'élément le plus difficile de l'apprentissage de l'utilisation de Procmail. Ce sentiment est compréhensible jusqu'à un certain point, étant donné que les recettes effectuent la comparaison avec les messages à l'aide d'expressions régulières, qui est un format spécifique utilisé pour spécifier des qualifications de concordance de chaînes. Ceci étant, les expressions régulières ne sont pas très difficiles à créer et sont encore moins difficiles à comprendre en les lisant. De plus, la cohérence avec laquelle les recettes Procmail sont écrites, sans tenir compte des expressions régulières, permet d'acquérir de bonnes connaissances facilement, simplement en examinant les exemples. Pour consulter des exemples de recette Procmail, reportez-vous à la Section 11.4.2.5.

Les recettes Procmail se présentent sous la forme suivante :

:0<flags>: <lockfile-name>

* <special-condition-character> <condition-1>
* <special-condition-character> <condition-2>
* <special-condition-character> <condition-N>

<special-action-character><action-to-perform>

Les deux premiers caractères d'une recette Procmail sont le symbole des deux-points et un zéro. Divers indicateurs (ou flags) peuvent être placés après le zéro pour contrôler la manière selon laquelle Procmail traite la recette. Le symbole des deux-points placé après la section <flags> spécifie qu'un fichier de verrouillage (lockfile) sera créé pour ce message. Si un fichier de verrouillage est créé, le nom peut être spécifié dans l'espace <lockfile-name>.

Une recette peut contenir plusieurs conditions servant à vérifier la concordance d'un message. S'il aucune condition n'est spécifiée, tous les messages auront une concordance positive avec la recette. Les expressions régulières sont placées dans certaines conditions de façon à faciliter la concordance avec les messages. Si des conditions multiples sont utilisées, elles doivent toutes obtenir la concordance pour que l'action soit exécutée. Les conditions sont vérifiées sur la base des indicateurs spécifiés dans la première ligne de la recette. Des caractères spéciaux facultatifs placés après le caractère * permettent de contrôler ultérieurement la condition.

L'option <action-to-perform> spécifie l'action exécutée lorsque le message correspond à l'une des conditions. Il ne peut y avoir qu'une action par recette. Dans de nombreux cas, le nom d'une boîte aux lettres est utilisé ici pour envoyer dans ce fichier les messages satisfaisant les conditions, permettant ainsi de trier le courrier. Des caractères d'action spéciaux peuvent également être utilisés avant que l'action ne soit spécifiée. Reportez-vous à la Section 11.4.2.4 pour obtenir de plus amples informations.

11.4.2.1. Recettes de distribution et de non-distribution

L'action utilisée si la recette correspond à un message donné détermine si cette dernière est considérée comme étant une recette de distribution ou de non-distribution. Une recette de distribution contient une action qui écrit le message dans un fichier, envoie le message à un autre programme ou réachemine le message vers une autre adresse électronique. Une recette de non-distribution couvre toutes les autres actions, telles que l'utilisation d'un bloc d'imbrication (également appelé nesting block). Un bloc d'imbrication est un ensemble d'actions contenues entre deux accolades, { }, qui sont exécutées sur des messages satisfaisant les conditions de la recette. Les blocs d'imbrication peuvent être emboîtés les uns dans les autres, offrant ainsi plus de contrôle pour l'identification et l'exécution d'actions sur des messages.

Lorsque des messages satisfont une recette de distribution, Procmail effectue l'action spécifiée et arrête de comparer le message à toute autre recette. Les messages qui satisfont les recettes de non-distribution continuent eux à être comparés aux autres recettes.

11.4.2.2. Indicateurs

Les indicateurs (ou flags) sont très importants pour déterminer la façon dont les conditions d'une recette sont comparées à un message. Les indicateurs suivants sont couramment utilisés :

  • A — Spécifie que cette recette n'est utilisée que si la recette précédente sans indicateur A ou a a également obtenu la concordance avec ce message.

  • a — Spécifie que cette recette n'est utilisée que si la recette précédente sans indicateur A ou a a également obtenu la concordance avec ce message et a été exécutée avec succès.

  • B — Analyse le corps du message et recherche des conditions de concordance.

  • b — Utilise le corps du message dans toute action découlant de cet indicateur, comme l'écriture du message dans un fichier ou son réacheminement. Il s'agit du comportement par défaut.

  • c — Génère une copie conforme du message électronique. Cette option peut être utile avec les recettes de distribution, étant donné que l'action requise peut être exécutée sur le message et que la copie du message peut continuer à être traitée dans les fichiers rc.

  • D — Rend la comparaison egrep sensible à la casse. Par défaut, le processus de comparaison n'est pas sensible à la casse.

  • E — Semblable à l'indicateur A sauf que les conditions dans cette recette sont comparées à un message seulement si la recette précédant immédiatement la recentte sans indicateur E n'a pas obtenu la concordance. Cette action ressemble à une action else.

  • e — Établit la comparaison de la recette au message seulement si l'action spécifiée dans la recette présente juste avant échoue.

  • f — Utilise le tube (aussi appelé pipe) comme filtre.

  • H — Analyse l'en-tête du message et recherche des conditions de concordance. Cette situation se produit par défaut.

  • h — Utilise l'en-tête dans une action découlant de cet indicateur. Ce dernier représente le comportement par défaut.

  • w — Indique à Procmail d'attendre que le filtre ou le programme spécifiés aient terminé leurs opérations et rapporte si l'opération précédente a réussi ou échoué, avant de considérer le message comme étant filtré.

  • W — Identique à w sauf que les messages de type "Échec du programme" (ou Program failure) sont supprimés.

Pour obtenir une liste détaillée d'indicateurs supplémentaires, reportez-vous à la page de manuel de procmailrc.

11.4.2.3. Spécification d'un fichier de verrouillage local

Les fichiers de verrouillage sont très utiles avec Procmail pour garantir que seul un processus essaie de modifier un certain message à un moment donné. Il est possible de spécifier un fichier de verrouillage local en plaçant le symbole des deux points (:) après tout indicateur dans la première ligne d'une recette. Ce faisant, un fichier de verrouillage local est créé en fonction du nom de fichier de destination et de toute valeur contenue dans la variable d'environnement globale LOCKEXT.

Vous pouvez aussi spécifier le nom du fichier de verrouillage local à utiliser avec cette recette après le symbole des deux points (:).

11.4.2.4. Conditions et actions spéciales

Des caractères spéciaux utilisés avant les conditions de recettes et et avant les actions de Procmail modifient la façon selon aquelle elles sont interprétées.

Les caractères suivants peuvent être utilisés après le symbole * au début de la ligne de condition d'une recette :

  • ! — Placé dans la ligne de condition, ce caractère inverse la condition, de sorte que la concordance sera désormais établie seulement si la condition ne satisfait pas le message.

  • < — Vérifie si la taille du message est inférieure à un nombre d'octets spécifié.

  • > — Vérifie si la taille du message est supérieure à un nombre d'octets spécifié.

Les caractères suivants sont utilisés pour exécuter des actions spéciales :

  • ! — Placé dans la ligne d'action, ce caractère indique à Procmail de réacheminer le message vers les adresses électroniques spécifiées.

  • $ — Renvoie à une variable définie précédemment dans le fichier rc. Cette option est généralement utilisée pour définir une boîte aux lettres commune à laquelle diverses recettes feront référence.

  • | — Démarre un programme spécifié afin qu'il traite le message.

  • { and } — Construit un bloc d'imbrication, utilisé pour contenir des recettes supplémentaires devant être appliquer aux messages satisfaisant les conditions.

Si aucun caractère spécial n'est utilisé au début de la ligne d'action, Procmail considère que la ligne d'action spécifie la boîte aux lettres où les messages doivent être déposés.

11.4.2.5. Exemples de recettes

Procmail est certes un programme extrêmement flexible, mais en raison de cette flexibilité, la création d'une recette Procmail de toutes pièces peut être une tâche difficile pour de nouveaux utilisateurs.

Le meilleure façon de développer les capacités nécessaires pour créer les conditions des recettes Procmail consiste à bien comprendre la notion d'expressions régulières et à examiner de nombreux exemples élaborés par d'autres. Une explication exhaustive des expressions régulières va au-delà de la portée de cette section. La structure des recettes Procmail ainsi que des exemples de recettes Procmail sont disponibles à différents endroits sur Internet (notamment à l'adresse suivante : http://www.iki.fi/era/procmail/links.html). En examinant ces exemples de recettes, il est possible d'acquérir des connaissances solides sur la bonne utilisation et sur l'adaptation des expressions régulières. En outre, des informations élémentaires sur des règles d'expressions régulières de base se trouvent dans la page de manuel de grep.

Les simples exemples reproduits ci-dessous illustrent la structure 'élémentaire de recettes Procmail et peuvent servir de base pour des conceptions plus élaborées.

Une recette élémentaire ne contient pas forcément de conditions, comme le montre l'exemple ci-dessous :

:0:
new-mail.spool

La première ligne spécifie qu'un fichier de verrouillage local doit être créé, mais n'indique aucun nom. Procmail utilise donc le nom du fichier de destination et y ajoute la valeur spécifiée dans la variable d'environnement LOCKEXT. Étant donné qu'aucune condition n'est spécifiée, tous les messages satisfont cette recette et sont par conséquent placés dans le fichier spoule unique appelé new-mail.spool qui se trouve dans le répertoire spécifié par la variable d'environnement MAILDIR. Un AGC peut ensuite visualiser les messages dans ce fichier.

Une recette de base, telle que celle-ci, peut être placée à la fin de tous les fichiers rc afin que les messages soient acheminés vers un emplacement par défaut.

L'exemple ci-dessous illustre l'etablissement de la concordance avec des messages d'une adresse électronique spécifique et le dépôt de ces derniers dans la corbeille.

:0
* ^From: spammer@domain.com
/dev/null

Dans cet exemple, tout message envoyé par spammer@domain.com est acheminé vers le périphérique/dev/null où il est supprimé.

AttentionAvertissement
 

Assurez-vous que les règles fonctionnent bien comme vous le désirez avant d'acheminer les messages concernés vers /dev/null afin qu'ils soient supprimés de façon permanente. Si les conditions de votre recette retiennent accidentellement des messages qui ne devraient pas l'être et qu'ils disparaissent sans laisser de trace, il est alors difficile de résoudre tout problème lié à la règle.

Une solution plus appropriée consiste à pointer l'action de la recette vers une boîte aux lettres spéciale qui peut être vérifiée de temps en temps, afin de voir si elle contient de fausses concordances. Une fois convaincu qu'aucun message ne fait l'objet d'une concordance accidentelle, supprimez la boîte aux lettres et établissez l'action de façon à ce qu'elle envoie les messages vers /dev/null.

La recette ci-dessous retient les messages envoyés depuis une liste de diffusion spécifique et les place dans un dossier déterminé.

:0:
* ^(From|CC|To).*tux-lug
tuxlug

Tout message envoyé depuis la liste de diffusion tux-lug@domain.com est automatiquement placé dans la boîte aux lettres tuxlug pour le AGC. Notez que la condition dans cet exemple a une concordance avec le message si l'adresse électronique de la liste de diffusion se trouve sur l'une des lignes suivantes : From (De), CC ou To (À).

Pour obtenir des informations sur des recettes plus détaillées et plus puissantes, consultez l'une des nombreuses ressources disponibles dans la Section 11.6.

11.4.2.6. Filtres de spam

Puisque Procmail est appelé par Sendmail, Postfix et Fetchmail lors de la réception de nouveaux messages, il peut être utilisé comme un outil puissant pour combattre le pourriel.

Le combat contre le pourriel est encore plus efficace lorsque Procmail est utilisé de concert avec SpamAssassin. En effet, grâce à une double action ces deux applications peuvent rapidement identifier des messages-pourriel, les trier et les détruire.

SpamAssassin recours à une analyse de l'en-tête et du texte, à des listes noires et à des bases de données de localisation de spam ainsi qu'à une analyse bayesienne auto-organisatrice de pourriel pour identifier et étiqueter rapidement et précisément tout pourriel (aussi appelé spam).

Pour un utilisateur local, la meilleure façon d'utiliser SpamAssassin consiste à insérer la ligne suivante vers le haut du fichier ~/.procmailrc :

INCLUDERC=/etc/mail/spamassassin/spamassassin-default.rc

Le programme /etc/mail/spamassassin/spamassassin-default.rc contient une simple règle Procmail permettant d'activer SpamAssassin pour tout courrier électronique reçu. Si un message est reconnu comme étant un pourriel, il est étiqueté en tant que tel dans l'en-tête et la mention suivante est ajoutée au sujet :

*****SPAM*****

Le corps du message de l'email est précédé d'un compte-rendu des éléments ayant justifié le diagnostic de spam.

Pour classer les emails étiquetés en tant que pourriel, il est possible d'utiliser une règle semblable à celle reproduite ci-dessous :

:0 Hw
* ^X-Spam-Status: Yes
spam

Selon cette règle, tous les messages étiquetés en tant que spam dans l'en-tête sont rangés dans une boîte aux lettres nommée spam.

Étant donné que SpamAssassin est un script Perl, il sera peut-être nécessaire d'utiliser le démon binaire SpamAssassin (spamd) et l'application client (spamc) sur des serveurs très sollicités. Pour configurer SpamAssassin de la sorte, il est nécessaire d'avoir un accès super-utilisateur à l'hôte.

Pour lancer le démon spamd, tapez la commande suivante en étant connecté en tant que super-utilisateur (ou root) :

/sbin/service spamassassin start

Pour lancer le démon SpamAssassin lors du démarrage du système, utilisez un utilitaire initscript, comme l'Outil de configuration des services (system-config-services), pour activer le service spamassassin. Reportez-vous à la Section 1.4.2 pour obtenir de plus amples informations sur les utilitaires initscript.

Pour configurer Procmail afin qu'il utilise l'application client SpamAssassin au lieu du script Perl, placez le ligne suivante vers le haut du fichier ~/.procmailrc. Pour une configuration s'appliquant à tout le système, placez cette dernière dans /etc/procmailrc :

INCLUDERC=/etc/mail/spamassassin/spamassassin-spamc.rc