trier des mails avec sieve

Trier des mails avec Sieve automatiquement

Nous allons voir comment trier des mails avec Sieve automatiquement, dès leur réception, les mails arrivant sur votre boîte mail. Pour cela, nous allons utiliser le langage Sieve. Sieve permet d’écrire un programme s’exécutant directement sur le serveur IMAP hébergeant vos messages dans votre messagerie SaaS. Aucun traitement ne s’effectue sur votre client mail, ce qui signifie que tous vos mails seront triés même si vous n’êtes pas connectés à votre compte.

Vous faites sûrement partie d’une ou plusieurs associations, clubs, entreprises ou encore groupes d’échange sur Internet, vous avez très probablement déjà été confronté à un flot très important de mails remplissant votre boîte de réception. Très souvent, seule une infime partie de ces mails nous intéressent réellement, mais ils se retrouvent noyés dans la masse, entre les petites annonces de don de vêtements pour bébés et les messages promotionnels incessants du dernier site de e-commerce que vous avez visité.

Rappels sur les mails

Avant de se lancer dans la création de vos filtres et trier des mails avec Sieve, il est nécessaire de faire un petit rappel sur la structure d’un mail, qui est composé de 3 parties : l’enveloppe, les entêtes et le corps.

  • L’enveloppe ne contient que 2 informations : L’adresse mail de l’éxpéditeur et celle du destinataire. Elle ne fait pas à proprement parler partie du mail, puisqu’elle peut être modifiée lors de son transit et est détruite une fois que le mail arrive à destination. On peut toutefois noter que lorsqu’un mail est envoyé, les adresses de l’expéditeur et du destinataire sont également recopiées dans les entêtes.
  • Les entêtes sont une liste de metadonnées remplissant différents rôles : informations sur le mail (date d’envoi, version du client mail utilisé, encodage, objet, etc..), informations ajoutées par les éventuels antivirus, antispams, et relais mail, ou encore des informations sur les pièces jointes au mail. Voici un exemple d’en-têtes :
Return-Path: <gaston.lagaffe@syloe.fr>
Delivered-To: <fantasio@syloe.fr>
Received: from zimbra.syloe.fr (localhost [127.0.0.1])
    by zimbra.syloe.fr (Postfix) with ESMTPS id A8F055A0630;
    Tue, 14 Apr 2015 17:03:21 +0200 (CEST)
Received: from localhost (localhost [127.0.0.1])
    by zimbra.syloe.fr (Postfix) with ESMTP id 975B35A062C;
    Tue, 14 Apr 2015 17:03:21 +0200 (CEST)
Received: from zimbra.syloe.fr ([127.0.0.1])
    by localhost (zimbra.syloe.fr [127.0.0.1]) (amavisd-new, port 10026)
    with ESMTP id ZU1lENUPC_X2; Tue, 14 Apr 2015 17:03:21 +0200 (CEST)
Received: from zimbra.syloe.fr (localhost [127.0.0.1])
    by zimbra.syloe.fr (Postfix) with ESMTP id 5390C5A05EB;
    Tue, 14 Apr 2015 17:03:21 +0200 (CEST)
Date: Tue, 14 Apr 2015 17:03:21 +0200 (CEST)
From: Gaston Lagaffe <gaston.lagaffe@syloe.fr>
To: Fantasio <fantasio@syloe.fr>
Cc: Spirou <spirou@syloe.fr>
Message-ID: <1089531838.67709.1429023801223.JavaMail.zimbra@syloe.fr>
In-Reply-To: <1014317873.4480627.1427465157423.JavaMail.zimbra@syloe.fr>
References: 106493651.4405146.1427376077701.JavaMail.zimbra@syloe.fr> <1707082205.4475449.1427454631118.JavaMail.zimbra@syloe.fr> <801632154.4475657.1427454688006.JavaMail.zimbra@syloe.fr> <1014317873.4480627.1427465157423.JavaMail.zimbra@syloe.fr>
Subject: Re: Publication d'article
MIME-Version: 1.0
Content-Type: multipart/mixed; 
    boundary="----=_Part_67700_9228178.1429023801208"
X-Originating-IP: [10.42.42.42]
X-Mailer: Zimbra 8.6.0_GA_1153 (ZimbraWebClient - GC41 (Linux)/8.6.0_GA_1153)
Thread-Topic: Publication d'article
Thread-Index: DdudKvtqMdQvcVkM5fCG344PgiBgBZ3Hj986
  • Le corps contient le message à proprement parler. Ce dernier peut être en texte brut ou formaté en HTML.  Le client mail du destinataire va alors interpréter le HTML contenu dans le mail. Le corps contient également les éventuelles pièces jointes au mail.

Ces 3 parties peuvent être utilisées pour établir des filtres et ranger vos mails dans les bons dossiers.

Comment trier des mails avec Sieve ?

Pour trier des mails avec Sieve, plusieurs solutions s’offrent à vous en fonction des accès dont vous disposez à votre boîte mail.

Dans le cas le plus simple, vous administrez vous-même votre serveur IMAP. Vous avez donc accès à la configuration du serveur. Je prendrais ici l’exemple de Dovecot.

La première étape est d’activer Sieve dans la configuration, dans la section plugin, en indiquant le chemin du fichier de script. Ici, on utilise le fichier .dovecot.sieve à la racine du dossier personnel de l’utilisateur :

plugin {
        sieve = ~/.dovecot.sieve
}

C’est dans ce fichier que nous écrirons tous nos filtres, vous pouvez le modifier avec votre éditeur de texte favori.

Dans le cas où vous n’avez pas accès à la configuration de votre serveur IMAP, il vous faudra utiliser un client supportant le protocole « managesieve », qui permet d’éditer ce fichier à travers une connexion IMAP. Une liste de tels clients est disponible sur ce lien. Il sera également nécessaire que votre serveur IMAP supporte ce protocole. Si ce n’est pas le cas, vous pouvez vous rapprocher de l’administrateur du serveur et faire une demande d’ajout de fonctionnalité.

Écriture de filtres : une étape pour trier des mails avec Sieve

Maintenant que nous avons accès au fichier de script Sieve, nous allons pouvoir écrire notre premier script.

La première ligne du fichier de script est un peu spéciale, elle permet en effet de spécifier quelle fonctionnalités de Sieve nous souhaitons utiliser. La liste de toutes les fonctionnalités supportées par le plugin Sieve de dovecot sont ici, à titre d’exemple.

Pour commencer, nous vous conseillons d’utiliser ces fonctionnalités :

require ["variables", "envelope", "fileinto", "mailbox", "regex", "subaddress", "body"];

Nous allons voir comment les utiliser en créant notre première règle.

Tri des listes de diffusion

if header :matches "List-Id" "*" {
    set "list_name" "${1}";
    if not string :is "${list_name}" "" {
        fileinto :create "Listes/${list_name}";
        stop;
    }
}

Cette règle permet d’examiner l’en-tête « List-Id » de chaque mail, et de placer le mail dans le dossier « Listes/NomDeLaListe », en le créant si ce dernier n’existe pas.

  • La première ligne permet à l’aide d’une regexp de matcher l’en-tête List-Id
  • La seconde ligne place la valeur de l’en-tête dans la variable « list_name »
  • On effectue ensuite un test sur cette variable pour vérifier si elle n’est pas vide
  • Si c’est le cas, alors on la place (« fileinto ») dans le dossier « Listes/${list_name} ». L’option :create permet de créer le dossier si celui-ci n’existe pas.
  • La dernière instruction (« stop »), permet de dire à Sieve d’arréter le traitement ici. Si on omet cette instruction, les filtres suivants seront également exécutés, et le message pourra se retrouver copié à d’autres endroits. Ce comportement peut être désiré ou pas. Ici, on veut que le mail ne soit retrouvé que dans le dossier correspondant à sa liste.

La grande majorité des mailing-lists ajoutent au mail cet en-tête « List-Id ». Ce filtre devrait donc trier une grande partie des mails provenant de mailing-lists arrivant dans votre boîte de réception.

Attention : En fonction de la configuration de votre serveur IMAP, le caractère permettant de séparer les dossiers (« / » ici) peut être différent. On rencontre également souvent le point (« . »), la ligne fileinto serait dans ce cas :

 fileinto :create "Listes.${list_name}";

Utilisation de l’extension de l’adresse email

La plupart des serveurs mails supportent l’ajout d’une extension à l’adresse e-mail, souvent délimitée par le caractère « + ». Par exemple, si un mail est envoyé à gaston.lagaffe+administratif@syloe.fr, alors le mail atterrira dans la boîte mail de gaston.lagaffe@syloe.fr. Si Gaston a au préalable créé un filtre tel que le suivant, alors cette extension pourra être exploitée :

if address :matches :detail "to" "*" {
    set "extension_name" "${1}";
    if not string :is "${extension_name}" "" {
        fileinto :create "${extension_name}";
        stop;
    }
}

On retrouve dans cette règle les même instructions que dans la règle précédente. Seule la première ligne change. On y spécifie à l’aide de l’option « :detail » de ne matcher que la partie située après le « + » dans l’adresse.

Filtres spécifiques

Si vous désirez mettre en place des filtres précis spécifiques à un type de mail que vous recevez, vous pouvez isoler les caractéristiques de ces mails et en faire des filtres. A titre d’exemple, voici un ensemble de règles permettant de trier les mails émis par une application GLPI :

if allof ( header :contains "from" "GLPI@syloe.fr" , header :contains "to" "support@syloe.fr" ) {
    if header :regex "subject" ".* \\| Nouveau ticket - .*" {
        fileinto :create "GLPI/Nouveaux tickets";
        stop;
    }
    elsif anyof ( header :regex "subject" ".* \\| Nouveau suivi - .*" , header :regex "subject" ".* \\| Modification Ticket - .*" ) {
        fileinto :create "GLPI/Suivi";
        stop;
    }
    elsif header :regex "subject" ".* \\| Ticket fermé le .*" {
        fileinto :create "GLPI/Fermetures";
     stop;
    }
    else {
        fileinto :create "GLPI";
     stop;
    }
}

Ce script utilise des opérateurs logiques (« anyof » correspond au « OU » et « allof » correspond au « ET » ). Ces opérateurs permettent de combiner des expressions pour faire des filtres très précis. On note également l’utilisation de « elsif » qui permet de traiter plusieurs cas dans un bloc « if ».

Trier des mails avec Sieve : pour aller plus loin

Nous espérons que ces quelques exemples vous auront permis d’en apprendre plus sur le langage Sieve et sur comment trier des mails avec Sieve. Si vous désirez en apprendre plus, voici quelques liens qui pourront vous être utiles :

Une réflexion au sujet de « Trier des mails avec Sieve automatiquement »

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *