Differences

This shows you the differences between two versions of the page.

Link to this comparison view

unix:sendmail_rulesets [2010/01/12 13:29] (current)
Line 1: Line 1:
 +"​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)