Filtres de courrier

Le filtrage est décrit par un fichier de configuration. Chaque ligne de ce fichier décrit une condition. L'agent de livraison lit chaque ligne, vérifie les conditions et exécute éventuellement une commande.

Format des instructions

Commandes

Certaines commandes terminent l'analyse du filtre après leur action (deliver, drop, bounce, trash, forward, moved). Les autres (forward2, score skipto, deliver2, default, etc.) s'exécutent et le déroulement du filtre continue. Seule la commande stow peut faire s'interrompte ou pas le déroulement en fonction des circonstances.

deliver
deliver dossier
délivre le courrier dans la boîte principale ou dans un sous dossier, envoi un éventuel message de vacances et arrête l'analyse du filtre.
deliver2
deliver dossier
délivre le courrier dans la boîte principale ou dans un sous dossier et continue l'analyse du filtre.
drop
jette le courrier et arrête l'analyse du filtre. drop peut prendre un argument qui sera logué.
bounce
bounce message
bounce -texte
bounce -texte message
rejette le courrier et renvoie un message d'erreur à l'émetteur et arrête l'analyse du filtre. Cette erreur peut être donnée en argument de bounce. Les premiers mots en argument qui commencent par « - » sont éventuellement loggués mais ne font pas partie du message envoyé.
moved
moved addresse
moved @domaine
moved message
rejette le courrier et renvoie un message d'erreur à l'émetteur indiquant que l'adresse a changé et arrête l'analyse du filtre. Le message renvoyé dépend de l'argument utilisé :
trash
trash -texte
trash message
trash -texte message
délivre le courrier dans la poubelle. Si un message est présent, renvoie ce message en erreur à l'expediteur. Les premiers mots en argument qui commencent par « - » sont éventuellement loggués mais ne font pas partie du message envoyé, si message il y a.
forward adresse
transfère le courrier pour l'adresse indiquée et arrête l'analyse du filtre.
forward2 adresse
transfère le courrier pour l'adresse indiquée et continue l'analyse du filtre.
default adresse
default dossier
default
défini le traitement par défaut des courriers passant le filtre sans action finale et continue l'analyse du filtre. Si l'argument est une adresse éléctronique (avec un @), ces courriers seront renvoyés à cette adresse. Sinon, l'argument est pris comme le nom du dossier où seront déposés ses courriers. S'il n'y a pas d'argument, ils seront déposés dans la boîte principale. Dans la mesure du possible, les messages émis par le système de livraison locale (comme les comptes rendus de log) suivent aussi cette directive.
stop
Stoppe l'analyse du filtre. Le courrier est traité par l'action par défaut.
score +valeur
score -valeur
score *valeur
score /valeur
score =valeur
ajoute, retire, multiplie, divise, récupère le modulo ou affecte un scalaire au score.
skipto étiquette
passe les prochaines instructions du filtre jusqu'à rencontrer l'étiquette.
add En-tete: contenu
permet d'ajouter une en-tête quelquonque au début des en-têtes déjà présentes dans le courrier. Il sera possible de filtrer ultérieurement sur cette en-tête.
blacklist liste,... [en-tête optionelle]
commande composite qui regarde si l'adresse IP d'un relai est dans une liste noire publique et effectue des actions en conséquence. Regardez le paragraphe sur les Listes Noires pour son usage.
trace [ -champ|--champ...] [message]
-champ demande à ce que l'en-tête champ du message soit loguée
--champ demande à ce que l'en-tête champ ne soit plus loguée
si un message est présent, il sera ajouté dans le champ Trace: des logs.
vacation ligne
Ajoute une ligne au message automatique envoyé pour prévenir des vacances (vacations). Ce message sera envoyé lors de l'exécution d'une commande deliver.
debug
Déclanche le mode débug. À partir du moment où ce mode est enclanché, des informations concernant le déroulement du filtre sont enregistrées puis déposées dans un courrier lors de la livraison finale.
header_set lettre [En-tête ...]
Défini l'ensemble d'en-têtes lettre contenant les en-têtes à partir du deuxième argument. Il y a 26 ensembles définisables, une par lettre de l'alphabêt.
logrotate
logrotate heures
Force la rotation des logs. Si un nombre d'heures est précisé en argument, la rotation ne se fera pas plus d'une fois par ce nombre d'heures.
timezone zone
change la zone horaire pour l'affichage de l'heure dans les logs et pour son calcul dans le score. Vous pouvez utilisez une de zone de cette liste
stow [répertoire]
Si l'adresse du destinataire contient une extension (une partie entre « + » et « @ »), le courrier sera délivré dans le dossier du nom de cette extension en miniscule si le dossier existe déjà et l'analyse du filtre s'arretera. Si un répertoire est en argument, le dossier sera cherché dans ce répertoire.
Si l'adresse ne comporte pas d'extension ou que le dossier n'existe pas, le filtre continuera
(voir exemples dans les nouveautés)
extension [chaîne]
Modifie l'extension destinataire pour être utilisée par stow
antivirus EnTete
antivirus -EnTete
Ajoute l'EnTete avec une description de l'analyse (le nom de l'antivirus utilisé ainsi que les éventuels virus détectés). Précédé du signe « - », l'en-tête n'est ajouté que si un virus est détecté.
Lorsqu'un entête est ajouté, celui ci n'est ajouté aux logs par cette commande que lorsqu'un virus est détecté.
spamassassin
spamassassin Prefixe
Envoie le courrier à SpamAssassin, ajoute les entêtes :
X-Spam-Status
Si le courrier est vu comme un spam, cet entête a la forme :
Yes, hits=nn, required=nn, tests=...
Si le courrier n'est pas vu comme un spam, cet entête a la forme :
No, hits=nn, required=nn, tests=...
Les mots clefs ont la signification suivante :
  • hits=nn le nombre de points
  • required=nn le nombre de points nessessaire pour que le message soit vu comme un spam
  • tests=...La liste des tests qui ont été vérifiés par le message
X-Spam-Level
Contient un asterisque (*) par point de score de SpamAssassin
Si un Prefixe est donné un argument à la commande, les entêtes ajouétes seront Prefixe-Status et Prefix-Level
log évenement,...
Ajoute ou retire des types d'évènements au masque d'évènements logués dans les logs utilisateurs. Un message de log peut être engendré par un ou plusieurs évènements.
Si un évènement de la liste est précédé d'un signe « + », il est ajouté ainsi que ses successeurs, si un évènement est précédé du signe « - », il est supprimé du masque ainsi que ses successeurs. Si la liste ne commence pas par « + » ou par « - », le masque est défini comme ayant les évènements de la listes.
Les évènements sont
deliver
Le courrier a été délivré quelque part dans la boîte
forward
Le courrier a été renvoyé à l'extérieur
drop
Le courrier a disparu
bounce
Une erreur a été retournée à l'expéditeur du courrier
error
Une erreur est intervenue dans la traitement
all, on, yes
Tous les évènements (sauf error)
none, off, no
Aucun évènements (hormis error)
(voir des exemples dans les nouveautés)
syslog machine
Envoie une notification de l'arrivée d'un courrier dans la boîte en temps réél par syslog à la machine en arguments.
La machine doit être sur une IP fixe publique appartenant au propriétaire du filtre.
(voir des exemples dans les nouveautés)

Scalaires

Un scalaire est un nombre entier éventuellement suivi d'une unité par laquelle la valeur sera multipliée.

 Vérification des adresses de relais dans une liste noire publique (blacklist)

Il est possible de vérifier si le courrier a transité par une des adresses présentes dans une ou plusieurs des listes ci dessous :

Les serveurs de listes noires sont gérés par des entités extérieures. Nous ne pouvont garantir ni leur sérieux, ni leur pertinence ni même leur bon fonctionnement.

Ils fonctionnent par des requêtes DNS, si un relai est présent dans une liste noire, le serveur DNS renvoie une addresse IP (un enregistrement « A ») et éventuellement un commentaire dans un enregistrement « TXT ».

La vérification se fait avec la commande « blacklist ». Cette commande est capable de vérifier si le courrier est passé par un relais suspect et d'ajouter une en-tête au courrier pour le signaler.

Par exemple : : blacklist wsff,invalid* X-Blacklist: %q bloque' par %r -- %t

La commande prend comme premier argument l'énumération, avec les éléments séparés par des virgules, de listes à vérifier (vous pouvez les saisir en minuscules ou en majuscule). Quand un des élément se termine par une étoile (« * »), si l'élément vérifie les relais (et non pas les domaines) tous les relais seront vérifiés, sinon, seul le relais par lequel le serveur qui filtre a reçu le courrier sera vérifié.

Les arguments suivants correspondent à un en-tête qui sera rajouté au courrier. Dans ces arguments :

Cet en-tête sera logué (par défaut) et pourra être utilisé par des filtres ultérieurs.

Il est possible d'ajouter l'en-tête uniquement si l'élément a renvoyé une certaine valeur. Il suffit de le faire suivre du signe « = » et de la valeur à tester. Par exemple : : blacklist ordb=127.0.0.2 X-Blacklist: relai ouvert %q : blacklist ordb*=127.0.0.2 X-Blacklist: relai ouvert %q Le premier n'ajoute l'en-tête que si "ordb" renvoie 127.0.0.2 dans le premier relai. Le second fait de même pour tous les relais.

 En-têtes

L'en-tête est l'un de ceux qui peut apparaître dans le message, selon la RFC822, ce qui n'est pas nécessairement celui que votre logiciel de lecture affichera si celui-ci traduit les entêtes.

Quelques en-têtes intéressantes pour le filtrage :

From
Expéditeur (nom et adresse) tel qu'il se présente
Return-Path
Adresse de l'expéditeur dans l'enveloppe (utilisée pour le transport)
To
Destinataire du courrier tel que l'émetteur l'a indiqué.
Cc
Destinataires en copie du courrier.
Delivered-To
adresse déposée par les agents de livraison locaux pour détecter les boucles. Doit contenir l'adresse de votre boîte aux lettres.
Received
traces que laissent les relais de courrier contenant des informations sur les conditions du relais.
Subject
sujet du message
Content-Type
Type MIME du message. Les courrier ordinaires ont pour valeur text/plain, mais on peut trouver, entre autre, text/html pour le courrier en HTML ou multipart/mixed pour les attachements.

Expressions

On peut choisir le type d'expression en entourant de deux caractères délimiteurs identiques parmi « / », « " » ou « ' ». Les expressions entourés par « / » peuvent être suivies d'une lettre d'option pour déterminer le type. Les expressions formées par un mot commençant par « $ » sont crées dynamiquement selon le courrier reçu ou l'état de la boîte au lettre.
SyntaxeType d'expressionsensible à la casse
expression expressions rationnelles étenduesnon
/expression/ expressions rationnelles étenduesnon
/expression/e expressions rationnelles étenduesnon
/expression/E expressions rationnelles étenduesoui
/expression/b expressions rationnelles basiquesnon
/expression/B expressions rationnelles basiquesoui
/expression/p expressions rationnelles compatibles avec perlnon
/expression/P expressions rationnelles compatibles avec perloui
/expression/pu expressions rationnelles UTF-8 (unicode) compatibles avec perlnon
/expression/Pu expressions rationnelles UTF-8 (unicode) compatibles avec perloui
/expression/a liste d'adressesnon
/expression/A liste d'adressesoui
/expression/f expressions du shellnon
"expression" expressions du shellnon
'expression' expressions du shellnon
/expression/F expressions du shelloui
$return-path Compare avec l'adresse de l'en-tête Return-Path
ou, si elle est vide, avec la chaîne MAILER-DAEMON
non
$mailinglists Vérifie si l'entête contient une des adresses de
mailing listes définie dans les préférences du webmail
non

Si vous voulez indiquer un caractère délimiteur à l'interieur d'une expressions délimitée par ce caractère, il faut le faire précéder par « \ ». Par exemple, pour vérifier l'expression rationnelle « text/html » : Subject: /text\/html/ bounce Dans le cas d'expression rationnelles POSIX indépendantes de la casse, c'est équivalent à Subject: text/html bounce

Caractères Unicode

Les expressions //Pu et //pu, compatibles avec perl, peuvent traiter des chaînes en UTF-8, or seuls les octets de des caractères ASCII (lettres non accentuées, chiffres, ponctuation) sont supportés par les filtres. Pour indiquer les autres caractères, il faut indiquer leur position dans la liste des caractères unicode, précédé par \x{ et terminé par }. Les zéros initiaux de la position peuvent être retirés et si on peut représenter cette position sur deux caractères hexadécimaux, on peut indiquer ce caractère avec un \x suivi de la position sur ces deux caractères hexadécimaux.

Par exemple, la lettre minuscule latin e accent grave (è) a pour position 00E8, on peut le représenter par /\x{00E8}/pu ou plus simplement par /\xE8/pu.

Liste d'adresses

Les expressions //a et //A sont des listes d'adresses. Elles sont composées d'une liste d'éléments (des mailbox au sens de la RFC 2822) séparés par des virgules. Si un élément commence par un @, il indique toutes les adresses du domaine suivant l'@. Lors du passage du filtre, si l'un de ces éléments est égal à l'un de ceux des en-têtes testés, l'action en enclenchée. Par exemple, le filtre suivant To:Cc: /toto@example.com, titi@example.org/a Est vérifié par l'entête To: M. TOTO <TOTO@example (juste un test).com(mercial)>

Le filtre ci dessous est vérifié pour toutes les adresses du domaine example.com : To: /@example.com/a

Une liste peut être composée d'une seule adresse To: /toto@example.com/a deliver

L'analyse de l'en-tête est plutôt laxiste, afin de retomber sur ses pieds en cas d'invalidité de l'en-tête.

Ces expressions ne sont utiles que dans les en-têtes qui contiennent des données au format d'adresses (entre autre To, Cc, From, Sender, Return-Path, Delivery-To, Reply-To, Mail-Copies-To, Message-ID, ... et les Resent- de ces en-têtes). Leur utilisation dans un autre contexte est indéterminée.

Expressions du shell

les expression du shell sont conçues à l'origine pour reconnaitre les fichiers dans les interprètes de commande ou les boîtes de séléction de fichiers. Elle sont beaucoup moins puissantes que les expressions rationnelles mais peuvent être plus facile à manier.

Elles n'ont, comme caractères spéciaux, que

Également, elles vérifient toute la chaîne, alors que les expressions rationnelles ne vérifient que le motif. L'exemple ci dessous indique comment chercher un sujet contenant le mot « cassoulet » dans le champ « Subject » avec une expression rationnelle ou une expression du shell : Subject: /cassoulet/ deliver cuisine Subject: "*cassoulet*" deliver cuisine

Exemples

# la date de dernière modification s'ajoute magiquement après les deux points.
# Dernière modification: 
#
# jette le courrier venant d'une adresse contenant friend@public
# ou dont le sujet contient $$$ (on met des barres obliques 
# inversées « \ » avant les dollars « $ » car le dollar simple
# signifirait une fin de chaîne dans l'expression rationnelle.
#
To:       /friend@public/             drop
Subject:  /\$\$\$/                    drop

#
# jette un courrier qui est destiné à plus de 10 utilisateurs locaux
#
$r>10  drop

#
# délivre le courrier dont le sujet contient « urgent »
# dans le dossier « important »
#
Subject: /urgent/          deliver important

#
# jette le courrier dont le sujet contient « pas urgent »
#
Subject: /pas urgent/     drop

#
# renvoit le message d'erreur « invalid content type »
# pour les courriers en HTML ou les attachements.
#
Content-Type: /text\/html/  bounce invalid content type
Content-Type: /multipart/   bounce invalid content type

#
# délivre un peu de courrier dans le dossier « lwa »
# du répertoire « lapins »
#
From:    /lwa@teaser\.fr/      deliver   lapins.lwa

#
# Ajoute diverses informations dans le champ Trace des logs
#
: trace debut
From:   /titi/     trace from titi
!From:  /titi/     trace !from titi
From:  !/titi/     trace from !titi
!From: !/titi/     trace !from !titi
: trace fin

#
# Ajoute l'en-tête "From:" dans les logs sous certaines condition
#
From:   /suspect/    trace -from quelque chose de suspect

#
# exemple de tri en fonction de l'heure de réception
#
$twd=513   bounce de'sole', je ne recois pas de mail les vendredi 13
$twh=011   deliver recu_pendant_la_messe_de_dimanche_a_11h

$tcymd>20010614 skipto revenu
$tcymd>20010506 vacation je suis absent du 6 mai 2001 au 14 juin 2001
:revenu

# envoi une copie des courriers arrivés les jours
# de semaine entre 13h30 et 23h50
$tw=0 skipto maison
$tw=6 skipto maison
$thn<1330 skipto maison
$thn<2350 forward2 bureau@teaser.fr
:maison

# délivre le courrier si la chaîne "bonjour" est présente dans les 200
# premiers octets du corp du message
+200  /bonjour/    deliver

# rejette le courrier si le message ne contient pas "au revoir"
# dans ses 300 derniers octets
-300 !/au revoir/  bounce les gens polis disent au revoir