“Ph'nglui mglw'nafh Cthulhu R'lyeh Wgah'nagl fhtan.”

tel est à peu près ce que comprend l'utilisateur moyen en regardant d'un oeil non aguerri des règles de réecriture du sendmail.cf.

Ce que je vous propose dans le tip suivant, c'est un aperçu de la souplesse des-dites règles. Il ne s'agit pas d'apprendre ici à ecrire à la main un sendmail.cf ( ce qui serait parfaitement inutile, du fait de la simplicité d'écriture d'un fichier mc, voir le tip “sendmail” ), mais d'apprendre, pour des cas très spéciaux ou les differentes tables ne suffisent plus, à écrire sa propre règle de réecriture. Notez que ces règles ne sont pas non plus à placer dans le sendmail.cf, ce dernier étant généré par votre fichier .mc, mais à écrire dans le .mc, dans la section LOCAL_RULESETS, à créer si cette dernière n'existe pas.

LHS et RHS


Signifiant respectivement “Left Hand Side” et “Right Hand Side”, ce sont les 2 parties obligatoires d'une ligne de réecriture. Le format d'une telle ligne est le suivant :

Rlhs rhs commentaire optionel

Le R commençant la ligne signifie qu'il s'agit d'une Regle. Chaque partie d'une ligne de règle doit être impérativement séparée de la précédente par le caractère <tab>.

Variables


Il est également possible de définir des variables, ceci est fait en commençant la ligne par un “D”. Exemple :

DAvaleur

ici, A vaut “valeur”, l'interprétation est faite à l'aide du caractère “$”. Pour lire le contenu de A on écrira donc $A. Pour créer des variables à plus d'une lettre, on utilise les accolades, exemple :

D{VariableA}valeur

De la même manière, on obtient le contenu de la variable par ${VariableA}.

LHS ( analyse )


La première notion à aborder concernant l'analyse d'adresse effectuée par la LHS c'est la “tokenisation”. En effet, chaque membre de la chaine à analyser est séparé et correspond à un token. Par exemple, admettons qu'on veuille analyser l'adresse toto@domaine.com, celle ci est découpée en :

“toto” “@” “domaine” “.” “com”

On peut alors analyser ces tokens en toute sérénité. Voici les opérateurs dont nous disposons:

$* : matche 0 ou plusieurs tokens $+ : matche 1 ou plusieurs tokens $- : matche exactement 1 token $@ : ne matche aucun token $= : matche n'importe quel token sur une classe ( par exemple Cwlocalhost ) $~ : ne matche pas si l'un des token fait partie d'une classe

Comme on peu le voir, l'approche est similaire aux regexps, voici pour nous en convaincre, un exemple de match :

R$*<$*>$*

ce LHS matche n'importe quelle adresse en “Chaine <chaine> Chaine”, exemple :

Toto Machin tmachin@domaine.com ( Travail )

Cette adresse est bien matchée par le LHS ci dessus.

RHS ( réecriture )


Voyons maintenant, grace au RHS comment utiliser le match du LHS pour réecrire une adresse par exemple. Admettons l'LHS suivant :

R$*<$+@$+>$*

Nous constatons que ce LHS possède 4 champs, l'une des premières utilisation du RHS est la numérotation, on référence chaque token par un numéro, dans le LHS précédent, on pourra donc utiliser $1, $2, $3 et $4.

En admettant qu'on veuille réecrire toutes les adresses sous la forme :

utilisateur@domaine.com

On écrira la regle suivante :

R$*<$+@$+>$* $2@$3

Utilisons maintenant une variable, nous souhaitons réécrire ainsi uniquement les emails en @domainelocal.com :

D{ICI}domainelocal.com R$*<$+@${ICI}>$* $2@${ICI}

Préfixes au RHS


Voici en vrac quelques préfixes utiles au RHS :

$: En préfixant le RHS par $: on s'assure que la réecriture n'aura lieu qu'une fois. Très utile pour éviter les boucles ;) $@ Ce préfixe permet de sortir du ruleset lors du premier match, les rulesets suivants sont ignorés. $> Ceci permet d'appeler un autre ruleset, exemple : $>check_bidon $2@$3 $# Permet de spécifier un MDA, exemple : $# local $[ $] ajoute le domaine complet, exemple : <$[ $2 $]>

Dernier point concernant l'RHS, il est fréquent d'utiliser un ruleset pour filtrer des emails. Voici un exemple mettant en oeuvre le mot clé “OK”. On décide de ne laisser passer que les mails destinés ou venant du domaine “domaine.com” :

D{OKRELAY}domaine.com R<$+@${OKRELAY}> $@ OK # et on refuse tout le reste R$* $#error $: “550 Relaying Denied”

Oh la belle bleue


Enfin, pour ajouter votre ruleset au .mc, ajoutez :

LOCAL_RULESETS Smon_ruleset_a_moi_que_j_ai

suivi de vos regles maison.

Sur ce, bonne nuit ;)

( Merci à oliv3 pour l'incantation de Cthulhu ;) )

unix/sendmail_rulesets.txt · Last modified: 2010/01/12 13:29 (external edit)