tuteurs.ens.fr/internet/courrier/procmail.tml
mlnguyen c09303de02 Changement de mise en page pour les références aux pages de man, à la
fin du fichier. Référence à la nouvelle page sur l'aide d'Unix.
2004-01-08 22:27:51 +00:00

579 lines
19 KiB
XML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html
PUBLIC "-//ENS/Tuteurs//DTD TML 1//EN"
"tuteurs://DTD/tml.dtd">
<html>
<head>
<title>Procmail</title>
</head>
<body>
<h1>Filtrer son courrier électronique avec procmail</h1>
<h2>À quoi sert procmail&nbsp;?</h2>
<p>Procmail est un programme très puissant qui sert à filtrer les
courriers électroniques. Grâce à lui, vous pouvez rediriger votre
mail, le trier ou encore vous protéger contre le spam.
</p>
<p>
Pour donner des instructions à <code>procmail</code>, il vous faut
créer un fichier nommé <code>.procmailrc</code> (dans le monde Unix,
les fichiers commençant par un point et terminant par « rc » sont
souvent des fichiers de configuarion).
</p>
<div class="attention"><h1><img
src="&url.tuteurs;icones/panneau_attention.png" alt="/!\" />
Attention&nbsp;! <img src="&url.tuteurs;icones/panneau_attention.png"
alt="/!\" /></h1> Lisez bien l'<strong>intégralité</strong> de ce
tutorial, surtout les avertissement, avant d'installer un
<code>.procmailrc</code>. Procmail est un outil puissant et
dangereux. Vous risquez de perdre des courriers importants en
recopiant n'importe quoi à tort et à travers. Mieux vaut passer 5 min
de plus à lire tout plutôt que devoir dire coucou au SPI parce que vous
aurez perdu du courrier... </div>
<h2>Actualité : virus par mail</h2>
<p>
Le <a href="&url.tuteurs;internet/virus.html">virus</a> Sobig.F, qui
sévit depuis la mi-août 2003, est un ver qui se répand en envoyant
massivement du courrier aux adresses trouvées sur le disque dur de la
machine infectée. Si vous lisez votre courrier uniquement depuis
clipper (ce que soit dans les salles élèves ou en vous connectant à
distance sur clipper), vous ne courez aucun risque, seulement celui de
voir votre boîte aux lettres pleine de spam... Sachez également que ce
virus a très fortement perturbé le service du courrier à l'ENS pendant
une dizaine de jours...
</p>
<p>Les caractéristiques du virus sont les suivantes :
</p>
<ul>
<li> sujet : "Re: Details", "Re: Approved", "Re: Re: My details",
"Re: Thank you!", "Re: That movie", "Re: Wicked screensaver", "Re:
Your application", "Thank you!", "Your details"</li>
<li> message lui-même : "See the attached file for details", "Please
see the attached file for details"</li>
<li> attachement en <code>.pif</code></li>
</ul>
<p>
Pour le filtrer, la meilleure solution est d'utiliser
<code>procmail</code>. Il vous suffit d'ajouter à la suite de votre
fichier <code>.procmailrc</code> la règle de filtrage suivante :
</p>
<pre>
# Filtre de Sobig.F
:0
* ^Subject: (R[eE]: *)*(Approved|Thank you!|Wicked screensaver \
|Your application|Your details|My details|Details|That movie)$
{
:0 B
* See the attached file for details
/dev/null
}
</pre>
<p>
Si vous n'avez pas de <code>.procmailrc</code> sur votre comptez,
lisez ce qui suit pour vous en créer un ! N'hésitez pas à nous
contacter au moindre problème.
</p>
<h2>Ce que doit contenir un <code>.procmailrc</code></h2>
<p>
Commencez par créer un fichier nommé <code>.procmailrc</code> avec
votre éditeur préféré, puis copiez-collez les instructions qui suivent
(nous vous expliquons ci-dessous ce qu'elles veulent dire) :
</p>
<pre>
PATH=/bin:/usr/bin
MAILDIR=$HOME/Mail
LOGFILE=$MAILDIR/procmail.log
SPAMBOX=spam
</pre>
<p>Explication ligne par ligne :</p>
<dl>
<dt><code>PATH=/bin:/usr/bin</code></dt>
<dd>On indique à procmail le chemin des programmes qu'il va
utiliser.</dd>
<dt><code>MAILDIR=$HOME/Mail</code></dt>
<dd>On indique à procmail où se trouve votre répertoire de mail.</dd>
<dt><code>LOGFILE=$MAILDIR/procmail.log</code></dt>
<dd>On indique à procmail le nom d'un fichier où il mettra tous ses
rapports d'activité et ses messages d'erreur (les <em>logs</em>). Les
logs sont précieux pour faire des tests.</dd>
<dt><code>SPAMBOX=spam</code></dt>
<dd>Cette ligne crée une « boîte à spam » (le répertoire
<code>$HOME/mail/spam</code>) dans votre boîte aux lettres. C'est là
que partiront les courriers suspects. Voire <a
href="#spambox">infra</a>.</dd>
</dl>
<p>
Ces instructions de début sont la base pour faire marcher correctement
<code>procmail</code>, mais en soi, elles ne suffisent pas. Il vous
faudra spécifier, dans la suite du fichier, ce que vous voulez filtrer
à l'aide de règles de filtrage. C'est ce que nous vous expliquons
ci-dessous.
</p>
<div class="attention">Syntaxe : les retours à la ligne sont
importants. Ne recopiez pas tout à la suite. Les lignes commençant par
# sont des commentaires. De manière générale, ne prennez pas
d'initiative pour changer les recettes présentées ici si vous ne savez
pas ce que vous faites.</div>
<h2>Comment ça marche&nbsp;?</h2>
<h3>Les règles de filtrage</h3>
<p>Les « recettes » (<em lang="en">recipes</em>) sont les éléments de
base du <code>.procmailrc</code>. Leur principe est le suivant&nbsp;:
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).</p>
<p>
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 #)&nbsp;:</p>
<pre>
:0 [<a href="#flag">drapeau(x)</a>] [: [<a href="#lock">fichier verrou</a>] ]
# Les conditions commencent chacune par *
* condition(s)
action à accomplir
</pre>
<p>
Chaque recette s'ajoute dans le fichier <code>.procmailrc</code>, à la
suite du bloc de début (voir <a href="#s2">ci-dessus</a>).
</p>
<h3>Expressions régulières</h3>
<p>
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.
</p>
<table cellspacing="5" cellpadding="5" border="5">
<tr>
<th>Joker</th>
<th>Signification</th>
</tr><tr>
<td>^</td>
<td>Début de ligne</td>
</tr><tr>
<td>$</td>
<td>Fin de ligne</td>
</tr><tr>
<td>.</td>
<td>Un caractère quelconque</td>
</tr><tr>
<td>[xy]</td>
<td>N'importe quel caractère dans l'ensemble spécifié</td>
</tr><tr>
<td>[^xy]</td>
<td>N'importe quel caractère hors de l'ensemble spécifié</td>
</tr><tr>
<td>foo|bar</td>
<td>foo ou bar</td>
</tr><tr>
<td>c*</td>
<td>Un nombre quelconque (même 0) de répétitions du caractère c</td>
</tr>
</table>
<p><br />Quelques exemples&nbsp;:</p>
<ul>
<li><code>^From:</code>&nbsp;: cette condition vise toutes les chaînes
de caractère <code>From:</code> au début d'une ligne. On dirait une
en-tête de courrier électronique, non&nbsp;? :-)</li>
<li><code>^From:.*choupi.*</code>&nbsp;: cette condition vise toutes
les chaînes de caractère <code>From:</code> 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&nbsp;: de
cette façon, on vise tous les mails provenant de Choupi, votre
meilleur ami.</li>
<li><code>^(From|Cc|To).*choupi.*</code>&nbsp; cette fois, on vise
tous les mails qui viennent de Choupi, ceux où Choupi est en Cc:, et
ceux adressés à Choupi.</li>
</ul>
<h3>Rediriger certains mails vers une autre adresse électronique</h3>
<h4>Redirection de base</h4>
<p>
Pour rediriger votre courrier électronique vers une autre adresse,
c'est simple. Ici, on redirige le courrier vers l'adresse
<code>toto@polenord.pn</code>. Il n'y pas de condition (cela concerne
tous les mails). Le point d'exclamation (!) sert à dire qu'il faut
faire une redirection. Ajoutez donc à votre <code>.procmailrc</code>
la règle suivante :</p>
<pre>
:0
! toto@polenord.pn
</pre>
<h4>Redirection avec conditions</h4>
<p>
Toujours plus fort, maintenant&nbsp;. 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.
</p>
<pre>:0
# Concernés&nbsp;: tous les mails dont le sujet contient « Scoubidou »
* ^Subject:.*Scoubidou.*
# On forwarde à Choupi
! choupi@scoubidou-fan.com
</pre>
<p> Comme vous pourrez le constater, les conditions peuvent porter sur
tous les champs d'un courrier électronique&nbsp;: From, To, CC, Bcc,
etc.</p>
<p>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 <a
name="flag">drapeau</a> (<em lang="en">flag</em>) qui est une sorte
d'option, qui modifie le comportement standard de procmail. Il suffit
d'ajouter c après le&nbsp;:0, ce qui demande à procmail de copier dans
le répertoire de mail les courriers qui arrivent. L'exemple complet
est donc le suivant&nbsp;:</p>
<pre>
:0 c
# Concernés&nbsp;: tous les mails dont le sujet contient « Scoubidou »
* ^Subject:.*Scoubidou.*
# On forwarde à Choupi
! choupi@scoubidou-fan.com
</pre>
<h3>Filtrer le spam</h3>
<p>
On appelle « spam » le courrier électronique envoyé en masse, non
sollicité, généralement publicitaire. Un filtre tel que
<code>procmail</code> vous permet de lutter contre ce phénomène, mais
il est plus efficace d'avoir une stratégie d'ensemble combinant
logiciel anti-spam, filtre et prévention. Référez-vous à notre <a
href="antispam.html">page anti-spam</a> pour en savoir plus.
</p>
<h4>Filtrer suivant le sujet</h4>
<p> 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.
</p>
<p>
Dans l'exemple suivant, vous allez filtrer tous les mails dont le
sujet contient le mot « Viagra » en les envoyant vers votre poubelle à
spam, <code>$HOME/mail/spam</code>. Voire <a href="#spambox">infra</a>
pour plus d'explication.
</p>
<pre>
:0
# Sont visés tous les mails dont le sujet contient Viagra
* ^Subject: .*Viagra.*
# Et on les envoie à la poubelle à spam
$SPAMBOX
</pre>
<h4>Filtrer suivant l'expéditeur</h4>
<p> 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&nbsp;: tous les courriers
provenant de l'adresse <code>spammeur@tagada.com</code> seront
impitoyablement envoyés dans votre boîte à spam.</p>
<pre>
:0
* ^From: .*spammeur@tagada.com
$SPAMBOX
</pre>
<h4>Filtrer suivant l'encodage</h4>
<p>Vous recevez beaucoup de mails en provenance de Corée, qui sont un
charabia illisible. Vous voudriez les filtrer. On rappelle que
procmail peut filtrer sur n'importe quel en-tête de message. Si vous
regardez les en-têtes d'un spam coréen (appuyez sur <code>H</code>,
que vous utilisiez mutt ou pine, pour y avoir accès), vous verrez un
champ appelé <code>Content-type</code>. Dans ce champ est déclaré
<code>charset="ks_c_5601-1987"</code>. Il vous suffit de filtrer cet
encodagespour être débarrassé de la plupart des spams
coréens&nbsp;:</p>
<pre>
:0
* ^Content-Type: .*charset="ks_c_5601-1987"*
$SPAMBOX
</pre>
<p>De manière plus perverse, certains spams coréens ne déclarent pas
leur encodage au bon endroit, pour éviter justement ce genre de
filtres. L'encodage est alors annoncé dans le sujet. Pour y remédier,
ajoutez simplement&nbsp;:</p>
<pre>
:0
* ^Subject: .*EUC-KR.*
$SPAMBOX
:0
* ^Subject: .*ks_c_5601-1987.*
$SPAMBOX
</pre>
<p>
Si vous êtes sûr de ne pas vouloir de mails en encodage coréen, vous
pouvez mettre ces mails à la poubelle au lieu de les mettre adns la
boîte à spam. Sur UNIX, la poubelle est
<code>/dev/null</code>. Attention, contrairement à la poubelle de
Windows ou MacOS, il n'y a pas de filet de sécurité, on ne peut plus
récupérer les données une fois poubellisées. Ceci donne :
</p>
<pre>
:0
* ^Subject: .*EUC-KR.*
/dev/null
</pre>
<div class="attention"><h1><img
src="&url.tuteurs;icones/panneau_attention.png" alt="/!\" />
Attention&nbsp;! <img src="&url.tuteurs;icones/panneau_attention.png"
alt="/!\" /></h1> La présence d'un <code>/dev/null</code> dans votre
<code>.procmailrc</code> est dangereuse&nbsp;: la moindre erreur de
syntaxe, la moindre coquille est susceptible d'envoyer tout votre mail
dans <code>/dev/null</code>, soit le vide intersidéral d'où vous ne
pouvez récupérer aucun courrier. En cas d'accident, vous pouvez vous
adresser au SPI, mais faites particulièrement attention en éditant
votre <code>.procmailrc</code>.</div>
<h4>Trop de filtres nuit</h4>
<div class="attention"><h1><img
src="&url.tuteurs;icones/panneau_attention.png" alt="/!\" />
Attention&nbsp;! <img src="&url.tuteurs;icones/panneau_attention.png"
alt="/!\" /></h1> En installant des filtres anti-spam&nbsp;: vous
prenez le risque d'écarter des courriers qui en fait n'en sont pas,
mais qui répondent tout de même à vos règles.</div>
<p>Ce sera le cas d'un prof coréen qui vous écrit si vous filtrez les
encodages coréens, d'un courrier parlant de FreeBSD si vous filtrez le
mot &#171; free &#187;, d'un courrier dont le sujet contient
« bissextile » si vous filtrez « sex », etc. Plus vos règles sont
strictes, moins vous recevrez de spam, mais plus vous aurez de chances
de perdre du courrier.</p>
<p>Pour cette raison, il vaut parfois mieux envoyer les courriers
suspects dans un dossier spécial, appelé &#171; spam &#187;, par
exemple. Voir ci-dessous comment faire.</p>
<h3>Envoyer directement certains mails dans un dossier
particulier</h3>
<p> Cette recette est particulièrement utile pour les listes de
diffusion (<em lang="en">mailing-lists</em>)&nbsp;: vous pouvez envoyer
tous les courriers provenant de la liste directement dans un dossier
spécial, qui contiendra seulement les courriers de ce genre.</p>
<p> Admettons que vous apparteniez à la liste des amis de
Scoubidou. Cette liste a pour adresse
<code>scoubidou@zoinx.foo</code>, et tous les courriers de la liste
ont pour champ expéditeur&nbsp;:</p>
<pre>
To: Les Amis de Scoubidou &lt;scoubidou@zoinx.foo&gt;
</pre>
<p>Vous voulez regrouper les courriers de la liste dans un dossier
appelé « scoubidou. » La recette qu'il vous faut est la
suivant&nbsp;:</p>
<pre>
# Le dernier ":" demande l'utilisation d'un fichier verrou
:0:
# La condition&nbsp;: tous les fichiers contenant 'scoubidou@zoinx.foo'
# dans le champ 'To: '
* ^To.*scoubidou@zoinx.foo
# Action&nbsp;: placer tous ces mails dans le dossier « Scoubidou »
$HOME/Mail/scoubidou
</pre>
<p>À quoi sert le <a name="lock">fichier verrou</a>&nbsp;? Imaginons
que deux courriers de la liste arrivent en même temps&nbsp;: 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é. </p>
<div class="attention">Attention&nbsp;! Si vous classez ainsi vos
mails, vous perdrez les avertissements «&nbsp;You have new
mail.&nbsp;» Pour remédier à ce problème, il va s'agir d'utiliser une
fonctionnalité du shell zsh...</div>
<p> Il suffit d'ajouter dans votre .zshrc la ligne
suivante&nbsp;:</p>
<pre>
MAILPATH="$MAIL:$HOME/mail/Scoubidou?You have new mail in Scoubidou."
</pre>
<p>Si vous voulez appliquer la même technique à plusieurs dossiers, il
faut les séparer par des symboles « : » de sorte que si vous êtes
aussi fan des Schtroumpfs, vous pourrez, en plus de la recette
<code>procmail</code> adaptée, mettre les lignes suivantes dans votre
.zshrc :
</p>
<pre>
MAILPATH="$MAIL:$HOME/mail/Scoubidou?You have new mail in Scoubidou.\
:$HOME/mail/Schtroumpfs?You have new mail in Schtroumpfs."
</pre>
<h4><a name="spambox">Une « boîte à spam »</a></h4>
<p>
Une application intéressante de classement concerne le spam. Pour des
raisons évoquées plus haut, il n'est parfois pas prudent d'envoyer le
courrier suspect directement vers <code>/dev/null/</code>&nbsp;: vous
risquez de perdre du vrai courrier. Il vaut mieux parfois rerouter le
courrier vers une boîte à spam.
</p>
<p>
L'avantage d'une boîte à spam est que vous n'êtes plus dérangé pour
rien par les avertissements « You have new mail ». Il vous suffit de
consulter la boîte de temps à autre, toutes les semaines disons, et de
faire un tri rapide de vrais spams et des faux.
</p>
<p>
Prenons un exemple. Beaucoup de spams ont un <code>Content-type</code>
en <code>text/html</code>, c'est-à-dire du HTML seulement sans copie
texte. Inversement, il n'y a guère que les spams pour être en
<code>text/html</code>&nbsp;: les gens normaux avec un logiciel mal
configuré n'envoient guère que du HTML+ texte (donc un
<code>Content-type</code> en <code>multipart/alternative</code>). Vous
voulez donc filtrer le <code>text/html</code>. Mais l'expérience
prouve que certains logiciels particulièrement malfaisants envoient
des courriers parfaitement normaux en
<code>text/html</code>. Solution&nbsp;: envoyer tous ces mails dans la
boîte à spam.
</p>
<p>Application&nbsp;:</p>
<pre>
:0
* ^Content-Type: text/html.*
$HOME/Mail/spam
</pre>
<h4>Recettes imbriquées</h4>
<p>
Un dernier exemple pour la route&nbsp;! Encore plus fort,
maintenant&nbsp;! 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&nbsp;:0,
souvenez-vous)&nbsp;:</p>
<pre>
:0:
* ^Subject:.*Scoubidou.*
{
&nbsp;:0 c
# On fait suivre vers Choupi
! choupi@scoubidou-fan.com
# et en plus de ça...
&nbsp;:0
# ... on dépose la copie dans le dossier « Scoubi »
$HOME/Mail/scoubi
}
</pre>
<h2>Conclusion</h2>
<p> Ceci ne montre qu'une partie des possibilités de procmail. Vous
pouvez faire beaucoup de choses plus compliquées mais tout aussi
utiles&nbsp;: ajouter systématiquement un champ (Reply-To, par
exemple), éviter les boucles... Pour davantage de renseignements,
consultez les pages de man (si vous ne savez pas ce qu'est une page de
man, consultez notre <a href="&url.tuteurs;unix/aide.html">page sur
l'aide en ligne d'Unix</a>) :
</p>
<ul>
<li> <code>man procmail</code> est une description de procmail
lui-même. Vous y trouverez les options de procmail.
</li>
<li> <code>man procmailrc</code> est très complet mais indubitablement
compliqué.</li>
<li> <code>man procmailsc</code> est à réserver aux experts de
procmail.
</li>
<li> <code>man procmailex</code> 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.
</li>
</ul>
<div class="metainformation">
Auteur&nbsp; Marie-Lan Nguyen. Dernière modification&nbsp;:
le <date value="$Date: 2004-01-08 22:27:51 $" />.</div>
</body>
</html>