Utilisation de procmail - Linux-France :: Accueil ·  · 2001-01-05... une série de pointeurs...

Preview:

Citation preview

Procmail

Utilisation de procmail

Olivier Tharan<olive@oban.frm ug.or g>

Cedocumentdécritl’utilisation deprocmaildansla vie detouslesjours.

1. Intr oductionCedocumentessaied’expliquercommentinstalleret utiliserProcmailpourfiltrer lecourrierélectronique.Procmailestun outil trèspuissantpourtraiter, dequelquemanièrequecesoit,descourriersélectroniques.Cedocumentessaiededonnerdesexemplessimplesàmettreenoeuvre,toutenn’oubliantd’expliquerle pourquoidecesexemples.

Lesrecettessonttiréesdemonexpériencepersonnelle,et représententmescommentairessurlesdocumentationslargementdisponibles.

NOTE : cedocumentestencoursd’élaborationet estévidemmenttrèsincomplet(maisil évoluepeuàpeu!). Lessourcescontiennentdescommentairesguidantun peul’évolutiondu document,leslire poursavoir oùajouterdeséléments,chercherle mot’FIXME’ ! Commeil aétérelu parpeud’autrespersonnes,il sepeutquecertainesinformationssoienterronées.

Cedocumentsetrouvesursonsitederéférence(http://www.linux-france.org/article/appli/procmail.html).

1

Procmail

1.1. Qu’est-ce que procmail ?Procmailestunoutil permettantprincipalementdefiltrer desmessagesélectroniques(ilnefautpasoublierformail, livréavecprocmail,qui estunadjointappréciableàcedernier).Il esttrèspuissantet sescapacitésdefiltragelui permettentdedélivrerdescourriersdansdifférentesboîtesauxlettres,delesrenvoyer, voire d’effectuern’importequelleactionenfonctiondufiltre désigné.

Procmailfonctionnegrâceàunsystèmederègles,qu’il parcourtlesunesaprèslesautres,afindedéterminersi le messagequ’il traitesatisfait àunerègleenparticulier, etexécutel’action associéeà la règletrouvée,le caséchéant.

Vousavezpeut-êtreentenduparlerdeprocmail.Vousavezpeut-êtrevu desrèglesprocmail,et vousêtesenfui encourantaprèsça(çasepeut!). Vousconnaissezlapuissancedeprocmail,maisvousnesavezpastropparoùcommencer. Cedocumentestpourvous.Il expliqueracommentinstallerprocmail,et commentl’utiliser demanièresimpleaudébut. Finalement,unesériedepointeursvouspermettrad’aller plusloin, unefois lesbasesassimilées.

Pré-requispourutiliser procmail:

• savoir utiliser le courrierélectronique(je nevaispasl’apprendreàvotreplace,maissi vousêteslà, c’estquevoussavez,n’est-cepas? ;-)

• avoir desconnaissancesdebaseenexpressionsrationnelles(lesfameusesregexp !),qui sontabondammentutiliséesdanslesrèglesdeprocmail.Rassurez-vous,j’essaieraidemettresuffisammentd’exemplespourquecelarestecompréhensible.Sinon,procmailutilise lesexpressionsrationnellesstandardsd’egrep, doncvouspouvezlire lespagesdemanuelegrep(1) etregex(7) pourplusd’informations.

2

Procmail

2. Installation de procmail

2.1. CompilationL’installationdeprocmailn’estpastrèscompliquée.Si vousn’êtespasl’administrateurdevotresystème,il faudracontactercedernierpoursavoir si procmailestinstalléoupassurle serveurdecourrier. Si vouspouvez(ou devez!) l’installer vous-même,cen’estpasdifficile. Engénéral,procmailestdistribuésousformed’un paquetpourlesdistributionsLinux (procmail-3.14-2.i386.rpm pourla Redhat-6.2,procmail_3.13.1-3.deb pourla Debian2.2,etc.)ou d’un port pourFreeBSD.Sivousnetrouvezpasdedistributionbinairepourvotresystème,il estpossibledelecompileràpartir dessources,quel’on peuttrouversurle sitedeprocmail(ftp://ftp.informatik.rwth-aachen.de/pub/packages/procmail/procmail.tar.gz)ouplusrapidementauLip6 (Jussieu)(ftp://ftp.lip6.fr/pub/unix/mail/procmail/procmail.tar.gz).La dernièreversionàcejour est3.15.

2.2. ConfigurationIl existeplusieursmanièresd’appelerprocmail,selonquel’administrateursystèmeestcoopératifou non! Il esteneffet possibled’utiliser procmaildemanièreglobale(procmailpeutservirdefiltre général,avantmêmela livraisondu courrieràchaqueutilisateur-- pourpasserun anti-virusà l’entréedusystème,parexemple),oubiendemanièreindividuelle(utilisationdeprocmailsansdisposerdedroitsparticuliersautresqueceuxdu répertoirepersonnel).

2.3. Installation personnelleIl estpossibled’installerprocmailpourunusagepersonnel,si jamaisle systèmen’estpasparamétrépourutiliserprocmailconjointementavecle serveurdecourrier. Pourcela,la documentationdeprocmailindiquedemettrela ligne suivantedansle fichier.forward devotrerépertoirepersonnel:

3

Procmail

"| IFS=’ ’&& exec /usr/bin/procma il -f-||exit 75 #MON_LOGIN"

Notezle « tube» (|) endébut deligne 1 ! Le fichier.forward estcherchéparleserveurdecourrieràchaquecourrierqui nousestdestiné; si cefichierexiste,il permetdedéfinir, soit uneadresseà laquelleredistribuer(= forwarder)le courrier, soitunecommandeà traverslaquelleon passele courrier. Dansnotrecas,on indiqueauserveurdecourrierdepasserlescourriersentrantsnousétantdestinésà traversla commandeprocmail.

3. Interaction avec le reste du système

3.1. Procmail comme livreur de courrierUnemanièretrèsutile demettreprocmailàdispositiondetouslesutilisateursestdel’installer commeoutil delivraisonducourrierenlocal.procmailesteneffet aussiunMDA (Mail DeliveryAgent,outil delivraisondecourrier),c’est-à-direquele courrierlocal traitéparle serveurdecourrierestenvoyéà procmailpourquecedernierplacelecourrierdanslesboîtesauxlettresdesdestinataireslocaux(engénéral,dans/var/mail/login).

Demanièrehistorique,c’estl’outil /bin/mail qui faisaitofficedelivreurdecourrierlocal. Il a tendanceàêtreremplacéparprocmail,carcedernierpermetaussidefiltrer lecourrierentrant.L’un desinconvénientsdeprocmailestqu’il estpluslourdà lanceràchaquefois qu’uncourrierdoit êtrelivré.

Parcontre,unefois installédemanièreglobale,procmailpeutservirdefiltre pourlespersonnesqui le désirent,et commesimplelivreurdecourrierpourlesautres.Il suffitpourlespremiersd’avoir unfichierdeconfiguration.procmailrc dansleur répertoirepersonnel.Si cefichiern’estpasprésent,procmaillivrerale courrierdansla boîteauxlettreshabituelledela personne.

4

Procmail

L’installationdeprocmailcommeMDA local estrelativementsimplepourlesserveursdecourrierlespluscourants.Étudionslescaslespluscourants.

3.2. Procmail et SendmailSi vousparamétrezsendmailaveclesmacrosm4, il suffit deplacerla ligne suivantedanssendmail.mc (ouconfig.mc suivantl’Un*x utilisé 2 ) :

FEATURE(local_pr ocmai l) dnl

et,si votreprocmailn’estpasdans/usr/local/bin 3 :

define(‘PROCMAIL _MAIL ER_PATH’, ‘/usr/bin/procma il’ )d nl

3.3. Procmail et PostfixPourutiliser procmailavecPostfix,rien deplussimple: renseignezla lignemailbox_commanddu fichiermain.cf 4 , enindiquantle chemincompletversprocmail.Parexemple:

mailbox_command = /usr/bin/procma il

3.4. EximPourutiliserprocmailavecExim, il fautremplacerle contenuhabitueldu~/.forwardpar:

|/usr/bin/procma il

5

Procmail

Cettesolutiondevrait enfait fonctionneravectout serveurdecourrierpossédantunecompatibilitéprochedeSendmail.Si quelqu’unaunesolutiongénériquenenécessitantpasl’écritured’un fichier~/.forward, elle estla bienvenue!

3.5. Autres serveur s de courrierFIXME: qui aenvie d’écrirelà-dessus?QMail, etc.

3.6. Procmail et fetchmailCeuxqui seconnectentépisodiquementà InternetparuneliaisonPPPutilisentpeut-êtrefetchmailpourrécupérerleur courrierdepuisle serveurPOPou IMAP deleurfournisseurd’accès.fetchmailestun trèsbonclient POP/IMAP, queje vousrecommande.

En tempsnormal,fetchmailrécupèrele courriersurle serveurdistantet l’adresseauserveurdecourrierlocal,surle port25 (SMTP).Cetteméthodefonctionnesi vousavezconfiguréun serveurdecourriersurvotremachine(Sendmailou Postfix),maisestrelativementlourdecarunefois passéàSendmail,le courrierfinira parpasserdanslesmainsdeprocmail.On peutéviterun sautsupplémentaireenfaisantpasserle courrierdirectementdefetchmailàprocmail.Pourcela,il suffit d’ajouterl’option deconfigurationsuivantedansle fichier.fetchmailrc :

mda "/usr/bin/procmai l -Y -d %T"

Le paramètre-mda passéenlignedecommandefait la mêmechose.

3.7. Configurer Gnus pour qu’il utilise procmailÉric Jacoboniacontribuécettesectionsurl’utilisation deGnusconjointementàProcmail.Gnusestsuffisammentimportantet puissantpourqu’ondoive le configurer

6

Procmail

demanièreà l’utiliser proprementavecprocmail.

Gnuspermetdecréerdefaçonsimpledesdossiersdecourrierselonlescritèresdevotrechoix : il suffit d’utiliser la fontionnnmail-split-methods et despécifier,pourchaquedossier, l’expressionrationnellesurlaquelleon sebaserapourclasseruncourrierdanscelui-ci.

Voici, parexemple,cequepourraitcontenirun.gnus pouractivercettepossibilité:

;; On utilise le backend nnml pour le courrier (car par défaut,;; Gnus lit les news...)(setq

gnus-secondary-se le ct -meth ods ’((nnml ""))mail-sources

’((directory:path "~/incoming/" ;; cf. variable MAILDIR de .procmailrc:suffix "" )

))

Ici, nousavonschoisid’utiliser le répertoireincoming commesourcedecourrier,c’estcelui oùprocmailrangesesdossiers.GnustranfèreraalorslescourriersdanslesrépertoirescorrespondantsdeMail (c’estle répertoirepardéfaut).

Toutefois,cetteméthodeaquelquesinconvénients: le principalestqu’elle fait doubleemploisi l’on utilisedéjàprocmailpour, parexemple,mettreauxoubliettesdescourriersdeprovenancedouteuse,ou poursupprimerlesdoublons(voirprécédemment).Un autreinconvénientestqu’elleestpropreàGnus,cequi rendobsolètestouscesdossierssi l’on décidedechangerdeMUA (maisquelleidéesaugrenue...).

Pourcetteraison,il estplussagedeconfigurerGnuspourqu’il utiliseprocmailpourgérercesdossiers:

;; Utilisation du backend nnml avec procmail;; nnmail-procmail- di re cto ry correspond à la variable MAILDIR;; de votre .procmailrc(setq

gnus-secondary-se le ct -meth ods ’((nnml ""))

7

Procmail

gnus-use-procmail tnnmail-spool-file "procmail"nnmail-procmail-d ir ec tor y "~/incoming/"nnmail-procmail-s uf fi x ""

)

;; Pour les nouvelles versions de Gnus (>= 5.8.7)(setq mail-sources

(list ’(directory:path "~/incoming/":suffix ""

))

)

et c’esttout...Gnusutiliseralesrèglesdéfiniesdansvotre.procmailrc pourcréersesdossiersdecourrier.

Le principeestsimple: lorsquevouslancerezGnus,celui-ci ira consulter~/incomingoù doiventsetrouver lesdifférentsfichierscréésparprocmail.Si cesfichiersnesontpasvides,il leslit et transfèrelescourriersqu’ils contiennentdanslessous-répertoiresde~/Mail encréantun fichierparcourrier. Aprèscetteétape,lesfichiersde~/incoming sontdonctousvides.

Si vousavez,parexemple,lesrèglessuivantesdansvotre.procmailrc :

# *FreeBSD-Stable:0* ^TO.*stable@FreeB SDFreeBSD-Stable

# *Systeme:0* From:.*(root|news )@ch ezmoiSysteme

# *Perso:0* ^TO.*moiPerso

8

Procmail

# *Le-reste:0* ^TO.*Le-Reste

Vousaurezlesfichiers~/incoming/FreeBSD-Stable, ~/incoming/Systeme,~/incoming/Perso et~/incoming/Le-Reste qui seremplirontaufur etàmesurequevousrecevezdesmessagescorrespondantauxrèglesci-dessus.En lançantGnus,celui-ci créera(si cen’estdéjàfait) lesrépertoires~/Mail/FreeBSD-Stable,~/Mail/Systeme, ~/Mail/Perso et~/Mail/Le-Reste et chacund’euxcontiendradesfichiersportantdesnomssurle mêmeprincipequ’unspooldenews :

% ls -l ~/incoming/Pers o-rw------- 1 moi moi 0 26 jul 14:05 /home/moi/incomi ng/P ers o

^^^

% ls ~/Mail/Perso1 11 13 2 4 6 810 12 14 3 5 7 9

L’avantagedecetteméthodeestdecentraliserle triageducourrierenun seulendroit:.procmailrc. D’autrepart,procmaildisposedemoyensbienplusperfectionnéspourspécifierlesexpressionsrationnelles(la macro^TO_,notamment).

Parcontre,Gnusconsidèreraquechaquefichier de~/incoming contientunelistedecourriers: si vousavezdonccrééunfichiermsgid.cache danscerépertoireaveclarègle

:0 Wh: msgid.lock| formail -D 8192 msgid.cache

vueplushaut,Gnusseplaindraquecedossiern’estpasaubonformat.Pourréglerceproblème,il suffit demodifiercetteentréeen:

:0 Wh: msgid.lock

9

Procmail

| formail -D 8192 /tmp/msgid.cach e

cequi a l’avantagesupplémentairedenettoyercefichieràchaqueredémarragedevotresystème(s’il estconfigurépournettoyer/tmp).

Ressources:

Commed’habitude,le fichier info deGnusdonnetouslesrenseignements(Rubrique’SelectMethods’-> ’GettingMail’ -> ’Mail andProcmail’).

La FaqGnus(http://www.ccs.neu.edu/software/contrib/gnus/)contientégalementunerubriquesurcetteconfiguration(contributiondeRandalSchwartz).

GnusRuLeZ!

3.8. Utilisation de Mutt avec ProcmailMutt s’accomodetrèsbienà la sauceprocmail.Il lit lesboîtesauformatmbox, formatpardéfautsousUnix, qui estle formatstandardécrit parprocmail.Il suffit doncd’indiqueràmutt le répertoirequ’utiliseprocmailpourstocker lesboîtesauxlettres.Sivousutilisezla configurationindiquéeci-dessous,le répertoireest$HOME/Mail, qui estle répertoirepardéfaututilisé parmutt.La boîteauxlettresnormale,celleoù procmailstockerale courrierqui n’a pasététrié et quemutt lira audémarragesansautreindicationdevotrepart,est/var/mail/$LOGIN (ou/var/spool/mail/$LOGIN).

Si vouschangezle répertoireoùprocmailstockerale courrier, il fautaussil’indiquer àmutt,enutilisantla variablefolder. Par exemple: set folder=~/courrier dansvotre.muttrc. Voir la variableMAILDIR deprocmail.

Si vousmodifiezla boîteauxlettressystème(celleoù devraientêtrestockésvoscourriersendéfinitive)avecla variableDEFAULT deprocmail,il faudraaussil’indiqueràmutt.Pourcela,vouspouvezsoit utiliser la variablespoolfile danslaconfigurationdemutt : set spoolfile=~/Mail/inbox, soit positionnerla variabled’environnementMAIL.

Touscesrenseignementssetrouventdansle manueldemutt (installéengénéraldans/usr/share/doc/mutt/manual.txt).

10

Procmail

4. Configuration de procmailL’utilisation deprocmailrevientàpeuprèsàsecréerunfichier deconfiguration; c’estpeut-êtrela partiela plusdifficile du parcours,maisavecdesexemplesbienchoisis,c’estplusclair.

4.1. Écriture du fic hier .procmailr cLe fichier.procmailrc estunecombinaisond’assignationsdevariableset derecettes. Lesrecettesprocmailsontcomposéesdetroisparties:

• l’en-têteet sesoptions;

• lesrèglesdecorrespondance: expressionsrationnellessurlesen-têteset corpsdesmessagespermettantdedéterminersi le messagevaêtretraitéparcetterecette;

• l’action associéeàcetterecette.

La premièrecorrespondancetrouvéel’emporte,et terminela lecturede.procmailrc; si aucunecorrespondancen’esttrouvée,le courrierestlivrédansla boîteauxlettrespardéfaut(/var/mail/toto parexemple).

4.1.1. Variab les

Il estpossiblededéfinir desvariablesdansle fichier deconfiguration.procmailrc.Certainesd’entreellesaurontunesignificationparticulièrepourprocmail,alorsquelesautrespeuventêtreutiliséesdanslesrèglesqui suivrontcommedesvariablesnormales.Voici unexemplecommenté:

# Variables spéciales pour procmail

# caractère verbeux de procmail ; mettre ’yes’ per-met d’avoir des messages# supplémentairesVERBOSE=no

11

Procmail

# pas obligatoire : procmail détermine votre nom de lo-gin tout seul, mais pour# l’exemple on supposera que l’utilisateur s’appelle ’toto’LOGNAME=toto

# mettre /bin/sh surtout si vous utilisez tcsh !SHELL=/bin/sh

# chemin d’accès aux exécutables ; en mettre le mini-mum, pour n’accéder qu’aux# programmes indiqués dans le fichier de configurationPATH=/bin:/usr/b in: /u sr /lo ca l/b in :/ home/ tot o/ bi n

# réper-toire où seront stockés les mails ; s’assurer que votre MUA sait y# accéder aussiMAILDIR=/home/to to/ Mail

# si procmail n’arrive pas à délivrer le cour-rier, cette boîte sera utilisée# en dernier ressort : il vaut mieux définir cette variable !ORGMAIL=$MAILDIR/emer gency -i nbox

# boîte de réception par défautDEFAULT=/var/mai l/t ot o

# fichier de log de procmail ; si vous définissez cette variable,# procmail gardera une trace de son exécution dans le fichier# indiqué. À consulter périodiquement !LOGFILE=$MAILDIR/.p ro cmail .l og

Lesautresvariablesutiliséesou définiesparprocmailsontdécritesdansla pagedemanueldeprocmailrc(5).

4.1.2. Séparer le fic hier en plusieur s par ties

Il estpossibledescinderle fichier .procmailrcenplusieursparties,afin d’enaméliorerla lisibilité. En fait, onpeutinclureun fichiergrâceà la directivesuivante:

12

Procmail

INCLUDERC=nom_de_fi ch ie r

oùnom_de_fichier estle fichier à inclureà l’endroit dela directive,c’estsoit unchemincomplet,soit un cheminrelatif aurépertoirecourant.On peutincluredesfichiersdefaçonimbriquéesansaucunproblème.

4.1.3. Recettes

Unerecettea le formatsuivant:

:0 [drapeaux] [ : [verrou_local] ]<zéro ou plusieurs conditions (une par ligne)><exactement une ligne d’action>

Unerecettecommencepar:0 ; surla mêmeligne,on ajouteradesdrapeauxsupplémentairesselonlescas.Lesdrapeauxsontdécritsdansla pagedemanueldeprocmailrc(1). Lesplusutiliséssont:

• H : passel’expressionrationnellesurlesen-têtesdu message;

• B : idemsurle corps;

• h : n’envoie quelesen-têtespourtraitement;

• c : gardeunecopiedumessagepourtraitementultérieur

Finalement,enfin deligne,on ajoutera: si ondésireun fichierdeverrou(afindenepascorrompreunfichier eny écrivantsimultanémentdeuxcourriers).

Leslignessuivantesindiquentzéroou plusieursconditions,chacunesurunelignedifférente,permettantdetestersi uncourriercorrespondàcequel’on cherche.Lesconditionscommencentparle caractère* et tout cequi suit estenvoyéà la commandeegrep interneàprocmail.Il fautquetouteslesconditionssoientvraiespourconsidérerla recettecommevraieet activer l’action qui suit (conditionsdetypeAND).

Finalement,l’action àeffectuersi lesconditionsontétévérifiéessont:

13

Procmail

• la redirectionversunfichier : actionla pluscourante,elle permetdedélivrer lecourrierdansla boîteauxlettresindiquée.Il faudrafaireattentionàspécifierunverrouaudébut dela recette.Il suffit d’indiquersurla ligne le nomdu fichierou durépertoiredanslequelstocker le courrier;

• la redirectionversunprogramme: cetteactionpermetd’envoyer le courriersurl’entréestandardd’un programmequi s’occuperaducourrier. Le verroun’estplusnécessaire,et on indiquerala redirectionencommençantla ligneparunebarreverticale(|) puisla commandeàexécuter;

• l’envoi versuneautreadresseélectronique: le verrouestinutile, et la ligned’actioncommenceraparunpoint d’exclamation,suivi del’adressederenvoi.

4.2. Quelques recettes utilesVoici unelistedésordonnéederecettesdebasequi pourrontêtreutiles,et qui sontdifférentesdesrèglesqu’on trouvedanslespagesdemanueldeprocmail.

1. Negarderqu’unseulexemplaired’un mail, mêmesi on le reçoitdeuxfois ; utile,parexemple,quandon reçoituneréponsed’unelistedediffusion,à la foisdirectementet parl’intermédiairedela liste. Il estpossiblederéglerla taille ducacheenchangeantle nombre(8192).

:0 Wh: msgid.lock| formail -D 8192 msgid.cache

2. Cesrèglespermettentdetrier unelistedediffusiondansundossierséparé,afindenepastrop encombrerla boîteauxlettresnormale.

Imaginonsqueje soisabonnéà la listePostfix-Fr. L’adressepourenvoyerunmessageàcettelisteest<postfix-fr@lists.freenix.org>, maisquandvousenrecevez,l’adressedel’expéditeurest<postfix-fr-owner@lists.freenix.org>. Il nousfautdonctrouverune

14

Procmail

expressionsuffisammentcomplètequi nouspermettederepérerun tel messagesansambiguïté.Unetelle expressionpeutêtreexpriméeparla règlesuivante:

:0:* ^From.*postfix-f r- ownerpostfix-fr

Danscetterègle,nousrecherchonssi l’en-têtereprésentantl’expéditeur(la partie^From del’expressionrégulière)contientla chaînepostfix-fr-owner, et sic’estle cas,plaçonsle courrierdansla boîteauxlettresnommée« postfix-fr ».

Pourtrier d’autreslistesdediffusion,le principeestle même: trouvezdanslesentêtesdescourriersdesélémentssuffisammentsignificatifssurlesquelsvousbaserezvotretri (From.*liste-owner pourunelisteSympa,From.*owner-liste pourunelisteMajordomo,From.*liste-admin pourunelisteMailman,etc.).

3. La règlequi suit permetdetrier un courriersursonsujet,cequi permetdefiltrercertaineslistesdediffusionajoutantsystématiquementleur nomdansle sujetducourrier. Vouspouvezaussidiscuterd’un thèmeprécisavecdesamis,descollèguesenconvenantd’un mot-clédansle sujet.

:0:* ^Subject:.*\[bla gue\]copains/blagues

Touslescourriersdontle sujetcontientla chaîne[blague] (aveclescrochets)iront dansle dossierblagues setrouvantdansle sous-répertoirecopains devotrerépertoiredecourrier. Lescrochetssontéchappésparunebarreobliqueinverse(\) caril s’agit d’uneexpressionrationnelledanslaquellelescrochetsontunesignificationparticulière.

4. La règlesuivante,assezimpressionnante,permetdetrier enunseulcouptouslescourriersarrivantdelistesdediffusionsimilaires.L’exempletypiqueenestles

15

Procmail

listesdediffusiondu projetDebian(http://www.debian.org/), auxquellesla règlefait référence(maiscelapourraitfonctionneraussipourleslistesFreeBSD;-) :

:0 H* ^X-Mailing-List: .* [<] .* li sts \. deb ia n\ .or g[ >]* ^X-Mailing-List: .* [<] *\/[^ ][^@]*$MATCH

Cetterègleà l’apparencebarbares’appuiesurle fait quelescourriersdeslistesDebiancontiennentl’entêteX-Mailing-List:debian-nom-liste@debian.org, et quela variable$MATCH contientcequi aététrouvédansl’expressionrationnelleprécédenteà partir de\/. Pourclarifier,l’expression\/[^ ][^@]* « correspondra» àun début d’adresseélectronique(sansla partiedomaine)et seraaffectéà la variable$MATCH. Pourla listedebian-french@lists.debian.org parexemple,le courrierdoncseraplacédansle dossierdebian-french.

CetteméthodefonctionnepourtoutesleslistesDebian,si vousêtescommemoiabonnéàplusieursd’entreelles.

5. Question: je récupèremoncourrierdepuisuneseuleadresse,et j’aimeraisle trierenfonctiondudestinataire,selonquel’adressesoitJean Dupont

<toto@fai.fr> ouSuzanne Dupont <toto@fai.fr>.

Unesolutionpeutêtred’utiliser fetchmail et sonmodemultidrop, oubienlesrèglesprocmailsuivantes:

:0* ^TO_Suzanne.*Dup ont! suzanne

:0* ^TO_Jean.*Dupont! jean

Faitestoutefoisattentionàcequ’uneboîteauxlettresrécupèrele courrierquiseraitéventuellementpasséà travers; ceserale casquandl’adressedu destinataire

16

Procmail

n’aurapasla formesouhaitée.C’estentoutcasunefaçonrapide,maispeuefficace,dedistribuerdu courrierenprovenanced’uneseuleadresseàdestinationdeplusieurspersonnes.Unesolutionpluspratique,parexemple,estd’utiliser UUCP.

6. L’utilisation la plusattenduedeprocmailestle traitementdesspams.Bienqu’ilsoitpossibledelesbloquerplusenamont(listesnoiresaveclesserveursdecourriers,commeRSS,ORBS,MAPS,etc.),ondétestegénéralementlesvoirarriverdansla boîteauxlettres.JevousrenvoiesurlessitesstyleCauce(http://www.cauce.org/) pourlesraisonsphilosophiquesdela luttecontrele spametproposeunesolutionsimplepourmettredecôtélescourriersnondésirés.Jen’indiquepascommentlesjeter(/dev/null) carj’ai eudemauvaisessurprises:mieuxvautavoir un oudeuxspamsdansla boîtequ’un courrierimportantà latrappe!

La règlequi suit utilise la méthodedela « listenoire», quel’on gèreeninsérantdansun fichieruneadressenondésirée,voire uneexpressionrationnellesi l’onveutbloquerundomaineentier, parexemple.Elle utilisedeuxprogrammes,extract-addrs etmatch-email-addr tirésdela définitiondecetterègleadaptéedelistenoire.Pourl’historique,je mesuisbasésurlesrèglesdeLarzWirzenius(fameuxancienmodérateurdecomp.os.linux.announce)disponiblesàhttp://www.iki.fi/liw/mailfilter .html ; RichardGooch(fameux« hacker» dunoyauLinux, entreautres)a adoucicesrègleset metlessourcesdesdeuxprogrammescitésàdispositionà ftp://ftp.atnf.csiro.au/pub/people/rgooch/5 .

Compilezcesdeuxprogrammes,mettez-lesàun endroitaccessibleparprocmail(rappelez-vousdela variablePATH du.procmailrc), et incluezla règlesuivante:

# À modifier selon les casBLACKLIST=$MAILDIR /. bla ck li st

:0 Whic| extract-addrs | match-email-addr $BLACKLIST

# Si on a trouvé une adresse de spammeur (ci-dessus), alors...:0 a{:0:

17

Procmail

junk/spam}

Mettezdepréférencecetterègleversla fin devotrefichier deconfigurationprocmail,carelle passele courrierà traversdeuxtubeset estun peuplusgourmandequelesautresvuesauparavant.Lesdeuxpremièreslignesenvoientlecourriersurextract-addrs qui extrait lesadressesélectroniquesdu messageetlesenvoie àmatch-email-addr qui lescompareraavecle contenudela listenoire.

Encasdecorrespondance,le résultatdela commandeserapositif et la règlesuivanteseraexécutée,cequi abasiquementpoureffet demettrele courrierdecôté.Lisezcetteboîtedetempsentemps,onnesait jamais...

Le contenudufichier delistenoireestle suivant.Jevousconseillevivementdecréervous-mêmevotrefichierdelistenoire,aufur et àmesuredesnouveauxspams.Coupléeà d’autresrègles(pasdeHTML, est-cequele courrierm’estbienadressé,etc.),cetteméthoderéduiténormémentle nombredespamsdansla boîteprincipale(maispasle nombreabsoludecourriersnonsollicités,hélas).

# Les commentaires ainsi sont possibles --en tout cas, ça marche chez moi# (tm) -- voir le source de match-email-addr pour plus de détails

# quelques adresses « connues »Friend@public.co mfriend@everywher e. co mBeSeen@At.Our.Si te .c om

# quelques expressions rationnelles ; je suis un peu bour-rin sur ce coup# le mot-clé !regexp est important!regexp [@.]msn\.com!regexp [@.]aol\.com!regexp [.@]writeme\.com

Note: cepassagesurle spamdevrait fairel’objet d’unesectioncomplètepourlaprochainerévisiondu document.

18

Procmail

4.3. Utilisation en dehor s d’un serveur de courrier

4.3.1. Formail

Pourretraiteruneboîteauxlettresnontriéeavecunfiltre particulier, onpeututiliserformail, qui appelleraprocmailàsontour. Exemplepratique:

formail -s procmail fichier_filtre < boite_a_traiter

oùfichier_filtre estun fichiercontenantlesrèglesprocmailnécessairesautraitementdu fichieretboite_a_traiter estla boîteauxlettrescontenantlescourriersàfiltrer.

On peutomettrefichier_filtre, auquelcasle fichier deconfigurationpardéfaut(.procmailrc) serautilisé.

Formail permetbiend’autreschosesutiles,notammentcelled’extrairedeschampsparticuliersdesentêtesd’un courrier, ou d’ajouterdesentêtesparticuliers.Cecipeutêtreutile dansle casd’un répondeurautomatique(explicationdécortiquéedanslasectionsurl’utilisation avancéedeprocmailci-dessous).

L’utilisation deformail estdocumentéedansla pagedemanuelformail(1).

4.3.2. Mailstat

Si vousgénérezdestracesdel’utilisation deprocmail(parl’utilisation dela variableLOGFILE, parexemple),vousaurezenvie d’enavoir un condensérégulier; leslireexhaustivementpeutprendredu temps.L’outil « mailstat», livréavecProcmail,peutserviràcela6.

La commandesimplesuivantepermetdegénérerun résumédestracesdeprocmailtoutengardantle fichier detraceintact:

mailstat -klm procmail.log

19

Procmail

Le scriptsuivantpermetuneutilisationplusavancée,à lancerrégulièrement(unefoisparsemaine,parexemple):

#! /bin/sh# zerostat : archive les logs de procmail, envoie un ré-sumé par email

# Variables à modifier en fonction de votre environnement

# mettre votre loginMOI=toto

# indiquer le fichier de traceLOGFILE=~/Mail/. pro cmai l.l og

# utilisez gzip ou bzip2, au choixZIPEXE=bzip2

PATH=/bin:/usr/b in: /u sr /lo ca l/b in

mailstat -l $LOGFILE | \mail -s ’Statistiques procmail’ $MOI$ZIPEXE -f ${LOGFILE}.old

L’utilisation demailstatestdocumentée(succintement)dansla pagedemanuelmailstat(1). Nepasoublierdepasserle nomdu fichierà traiterenparamètre!

5. Utilisation avancéeOn peututiliser procmailpourd’autresutilisationsavancées,notammententantquefiltre globalpourtraitertout le courrierentrant.Lesutilisationspossiblessontdepouvoir filtrer lesspams,lesvirus, fairedesactionsdéfinies,avantquele courriernesoit délivréàchaqueutilisateur. Cecipeutêtretrèspratiquesurun relaisdecourrieràl’entréed’uneorganisationparexemple.

20

Procmail

Uneautreutilisationpossibleestdemettreenplaceun répondeurautomatique.Celapeutservirà plusieurschoses.

• Mettreun répondeurquandon partenvacanceset qu’on nerépondrapastoutdesuite,maisensignalantà l’expéditeurquele messageestconservé(principeduprogrammevacation).

Problèmesposés: nepasrépondredeuxfois à la mêmepersonne(utilisationd’unhachagepourrepérerlespersonnesauxquellesle filtre a déjàrépondu),nepasrépondreauxlistesdediffusion(c’esttrèsennuyeux,onsupposeraqueleslistessontdéjàtriéesquandle messagearrive,on vérifieraquandmêmequ’on netombepassurungestionnairedelistes,etc.).

• Faireun mini-serveurdefichiers,déclenchéparunebalisespécialedansle sujet(exemple: Subject: GET liste-fichiers.gz)

Problèmesposés: selimiter àunelistedefichierdéterminée,nepasaccepterlescaractèresbizarresqui pourraientcréerun trou desécuritéet permettredeservirn’importequelfichier dusystème.

5.1. Refuser des attac hements (Word, HTML, etc.)ThomasNemetha donnéla recettequ’il utilise pourfiltrer desmessagescontenantdesattachementsindésirables: scriptsVisualBasic(.vbs), desexécutablesWindows(.exe), desdocumentsWord (.doc) ou Excel(.xls). Cetterecettea poureffet derenvoyerun messageà l’expéditeurlui demandantdenepasenvoyercegenred’attachements.

:0 HB* ^Content-Type:.*\ .( ex e|v bs |do c| dot|x ls )*$ !X-Loop:.*$MOI| (formail -rtk -p ’| ’ \

-A "X-Loop: $MOI" \-A "Precedence: junk"; \cat $HOME/.procmail /ba df ile ) | $SENDMAIL -t -oi

21

Procmail

Cetterecetteutiliseprincipalementformail pourgénérerun messaged’auto-réponse.On recherche,à la fois danslesen-têteset dansle corps(drapeaux’H’ et ’B’), unen-têteMIME décrivantle contenu(Content-Type) et indiquantun nomdefichierseterminantparlesextensionsdéfiniesdansl’expression(exe|vbs|doc|dot|xls).Libre àvousd’enajouteroud’en retirer.

En casdecorrespondance,ongénèreuneréponseautomatique,qui incluerale messagecomplet: celui-ciestdoncperdupourun traitementultérieur, copiez-lesi vousvoulezle garderquandmême.Lesoptionsutiliséessontdécritesdansla pagedemanueldeformail. On inclut le messaged’origine,puisun messageexpliquantle refuset le toutestpasséàSendmail.

Vousavezsûrementremarquéla troisièmelignedecetterecette.Expliquons-laplusendétail.Quandnousgénéronsle message,nousajoutonsun en-têteX-Loop contenantnotreadresseélectronique(la variable$MOI està renseigneraudébut dufichier deconfiguration),qui serviraàprocmailpourtestersi le messageestdéjàpasséentresesmains.Ceciaunbut : éviterlesbouclesdecourrier, qui peuvents’avérertrèsgênantesàdécouvriret à réparer. On testedoncaveccetterèglequele messagen’a pasdéjàsubiun filtrage.Le signe$ derrièrel’étoile endébut deligne indiqueàprocmailquesetrouventdansla lignedesvariablesqu’il faudrasubstituer(ici, $MOI).

Il estpossibled’optimisercetterecette,pourcoller plusspécifiquementauformatMIME. En effet, l’en-têteContent-Type contientle typeMIME del’attachement,quiestplusdoncplusfiableàchercherquel’extensiondunomdefichier. On pourraitécrirela deuxièmeligneainsi,pourchercherlesattachementsbinairesWindows,parexemple:

* ^Content-Type:.*a ppli cat io n/o ct et -st re am. *n ame=. *\ .ex e

L’expressionrationnellecherchelesen-têtesreprésentantun attachementdetypeapplication/octet-stream, dontle nomseterminepar.exe. On peutfairedemêmeavecd’autrestypesd’attachement,le mieuxestdetester. Le tableausuivant

22

Procmail

représentedesattachementscourantsavecleur typeMIME correspondant:

Table 1. Attachements et types MIME

type MIME extension nom courant

application/octet-stream .exe binaireWindows

application/msword .doc documentWord

application/vnd.ms-excel .xls documentExcel

application/vnd.ms-powerpoint

.pps,.ppt documentPowerPoint

application/x-zip-compressed

.zip documentcompresséZip

application/x-unknown-content-type-hlpfile

.hlp documentd’aideWindows

application/pdf .pdf documentPDF

image/jpeg .jpg, .jpeg imageJPEG

image/gif .gif imageGIF

text/html .htm,.html documentHTML

text/x-vcard VCardNetscape

6. Conc lusion

6.1. Quelques ressour ces en ligneJevaistenterderésumerlesprincipalesressourceset documentationsdisponiblessur

23

Procmail

procmail.Il n’existepasàmaconnaissancedelivresurprocmail: unerecherchesurlachaîneprocmail surle siteAmazon(GB) (http://www.amazon.co.uk/)n’a rien donné,ni surle siteAmazon(USA) (http://www.amazon.com/).Parcontre,desréférencesàprocmailexistentdansleslivrespubliéschezO’Reilly.

Jetiensd’ailleursà noterqueje nesouhaitepasfaireun repompageouunetraductiondesdocumentsquej’énumèreici, sinonceneseraitpasdu jeu.Si je trouvedesmorceauxintéressantssurle forumfr.comp.mail ou quequelqu’unm’envoie desinformationsintéressantes,je lesincluedanscedocument.

Voici uneliste,nonexhaustiveévidemment,desitestraitantprincipalementdeprocmail.

6.1.1. Sites en anglais

• Procmail.org (http://www.procmail.org/)

• FAQ surprocmail(http://www.iki.fi/era/procmail/mini-faq.html)

• RessourcessurProcmail(http://www.procmail.org/jari/)

6.1.2. Sites en français

• unbonarticlesurprocmailsetrouvedansle numéro26dela Linux Gazette: LinuxGazetteenfrançais(http://www.linux-france.org/article/lgazette/issue-26/issue-26-4.html)

• cedocumentsetrouvesursonsitederéférence: Linux-France(http://www.linux-france.org/article/appli/procmail.html)

24

Procmail

6.2. Remerciements

• Nat Makarévitch,pourl’hébergementsurLinux-France;

• StéphaneÉcolivet,mainteneurdela sectionapplicationssurLinux-France,qui m’apousséà fairecedocumentquandil n’était qu’engestationdansmatête,et qui m’afourni lespremierspatchs;

• Éric Jacoboni,qui aécrit la sectionsurl’utilisation deGnusavecProcmail;

• ThomasNemeth,qui adonnéla recettepourfiltrer lesattachements,ainsiqued’autreséléments;

• NicolasLe Scouarnec,Didier Belot,contributeursdenombreusesastuces;

• lescontributeursdu forumfr.comp.mail ;

• tousceuxquej’ai oubliés,évidemment...

Notes1. et toutesmesexcusespourl’avoir oubliéaudébut...

2. Cefichier estgénéralementsituédans/etc/mail oudans /etc/sendmail,voire,d’aprèsÉric Jacobonidansl’article Configurationsimple(ou simplifiée)desendmailpourPPP(http://www.linux-france.org/article/mail/sendmail/sendmail.html), dans/usr/lib/sendmail-cf/cf si le systèmeutilisé estunedistributionRedHatdeLinux.

3. /usr/local/bin/procmail estl’emplacementpardéfautdeprocmail selonsendmail.

4. Cefichier setrouveengénéraldans/etc/postfix.

5. Le parcoursdesrèglesdecesdeuxpersonnesesttrèsinstructif et témoignentd’uneutilisationavancéedeprocmail.

25

Procmail

6. Nepasconfondreavec« mailstats» (notezle ’s’), utilisé avecSendmail!

26

Recommended