Gérez votre courriel efficacement et rapidement avec fetchmail et procmail.
(Article publié dans le bimestriel Linux Loader N°9 Octobre-Novembre 2001)

capture   Imaginez vous en train de surfer sur le net. Pendant ce temps là votre ordinateur va chercher périodiquement votre courriel dans vos différents comptes et l'ordonne dans les différents dossiers. Ce scénario n'est pas utopique, il est bien réel en utilisant des outils simples et rapides à configurer. Ainsi, vous optimiserez votre temps. de connexion et vous éviterez de nombreuses erreurs en laissant votre machine travailler pour vous.

Ce problème peut se découper en trois parties : collecte, tri, automatisation.

  1. Collecter le courriel.

    En anglais collecter peut se traduire par "to fetch". Il se trouve qu'un petit utilitaire écrit par Eric S. Raymond s'appelle fetchmail. Comme son nom l'indique il est bien entendu spécialisé dans la collecte du courriel.

    D'une manière générale, quelque soit le protocole utilisé par votre prestataire la séquence des évènements suit toujours le schéma

    connection --> identification --> collecte 
    

    Bien entendu ce schéma peut être réitéré, vous permettant d'interroger plusieur prestataires.

    fetchmail peut prendre ses arguments dans la ligne de commande ou dans un fichier de configuration le .fetchmailrc qui est dans votre $HOME avec les droits posititionnés à 600 par chmod 600 .fetchmailrc

    une fois que le schéma des évènements est connu, la syntaxe de ce fichier est à la fois simple, explicite et logique. En outre en cas de doute vous pouvez demander à fetchmail de vous expliquer ce qu'il comprend.

    Les commentaires dans ce fichier suivent la convention dièse : tout ce qui est compris du symbole # à la fin de la ligne est un commentaire.

    1. Connection

      Vous devez interroger un serveur de courriel en indiquant le protocole utilisé. Ceci donne par exemple :

      poll pop.wanadoo.fr protocol POP3:
      

      Ce qui signifie que vous devez intérroger le serveur de courriel de Wanadoo avec le protocole pop3 (Post Office Protocol version 3). Ces renseignements vous ont été fournis normalement par votre prestataire de service ; sinon soit ils figurent sur sa page d'accueuil, soit un appel téléphonique à son service d'aide devrait régler le problème.

      fetchmail reconnait plusieurs protocoles, les plus répandus sont POP et IMAP, ce sont ceux que vous utiliserez vraissemblablement. Il se peut que vous ne sachiez quel protocole est utilisé par votre fournisseur auquel cas utilisez le protocole AUTO ce qui forcera fetchmail à essayer les différents protocoles jusqu'à réussite ou abandon.

      Dans le pire des cas c'est à dire si vous accédez à votre fournisseur avec un modem, vous allez devoir rentabiliser au maximum votre temps de connexion aussi, bien que le gain de temps soit faible il apparait préférable de spécifier le protocole pour gagner en vitesse. Le gain obtenu est certes très faible, mais c'est la somme des petits gains qui au fil du temps finit par faire la différence.

    2. Identification

      Vous vous demandez certainement pourquoi les droits de votre .fetchmailrc doivent être au plus -rw------- ; la raison en est très simple ; puisque l'entrée suivante concerne le login et le password qui vous ont été assignés par votre prestataire.

      Ainsi vous avez une ligne dont la syntaxe est : user monLogin password monPassword;

      Comme vous pouvez le constater ceci est d'une grande simplicité, c'est presque de l'anglais courant.

    3. Collecte

      Maintenant que le serveur de courriel vous a correctement identifié vous allez pouvoir prélever votre courrier. Vous avez deux possibilités :
      soit vous téléchargez votre courriel puis, plus tard, vous l'effacerez du serveur de votre fournisseur. Soit après téléchargement vous l'effacez du serveur de votre fournisseur.
      D'une manière générale, lorsque l'on découvre et que l'on expérimente avec un utilitaire il est préférable de prendre ses précautions c'est à dire d'avoir une copie de sauvegarde chez le fournisseur. Par contre une fois que vous serez assurés du bon fonctionnement de votre outil, ce n'est plus la peine d'encombrer le serveur. Mais bien sûr c'est affaire de convenances personnelles.

      Il semble préférable afin de prendre un maximum de précautions d'appliquer ces règles simultanément à tous vos serveurs de courriel, d'où l'inclusion en tête de fichier de la directive suivante que l'on décommentera en cas de besoin.

      Ainsi, par défaut le courriel restera sur le serveur du fournisseur.

      defaults
      #       keep
      
    4. Passage à l'outil suivant.

      Maintenant que nous avons collecté notre courriel il faut appeler l'outil suivant. Ceci se fera directement à partir de notre fichier .procmailrc par la ligne suivante :

      mda "/usr/bin/procmail -Y -d %T"
      

    5. Récapitulons Notre fichier de configuration exemple est donc.
      defaults
              no fetchall
      #       keep
      
      poll pop.magic.fr protocol POP3:
      user monLogin1 password monPassword1;
      
      poll pop.wanadoo.fr protocol POP3:
      user monLogin2 password monPassword2;
      
      mda "/usr/bin/procmail -Y -d %T"
      
      le champ mda désigne l'agent de distribution du mail ( mail delivery agent : mda) dont l'utilisation et la configuration sont étudiés dans la partie 2. Enfin nous allons vérifier ce que fetchmail comprend grâce à la commande :
      fetchmail --version
      
      Celà peut paraitre surprenant mais en fait avec cette option, alors que d'autres programmes se contentent de donner des informations sur leur version, fetchmail va donner énormément d'informations le cas échéant en franĉais si votre système est localisé dans la langue de Molière.
  2. Procmail

    Maintenant que vous savez télécharger votre courriel, il est temps de le trier. Ceci se fait à l'aide de l'utilitaire procmail.

    Comme pour fetchmail vous devez avoir un fichier .procmailrc dans votre $HOME.

    Ce fichier comporte des options et des définitions de variables ainsi que des règles permettant de traiter le courriel.

    1. Les règles.

      Le fonctionnement en est, une fois encore, extrêmement simple : toutes les règles sont passées en revue jusqu'à ce qu'une règle corresponde au message courant. C'est donc le premier match qui compte.

      Si aucune règle ne permet d'établir de correspondance positive alors le message sera délivré sur votre compte pop local à la machine.

      Construisons ensemble une règle à partir d'un message exemple.
      Le New York Times envoie chaque jour un résumé de l'édition quotidienne par courriel. Comme ce message n'est pas d'une importance capitale, je préfère le ranger dans une boîte aux lettres pour le lire plus tard.

      From: The New York Times Direct <nytdirect@nytimes.com>
      Reply-To: nytdirect@nytimes.com
      To: monLogin1@wanadoo.fr
      Subject: Today's Headlines from NYTimes.com Tuesday, July 31, 2001
      
      Le champ From est susceptible de changer, par contre le champ Reply-To restera vraissemblablement constant au cours du temps. Aussi c'est sur ce champ que la règle de correspondance doit être écrite.

      Cette règle est :

      :0:
      * ^Reply-To:.*nytdirect
      nytdirect
      
      :0 signifie nouvelle règle. Et le : après le 0 signifie verrouiller le fichier où nous allons écrire afin de ne pas le corrompre en écrivant simultanément deux messages.

      * ^Reply-To:.*nytdirect c'est une expression régulière dont la signification est "n'importe quoi contenant Reply-To: et nytdirect" la troisième ligne est l'action entreprise. Celle ci consiste à stocker le message dans la boîte aux lettres nytdirect.
      Maintenant examinons ensemble deux entêtes de message pour nous entrainer.

      To: linuxfr-news@linuxfr.org
      From: null@linuxfr.org
      Reply-To: null@linuxfr.org
      X-Sequence: 27
      List-Unsubscribe: <mailto:sympa@linuxfr.org?subject=unsubscribe%20linuxfr-news>
      X-Validation-BY: seisen@linuxfr.org
      Subject: [Da LinuxFR News] Samedi 30 Juin 2001
      X-Virus-Scanned: by AMaViSperl10-milter (http://amavis.org/)
      X-Virus-Scanned: by AMaViSperl10-milter (http://amavis.org/)
      
      
      
      
      Voici les News officielles de LinuxFR du Samedi 30 Juin 2001.
      En tout 7 news ont été approuvées par les modérateurs.
      .........................................................
      
      Le suivant :
       From: "Tim E. Harper" <tim@cmp-cientifica.com>
      To: "TNT Weekly, a free weekly round up of the world of nanotechnology"
      +<tntweekly@lyris.ipindustries.com>
      Subject: TNT Weekly 30th July - Week 31, 2001
      List-Unsubscribe: <mailto:leave-tntweekly-58P@lyris.ipindustries.com>
      Reply-To: "TNT Weekly, a free weekly round up of the world of nanotechnology"
      +<tntweekly@lyris.ipindustries.com>
      
      Welcome to TNT Weekly, a free weekly round up of the world of nanotechnology.
      TNTW Week 31, 2001.
      .........................................................
      

      Pour le premier message une règle concernant le sujet peut être intéressante à écrire car il y a le caractère [ qui va quelque peut en modifier l'écriture.
      Nous obtenons ici :

      :0:
      * ^Subject:.*\[Da LinuxFR News\]
      daNews
      
      En observant nous constatons deux changements par rapport à la règle précédente :
      Avant les deux caractères [ et ] nous avons inséré un \ pour signifier qu'il faut considérer [ et ] comme des caractères et non comme une partie d'une expression régulière.

      Pour le second message ayant trait à la nanotechnologie, l'entète est extrèmement chargé mais il y a une assez forte probabilité pour que dans le champ Reply-To l'on continue de trouver la chaîne de caractères <tntweekly. Aussi la correspondance se fera sur ce champ et la règle est donc :

      :0:
      * ^Reply-To:.*\<tntweekly
      tnt
      

      Comme vous pouvez le constater l'écriture de règles simples est à la portée de tout moyennant un peu d'esprit d'observation. Et vous conviendrez que les cinq minutes que vous avez consacré à l'analyse de l'en tête et l'écriture de la règle sont largement amorties.

      Ici le caractère < est signalé comme un caractère imprimable standard avec l'antislash le précédent.

      Avant d'aller plus loin dans l'écriture de règles une petite subtilité au passage.
      Sachant que toutes les règles du fichier de configuration sont examinées jusqu'au succès ou à la fin du fichier. Vous devez optimiser la position de vos règles dans le fichier afin de gagner du temps.

      Ainsi, sur les trois règles examinées, deux concernent un évènement quotidien et la troisième un évènement hebdomadaire. Aussi il est tout à fait logique d'écrire les règles concernant le message le plus fréquent en tête du fichier.

      Un petit exemple et un peu de calcul mental devraient finir de vous persuader du bien fondé de ce principe.

      Soit un fichier de 25 règles. Sachant que la liste de diffusion concernant les algorithmes d'infographie à un traffic journalier pouvant atteindre les 20 messages par jour.
      Si la règle concernant cette liste est à la fin du fichier ; pour chaque message de cette liste il faudra effectuer 25 comparaisons soit un total de 500 comparaisons un jour de fort traffic alors que si cette règle est placée en tête du fichier l'on reviendra à un nombre beaucoup plus raisonable de 25 comparaisons.

      N'oublions pas que si vous recevez un nombre assez élevé de messages par jour, disons 300 vous devez encore plus optimiser le placement de vos règles dans le fichier sinon vous aller perdre beaucoup de temps.

      Profitons en pour écrire ensemble cette règle.

      From: "Jeffrey Rainy" <jrainy@hexacto.com>
      To: <gdalgorithms-list@lists.sourceforge.net>
      Subject: Re: [Algorithms] sphere rendering
      X-BeenThere: gdalgorithms-list@lists.sourceforge.net
      X-Mailman-Version: 2.0.5
      Reply-To: gdalgorithms-list@lists.sourceforge.net
      List-Help: <mailto:gdalgorithms-list-request@lists.sourceforge.net?subject=help>
      List-Post: <mailto:gdalgorithms-list@lists.sourceforge.net>
      List-Subscribe:
      <http://lists.sourceforge.net/lists/listinfo/gdalgorithms-list>
      
      Une correspondance sur le sujet est tout à fait apppropriée.
      :0:
      * ^Subject:.*\[Algorithms\]
      gdalgorithms-list
      

      Comme vous avez pu le constater ranger un message dans un fichier est une chose aisée.

      Il y a des fois où vous recevez beaucoup de messages en provenance d'une provenance qui vous importune. Sachant stocker un message dans un fichier et étant donné que /dev/null est à la fois un fichier et l'équivallent UNIX d'un trou noir la règle est extrèmement simple à écrire :

      :0:
      * ^From:.*@pleindespam
      /dev/null 
      

      Maintenant que l'écriture de règles de base est maitrisée, passons à une règle un peu plus complexe.

      Nous allons automatiquement refuser les attachements en format HTML
      Pour ce faire, il faut aborder une petite notion annexe qui est le Multipurpose Internet Mail Extensions plus communément appelé type mime. Les définitions sont données par les RFC 1521 et 1522. Ces types sont définis dans le fichier /etc/mime.types installé par le paquetage mime-support et ils permettent de spécifier le type de données inclues dans un message électronique.

      Ainsi, dans ce fichier, le type mime correspondant au HTML est :

      text/html .htm, .html
      
      La règle est :
      :0 HB
      * ^Content-Type:.*text/html.*name=.*\.html
      $ !X-Loop:.*monLogin@wanadoo.com
      | (formail -rtk -p '| ' \
      	   -A "X-Loop: monLogin@wanadoo.com" \
      	   -A "Precedence: junk"; \
      	   cat $HOME/no_HTML.txt ) | $SENDMAIL 
      

      Cette règle peut paraitre un peu complexe au premier abord mais en l'examinant attentivement ligne par ligne, elle devient au moins aussi facile à comprendre et à écrire que les règles précédentes.

      Sur la première ligne, la recherche se fera sur l'en tête ( Header ) et le corps ( Body ). Ensuite l'on recherche le type mime et le nom correspondant au .html. Comme il est prévu de renvoyer le mail à son auteur et que l'on risque de le recevoir à nouveau il faut prendre la décision de renvoyer ce message uniquement si l'on ne figure pas dans le champ X-Loop. D'ou la présence de l'opérateur de négation ! devant le test sur le champ X-Loop Ensuite ; au lieu de ranger le mail dans un fichier il est transmit au programme formail, d'où le pipe | en reconstruisant les en têtes avec en prime un message demandant de renvoyer ce mail en format texte dans le fichier no_HTML.txt de votre $HOME.

      Comme tous les arguments sont à écrire sur une seule ligne nous utilisons l'antislash avant le retour charriot pour signifier qu'en fait c'est une seule et même ligne. Le tout est envoyer a l'agent de transport du courriel définit dans la variable $SENDMAIL

      Sachant que dans /etc/mime.types le .doc a la définition suivante :

      application/msword            
      

      Ecrire une règle pour refuser les attachements à ce format est un petit exercice qui ne devrait pas vous poser de problème.

    2. Un fichier complet.
      #
      # infos de  deboguage
      #
      VERBOSE=no
      
      #
      # Shell
      #
      SHELL=/bin/sh
      
      #
      # MailDir
      #
      MAILDIR=$HOME/Mail
      
      #
      # Urgence
      #
      ORGMAIL=$MAILDIR/urgent
      
      #
      # L'agent de transport du mail
      #
      SENDMAIL=/usr/sbin/sendmail
      
      #
      # On logue au cas ou
      #
      LOGFILE=$MAILDIR/procmail.log
      
      
      #
      # Maintenant les règles.
      # 
      :0:
      * ^X-Loop:.*wear-hard
      wearable
      
      :0:
      * ^Subject:.*\[Algorithms\]
      gdalgorithms-list
      
      :0:
      * ^Reply-To:.*OPENGL
      opengl-gamedev-l
      
      :0:
      * ^X-Mailing-List:.*selinux
      selinux
      
      :0:
      * ^Delivered-To:.*discussion
      hal
      
      :0:
      * ^Subject:.*\[Modérateurs\]
      moderateurs
      
      
      :0:
      * ^X-Loop:.*debian-sparc
      SPARC
      
      :0:
      * ^Subject:.*\[f-cpu\]
      f-cpu
      
      :0:
      * ^Subject:.*\[SQL\]
      pgsql-sql
      
      :0:
      * ^From:.*Linux Today
      listsupport
      
      :0:
      * ^From:.*alert
      stratfor
      
      :0:
      * ^Reply-To:.*nytdirect
      nytdirect
      
      
      :0:
      * ^From:.*unixinsider
      unixinsider
      
      
      :0:
      * ^Subject:.*\[Da LinuxFR News\]
      daNews
      
      
      :0:
      * ^Subject:.*Embedded
      mpw
      
      :0:
      * ^Reply-To:.*\<tntweekly
      tnt
      
      :0:
      * ^To:.*rumors
      rumors
      
      :0 HB
      * ^Content-Type:.*application/msword.*name=.*\.doc
      $ !X-Loop:.*monLogin@wanadoo.com
      | (formail -rtk -p '| ' \
      	   -A "X-Loop: monLogin@wanadoo.com" \
      	   -A "Precedence: junk"; \
      	   cat $HOME/no_WORD.txt ) | $SENDMAIL 
      

      Tout d'abord il est plus pratique lorsque l'on modifie ses règles d'avoir des informations plus complètes sur les différents tests effectués par procmail. C'est le rôle de la variable VERBOSE qu'il suffira de postionner à yes.

      Ensuite il est pratique d'indiquer à procmail la localisation du shell , puis dans quel répertoire doivent être rangés les différentes boîtes aux lettre.

      Pour garder une trace de ce qui se passe, il est préférable d'avoir une petit journal des évènements ici dans $HOME/Mail/procmail.log

      Ceci permet aussi de ne pas à avoir à lancer son lecteur de courriel pour être au courant de ce qui se passe. Ainsi, dans le fichier de démarrage de votre gestionnaire de bureau l'entrée

       Eterm -OW --shade 40 -P none  -T "Courriel" -e tail -f ~/Mail/procmail.log >/dev/null 2>&1&
      

      permet de lancer un Eterm transparent qui affichera la liste des messages triés par procmail ainsi vous pourez travailler tranquillement.

      Bien que le journal ~/Mail/procmail.log prenne peut de place, vous pouvez le maintenir à une taille très faible en insérant la ligne suivante dans votre crontab

      @reboot rm -f $HOME/Mail/procmail.log; touch $HOME/Mail/procmail.log
      

  3. Assemblons le tout.

    Il est hors de question de tester en permanence si vous avez du courriel, par contre interroger vos différents serveurs de courriel tous les quarts d'heure est une chose raisonable.

    Si l'on suppose que vous ne disposez pas de connection permanente et que vous accédez à l'Internet par un modem RTC ou par un modem ADSL la solution est toute simple. La connection se faisant par une liaison PPP, si cette liaison existe alors vous lancez fetchmail sinon il ne se passe rien. procmail étant appelé par fetchmail vous n'avez pas à vous en soucier.

    Ces conditions s'expriment dans le script suivant placé par exemple dans ~/bin/courriel

    #!/bin/sh
    
    #
    # si vous ne possedez qu'une seule liaison ppp
    # ce sera ppp0 
    #
    
    if [ -e /var/run/ppp0.pid ]; then
     fetchmail -s
    fi
    
    N'oubliez pas de rendre ce script éxécutable par la commande chmod +x ~/bin/courriel Si vous disposez d'une connection permanente devient
    #!/bin/sh
    fetchmail -s
    

    Puis dans votre crontab ajoutez l'entrée suivante pour vérifier votre courriel toutes les quinzes minutes.

    */15 * * * * $HOME/bin/courriel.sh >/dev/null 2>&1
    
    Pour plus d'information sur la crontab vous pouvez vous reporter à l'article intitulé cron et la crontab paru dans LinuxLoader N°7.

    Ainsi, comme dans tous les cas seule une partie de votre script change vous gagnez en souplesse.

  4. Configurer votre client de courriel.

    Il faut fournir deux informations à votre client de courriel :

Télécharger les outils :



Copyright ©2001
lionel, trollhunter Bouchpan-Lerust-Juery