Procmail est un programme qui sert à filtrer les courriers
électroniques. Grâce à lui, vous pouvez rediriger votre mail, le trier
ou vous protéger contre le spam. Vous pouvez configurer votre mail
avec un .procmailrc
.
.procmailrc
Un .procmailrc
commence par les lignes
suivantes :
PATH=/bin:/usr/bin MAILDIR=$HOME/Mail LOGFILE=$MAILDIR/procmail.log
PATH=/bin:/usr/bin
MAILDIR=$HOME/Mail
LOGFILE=$MAILDIR/procmail.log
Les « recettes » (recipes) sont les éléments de
base du .procmailrc
. Leur principe est le suivant :
on commence par spécifier des conditions (une condition dit à procmail
ce qu'il doit regarder dans le courrier, par exemple l'adresse de
l'expéditeur, ou encore le champ « Sujet ») puis on indique l'action à
accomplir si les conditions sont remplies (par exemple, rediriger le
courrier, ou l'envoyer à la poubelle).
Une recette a toujours le format suivant (le # introduit un commentaire pour expliquer le code, vous n'avez pas à recopier la partie après le #) :
:0 [drapeau(x)] [: [fichier verrou] ] * condition(s) # Les conditions commencent chacune par * action à accomplir
Pour spécifier les conditions, on se sert d'expressions régulières. Une expression régulière est une notation permettant de définir des schémas de recherche. Pour cela, on se sert de métacaractères, aussi appelés jokers.
Joker | Signification |
---|---|
^ | Début de ligne |
$ | Fin de ligne |
. | Un caractère quelconque |
[xy] | N'importe quel caractère dans l'ensemble spécifié |
[^xy] | N'importe quel caractère hors de l'ensemble spécifié |
foo|bar | foo ou bar |
c* | Un nombre quelconque (même 0) de répétitions du caractère c |
Quelques exemples :
^From:
: cette condition vise toutes les chaînes
de caractère From:
au début d'une ligne. On dirait une
en-tête de courrier électronique, non ? :-)^From:.*choupi.*
: cette condition vise toutes
les chaînes de caractère From:
au début d'une ligne,
suivies d'un ou plusieurs caractères, puis de choupi, puis d'un ou
plusieurs autres caractères. Cette fois, on a défini l'ensemble des
mails provenant d'une adresse contenant l'expression choupi : de
cette façon, on vise tous les mails provenant de Choupi, votre
meilleur ami.^(From|Cc|To).*choupi.*
cette fois, on vise
tous les mails qui viennent de Choupi, ceux où Choupi est en Cc:, et
ceux adressés à Choupi.Pour rediriger votre courrier électronique vers une autre adresse, c'est simple :
:0 # il n'y a pas de condition : tous les courriers sont concernés ! toto@northpole.foo # le "!" demande le forward vers l'adresse spécifiée
Toujours plus fort, maintenant . Imaginons que vous soyiez un fan de Scoubidou. Votre page web porte sur Scoubidou. Choupi (votre meilleur ami, souvenez-vous), vous a aidé à le réaliser. Vous souhaitez relayer les courriers qui vous arrivent et qui parlent de Scoubidou à Choupi. Avec procmail, vous pouvez le faire.
:0 * ^Subject:.*Scoubidou.* # Concernés : tous les mails dont le sujet contient « Scoubidou » ! choupi@scoubidou-fan.com # On forwarde à Choupi
Comme vous pourrez le constater, les conditions peuvent porter sur tous les champs d'un courrier électronique : From, To, CC, Bcc, etc.
Ajoutons que dans cet exemple, vous souhaiteriez sans doute vous aussi lire les courriers « Scoubidou. » Avec la recette ci-dessus, ces courriers sont simplement reexpédiés vers Choupi, et vous ne les avez jamais dans votre boîte aux lettres. Nous allors utiliser un drapeau (flag) qui est une sorte d'option, qui modifie le comportement standard de procmail. Il suffit d'ajouter c après le :0, ce qui demande à procmail de copier dans le répertoire de mail les courriers qui arrivent. L'exemple complet est donc le suivant :
:0 c * ^Subject:.*Scoubidou.* # Concernés : tous les mails dont le sujet contient « Scoubidou » ! choupi@scoubidou-fan.com # On forwarde à Choupi
La plupart des spams sont des mails provenant d'expéditeurs bidons et différents à chaque fois, et qui ont pour point commun de vous promettre de l'argent, de vous proposer du Viagra, des diplômes par cher, et autres joyeusetés. Procmail vous permet d'identifier plus ou moins ces mails en fonction de leur sujet, et de les envoyer directement à la poubelle. De même, le filtrage par sujet permet de filtrer les mails pyramidaux (chaînes de l'amitié, fausses alertes de virus, etc.), que vous pouvez être amené à recevoir plusieurs fois.
Dans l'exemple suivant, vous allez filtrer tous les mails dont le sujet contient le mot « Viagra. »
:0 * ^Subject:.*Viagra.* /dev/null
Vous pouvez également utiliser la syntaxe suivante :
:0 * ^Subject:.*Viagra.* { EXITCODE=67 HOST }
Pourquoi cet EXITCODE et pas /dev/null (la poubelle) ? Ce
code renvoie une « address unknown » à l'expéditeur du courrier
électronique (pour avoir la liste de tous ces codes, lire
/usr/include/sysexits.h
).
Utiliser un exitcode
n'est pas toujours une bonne
idée. Certes, il vous procure la satisfaction de renvoyer au spammeur
ses spams. Mais cela ne sert pas à grand chose : bien souvent, le
spammeur filtre les messages d'erreur qui lui sont renvoyés. Que vous
fassiez le mort (en reroutant les spams vers /dev/null) ou que vous
lui renvoyez 150 messages d'erreur ne l'empêchera pas de continuer à
vous spammer s'il y tient. D'autre part, mettre des exitcodes dans son
.procmailrc
peut être gênant pour vous.
Vous est-il déjà arrivé de recevoir, après avoir envoyé un mail à un
camarade de l'Ecole, un courrier avec le sujet "Returned mail:
Can't create output"
, et contenant le message cryptique
suivant ?
----- The following address had permanent fatal errors ----- <pikachu@clipper.ens.fr>
Cela est certainement dû à un exitcode dans un
.procmailrc
...
Dans d'autres cas, vous pouvez très bien connaître l'adresse électronique de ceux qui vous spamment. Ce peut être une liste de diffusion à laquelle vous avez été abonné, volontairement ou non, et à laquelle les administrateurs de la liste ne vous désabonnent pas. La recette qu'il vous faut est la suivante : tous les courriers provenant de l'adresse spam@foo.bar seront impitoyablement envoyés à la poubelle (dans /dev/null, en fait).
:0 * ^From.*spam@foo.bar /dev/null
Cette recette est particulièrement utile pour les listes de diffusion (mailing-lists) : vous pouvez envoyer tous les courriers provenant de la liste directement dans un dossier spécial, qui contiendra seulement les courriers de ce genre.
Admettons que vous apparteniez à la liste des amis de
Scoubidou. Cette liste a pour adresse
scoubidou@zoinx.foo
, et tous les courriers de la liste
ont pour champ expéditeur :
To: Les Amis de Scoubidou <scoubidou@zoinx.foo>
Vous voulez regrouper les courriers de la liste dans un dossier appelé « scoubidou. » La recette qu'il vous faut est la suivant :
:0: # Le dernier ":" demande l'utilisation d'un fichier verrou * ^To.*scoubidou@zoinx.foo # La condition : tous les fichiers # contenant 'scoubidou@zoinx.foo' # dans le champ 'To: ' $HOME/Mail/scoubidou # Action : placer tous ces mails dans le dossier # « Scoubidou »
À quoi sert le fichier verrou ? Imaginons que deux courriers de la liste arrivent en même temps : deux procmails essaieront d'envoyer les deux messages dans le dossier en même temps. Si vous utilisez un fichier verrou, le premier procmail verrouillera le dossier pendant qu'il écrira son message dans le dossier, empêchant ainsi le second message d'y accéder. Une fois que le premier procmail aura fait son travail, le second prendra le relais en toute sécurité.
Il faut tout d'abord ajouter dans votre .zshrc les lignes suivantes :
MAILPATH="$MAIL:$HOME/mail/Scoubidou?You have new mail in Scoubidou." export MAILPATH
Ensuite, dans votre .procmailrc
,
:0 * ^(To:|Cc:).*scoubidou@zoinx.foo.* { :0c | touch $HOME/mail/Scoubidou :0 mail/Scoubidou }
Cette recette se substitue bien évidemment à la précédente.
Un dernier exemple pour la route ! Encore plus fort, maintenant ! Nous allons reprendre l'exemple du courrier à relayer à votre ami Choupi. Dans l'état où nous vous avions laissé, vous saviez lui relayer le courrier contenant « Scoubidou » dans le sujet et en garder une copie chez vous. Maintenant nous allons vous montrer comment faire ceci, mais en envoyant vos copies à vous dans le dossier « Scoubi. » Il s'agit donc d'une recette constituée de deux recettes imbriquées (chaque recette commence par un :0, souvenez-vous) :
:0: * ^Subject:.*Scoubidou.* # Cf. ci-dessus { :0 c ! choupi@scoubidou-fan.com # On fait suivre vers Choupi :0 # et en plus de ça... $HOME/Mail/scoubi # ... on dépose la copie dans le dossier « Scoubi » }
Ceci ne montre qu'une partie des possibilités de procmail. Vous
pouvez faire beaucoup de choses plus compliquées mais tout aussi
utiles : ajouter systématiquement un champ (Reply-To, par
exemple), éviter les boucles... Pour davantage de renseignements,
consultez les pages de man. man procmail
est une
description de procmail lui-même. Vous y trouverez les options de
procmail, man procmailrc
est très complet mais
indubitablement compliqué. man procmailsc
est à réserver
aux experts de procmail. man procmailex
propose des
exemples prêts à utilisation. C'est sans doute la page de man la plus
utile pour celui qui veut se familiariser davantage avec procmail.