Tutoriel : Écrivez vos propres filtres SIEVE

Ce chapitre est un tutoriel pour vous montrer comment écrire des scripts utilisant le langage SIEVE. Il couvrira les éléments basiques pour son utilisation. Vous allez ainsi apprendre comment créer un script qui :

  • Rejette les messages au-dessus d’une certaine taille

  • Filtre les E-mails d’une liste dans un répertoire spécifique

  • Filtre les E-mails avec un sujet « suspect » dans le répertoire « Junk »

Il y a beaucoup d’options possibles avec SIEVE, dont beaucoup ne seront pas couvertes pas ce tutoriel. Mais ce dernier devrait vous fournir les bases pour comprendre le fonctionnement des filtres SIEVE, comment ils sont structurés, de manière à ce que vous soyez en mesure de créer vos propres filtres avec les commandes disponibles. Une liste des commandes disponibles sur les serveurs mails Gandi est disponible ici. Quelques exemples de filtres sont aussi disponibles ici.

Note

Même si votre logiciel de messagerie est en français, les parties des messages ou les répertoires seront utilisés avec leur nom « standard », c’est-à-dire en anglais, sinon le filtre ne pourra pas les reconnaître. Par exemple « boite de réception » correspond à « INBOX » et « Pour : » » à « To : »

Lister les extensions utilisées

La première chose à faire lorsque vous écrirez un filtre SIEVE est de lister les extensions qui seront requises par le filtre.

Le noyau SIEVE est constitué de quelques commandes basiques incluses ainsi que d’extensions ajoutant des fonctionnalités supplémentaires. La première ligne de votre script sera donc la commande « require » suivie de la liste des extensions qui seront utilisées dans le filtre. Dans le filtre créé dans ce tutoriel vous aurez besoin des extensions « fileinto » et « reject ».

Votre première ligne ressemblera donc à ça :

require ["fileinto", "reject"];

La liste des commandes disponibles sur les serveurs mails Gandi est disponible ici.

Commentaires

Quand vous écrirez du code, les commentaires sont du texte qui n’est pas interprété (pas pris en compte) quand le code est traité. C’est une bonne idée de commenter votre code pour expliquer à d’autres ce que vous essayez de faire avec le code, voire pour vous quand vous devrez modifier le code après un certain délai.

Vous pouvez créer des commentaires dans SIEVE un utilisant le caractère dièse (#) ou “hashtag” pour passer la ligne qui suit en commentaire, comme ci-dessous :

# Ceci est un commentaire.

Ou vous pouvez créer un commentaire sur une portion de ligne, ou sur plusieurs lignes comme ceci :

/* Ceci est aussi un commentaire. */

/* Ceci
* est
* un commentaire
* sur plusieurs lignes. */ avec une partie hors commentaire.

Le filtre que vous créez via ce tutoriel inclus des commentaires pour mieux vous expliquer chaque étape. Votre filtre devrait ressembler à cela :

# mon filtre SIEVE

# Liste des extensions utilisées par le script
require ["fileinto", "reject"];

Créer des critères de filtrage

Le filtre commence par bloquer tous les E-mails dont la taille dépasse les 2 Mo. Mais vous devez d’abord dire au filtre ce que vous recherchez. Pour cela il faut rajouter une commande if (condition). N’oubliez pas d’ajouter un commentaire aussi. Avec le commentaire et la condition votre filtre devrait ressembler à cela :

# Les messages supérieurs à 2 Mo seront rejetés avec un message d erreur
if

Ensuite il faut dire au filtre quelle partie du message il doit vérifier. Cela peut-être l’adresse « Pour : », l’adresse « De: », le sujet, la date d’envoi, etc… Dans ce cas le filtre doit vérifier la taille de l’E-mail, soit size

# Les messages supérieurs à 2 Mo seront rejetés avec un message d erreur
  if size

Ensuite il faut fournir un critère au filtre pour qu’il effectue la comparaison de la condition au contenu du message. Ce « comparateur » doit toujours être précédé d’un double point. Pour ce filtre vous allez utiliser :over. Cela dit au filtre de regarder les messages dont la taille dépasse (ou over en anglais) la taille spécifiée. Dans notre cas la taille doit être 2000K, 2000 Ko soit 2 Mo.

Nous avons donné au filtre un ensemble de critères à « comparer ». Pour dire à votre filtre que la condition est finie, il faut utiliser une accolade ouverte : {. Votre filtre doit ressembler à cela maintenant :

# mon filtre SIEVE

# Liste des extensions utilisées par le script
require ["fileinto", "reject"];

# Les messages supérieurs à 2 Mo seront rejetés avec un message d erreur
if size :over 2000K {

Effectuer des actions sur un message filtré

Après avoir défini quels messages vous recherchez, vous devez dire au filtre ce qu’il doit faire des messages qu’il trouve. Cela se fait en définissant une action entre des accolades ({ et }). Toutes les actions qui seront entrées entre ces accolades seront appliquées si (et seulement si) la condition est vérifiée.

Il y a plusieurs actions possibles sur un E-mail, comme le déplacer dans un répertoire spécifique , l’effacer, le transférer, etc… Ce filtre utilise la commande reject pour refuser la distribution du message dans la boite de réception.

# mon filtre SIEVE

# Liste des extensions utilisées par le script
require ["fileinto", "reject"];

# Les messages supérieurs à 2 Mo seront rejetés avec un message d erreur
if size :over 2000K {
reject "Je ne peux accepter des messages supérieur à 2 Mo.";

Après avoir écrit toutes les actions à appliquer dans le cas de la condition vérifiée, on « ferme » la partie des actions à appliquer avec une accolade fermée : }

# mon filtre SIEVE

# Liste des extensions utilisées par le script
require ["fileinto", "reject"];

# Les messages supérieurs à 2 Mo seront rejetés avec un message d erreur
if size :over 2000K {
reject "Je ne peux accepter des messages supérieur à 2 Mo.";
}

Après cette étape vous avez créé un script SIEVE parfaitement fonctionnel ! Nous pourrions nous arrêter là, mais il y a d’autres E-mails à filtres, donc continuons.

Ajouter d’autres critères

Vous voudrez sûrement filtré vos messages pour d’autres raisons. Pour ajouter des critères additionnels vous pouvez utiliser l’instruction elsif. C’est un raccourci pour else if (sinon si ..) et cela permet d’indiquer au script que d’autres critères peuvent s’appliquer sur les messages traités par le filtre qui ne correspondent pas au premier critère.

Attention

Quand vous utilisez du code SIEVE tous vos filtres doivent être dans un fichier unique. Quand vous téléverser un nouveau fichier SIEVE sur le serveur de mail il va écraser tout fichier existant. Autrement dit ne créez pas un nouveau fichier pour un nouveau filtre, mais éditez le fichier existant ou vos anciens filtres seront perdus.

Pour le prochain critère le filtre va déplacer tous les E-mails en provenance d’une mailing list dans un répertoire dédié. Pour commencer vous allez utiliser elsif :

# Mails from a mailing list will be put into the folder "mailinglist"
elsif

Pour cela le filtre a besoin de regarder la partie adresse du message. Comme vous recherchez une correspondance exacte sur l’ensemble de l’adresse vous allez utiliser le comparateur :is (est).

# E-mails en provenance de ou pour "mailinglist​@example​​.​com iront vers "Mailinglist"
elsif address :is

Maintenant que vous avez spécifié quel partie du mail vérifier, vous devez préciser le critère à rechercher pour la comparaison. Le filtre va vérifier les deux adresses « Pour : » (To) et « De: » (From) du message et appliquer les actions si l’une d’entre elle est « mailinglist​@example​​.​com ». Ceci ce fait en utilisant des « crochets » ([ et ]) suvis par l’adresse :

# E-mails en provenance de ou pour "mailinglist​@example​​.​com iront vers "Mailinglist"
elsif address :is ["From", "To"] "mailinglist​@example​​.​com"

Lorsque nous ajoutons l’accolage « fermée » pour clore la condition, le script ressemble à cela :

# mon filtre SIEVE

# Liste des extensions utilisées par le script
require ["fileinto", "reject"];

# Les messages supérieurs à 2 Mo seront rejetés avec un message d erreur
if size :over 2000K {
reject "Je ne peux accepter des messages supérieur à 2 Mo.";
}

# E-mails en provenance de ou pour "mailinglist​@example​​.​com iront vers "Mailinglist"
elsif address :is ["From", "To"] "mailinglist​@example​​.​com"

Déplacer des mails vers un répertoire particulier

Une des utilisations les plus fréquentes de SIEVE est de déplacer les E-mails dans des répertoires spécifiques. Cela se fait via la commande fileinto. Cette commande déplace l’E-mail dans le répertoire indiqué.

Dans le cas de ce filtre nous allons envoyer les messages en provenance ou envoyés vers « mailinglist​@example​​.​com » dans un répertoire « Mailinglist ». Comme ce répertoire sera un sous répertoire de la boîte de réception, nous allons utiliser « INBOX/mailinglist ».

# E-mails en provenance de ou pour "mailinglist​@example​​.​com iront vers "Mailinglist"
elsif address :is ["From", "To"] "mailinglist​@example​​.​com"
fileinto "INBOX/mailinglist";
}

À cette étape le filtre complet doit ressembler à cela :

# mon filtre SIEVE

# Liste des extensions utilisées par le script
require ["fileinto", "reject"];

# Les messages supérieurs à 2 Mo seront rejetés avec un message d erreur
if size :over 2000K {
reject "Je ne peux accepter des messages supérieur à 2 Mo.";
}

# E-mails en provenance de ou pour "mailinglist​@example​​.​com iront vers "Mailinglist"
elsif address :is ["From", "To"] "mailinglist​@example​​.​com"
fileinto "INBOX/mailinglist";
}

Tester plusieurs critères en une fois

Pour tester plusieurs critères en une fois, vous pouvez utiliser les instructions anyof (n’importe quelle (sous-entendu « condition »)) ou allof (toutes). L’instruction anyof va effectuer l’action tant qu’au moins une des condition des critères est valide. allof n’effectuera l’opération que si tous les critères sont valides. Ce filtre va utiliser anyof :

# si cet E-mail ne m'est pas adressé ou si le sujet contient "free money"  "Nigerian
# prince" mets le dans spam.
elsif anyof

Il vous faut ensuite placer les différents critères de tri entre parenthèses, séparés par un virgule. Le premier critère va rechercher tout E-mail qui n’est pas adressé directement à votre adresse (par exemple « myemailaddress​@example​​.​com »). Pour afficher une critère négatif (dans ce cas tout message non envoyé à votre adresse,) ajoutez not au début du critère. Beaucoup d’E-mails sont envoyés à plus d’une adresse, le filtre utilise :contains (contient) de manière à ce que l’ensemble des « Pour : », « Copie à: » ou « Copie cachée à: » (to, cc, bcc) ne doivent pas correspondre exactement.

# si cet E-mail ne m'est pas adressé ou si le sujet contient "free money"  "Nigerian
# prince" mets le dans spam
elsif anyof (not address :all :contains ["To", "Cc", "Bcc"] "myemailaddress​@example​​.​com",

Le critère suivant va rechercher des mots clés dans le sujet du mail. Cette fois ci vous allez utiliser le comparateur :matches. Ce dernier est assez similaire à :contains mais il vous permet d’inclure des « jokers ». Le joker * signifie que n’importe quoi peut remplacer ce caractère. Ainsi *free money* cherche n’importe quelle combinaison de caractères du moment que « free money » apparaît quelque part dans le texte. Le script avec ce critère ressemble à ça :

# si cet E-mail ne m'est pas adressé ou si le sujet contient "free money"  "Nigerian
# prince" mets le dans spam.
elsif anyof (not address :all :contains ["To", "Cc", "Bcc"] "myemailaddress​@example​​.​com",
header :matches "Subject" ["\*free money\*", "\*Nigerian Prince\*"]) {

L’étape finale de ce filtre va être d’utiliser fileinto pour envoyer ces E-mails dans le répertoire de spam. Avec cette partie ajoutée le script ressemble à :

# mon filtre SIEVE

# Liste des extensions utilisées par le script
require ["fileinto", "reject"];

# Les messages supérieurs à 2 Mo seront rejetés avec un message d erreur
if size :over 2000K {
reject "Je ne peux accepter des messages supérieur à 2 Mo.";
}

# E-mails en provenance de ou pour "mailinglist​@example​​.​com iront vers "Mailinglist"
elsif address :is ["From", "To"] "mailinglist​@example​​.​com"
fileinto "INBOX/mailinglist";
}

# si cet E-mail ne m'est pas adressé ou si le sujet contient "free money"  "Nigerian
# prince" mets le dans spam.
elsif anyof (not address :all :contains ["To", "Cc", "Bcc"] "myemailaddress​@example​​.​com",
header :matches "Subject" ["\*free money\*", "\*Nigerian Prince\*"]) {
fileinto "INBOX/spam";

Envoyer les mails restants vers un répertoire

Pour la dernière commande dans le filtre, nous allons envoyer tous les E-mails qui ne correspondent à aucun des critères définis dans un répertoire de « atrier ». Notez que cela n’est pas une partie obligatoire d’un script SIEVE. SIEVE considère de base que tous les E-mails qui ne sont pas « interceptés » par un filtre doivent simplement rester dans la boite de réception. Ce filtre est juste pour vous montrer comment traiter les messages restants après filtrage.

# Mets les mails restant dans un répertoire pour que je les trie plus tard.
else {
fileinto "INBOX/atrier";
}

Avec cette dernière commande notre script est maintenant finalisé.

# mon filtre SIEVE

# Liste des extensions utilisées par le script
require ["fileinto", "reject"];

# Les messages supérieurs à 2 Mo seront rejetés avec un message d erreur
if size :over 2000K {
reject "Je ne peux accepter des messages supérieur à 2 Mo.";
}

# E-mails en provenance de ou pour "mailinglist​@example​​.​com iront vers "Mailinglist"
elsif address :is ["From", "To"] "mailinglist​@example​​.​com"
fileinto "INBOX/mailinglist";
}

# si cet E-mail ne m'est pas adressé ou si le sujet contient "free money"  "Nigerian
# prince" mets le dans spam.
elsif anyof (not address :all :contains ["To", "Cc", "Bcc"] "myemailaddress​@example​​.​com",
header :matches "Subject" ["\*free money\*", "\*Nigerian Prince\*"]) {
fileinto "INBOX/spam";

# Mets les mails restant dans un répertoire pour que je les trie plus tard.
else {
fileinto "INBOX/atrier";
}

Normalement à cette étape vous devriez avoir saisi le principe de fonctionnement d’un script SIEVE et de ses éléments. Rappelez vous qu’un script SIEVE est flexible et qu’il y a beaucoup d’options disponibles. Une liste des commandes disponibles sur les serveurs mails Gandi est disponible ici. Quelques exemples de filtres sont aussi disponibles ici.