sieve est malheureusement un grand oublié des serveurs IMAP. Peu de monde connaît ce petit langage qui pourtant peut rendre d'immenses services comme trier automatiquement le spam, les publicités, ou même renvoyer un message d'absence lorsque vous êtes en vacance. Voici donc un petit panorama pour régler cette injustice.
Pour mieux comprendre ce que Sieve peut vous apporter, un petit exemple parlant :require ["reject", "fileinto", "comparator-iascii-numeric", "relational", "imapflags"]
if header :contains ["X-Spam-Level"] ["**"]
{
fileinto "INBOX.Spams"
stop
}
D'un coup on comprends mieux à quoi cet outil peut servir. Sieve est donc un langage permettant divers opérations sur les courriels reçus par le serveur IMAP. Dans notre exemple, il analyse le header de chaque message et s'il s'agit d'un spam, le pause directement dans la sous-boîte spams. En gros, sieve permet de faire à peu près tout ce que permettent les classiques fonctions de filtrage des clients courriels, ais de manière automatique, au niveau du serveur lui-même. Ainsi, grâce à des scripts sieve bien construits, le mail est directement ventilé dans les sous boîtes, même avec un accès de type webMail.
D'un point de vue physique, sieve est un sous-serveur de cyrus placé sur le port 2000, il est activé dans le fichier /etc/cyrus.conf qui doit contenir la ligne suivante :
sieve cmd="timsieved" listen="sieve" prefork=1
Ensuite il faut simplement relancer cyrus (service cyrus-imapd restart) pour constate l'arrivé du serveur sieve (netstat -anlp | grep 2000).
Comme sieve est un serveur, vous pouvez acceder aux scripts à distance. Le moyen le plus simple que j'ai trouvé c'est un module KIOSLAVE dédié de KDE. Pour ceux qui ne connaissent l'architecture KIO de KDE est proprement géniale. En effet, KDE fournit une interface de type plugin pour prendre en charge les protocoles de lecture et décriture de fichier ou de dossier. Par exemple, si vous prenez konqueror et que vous tappez dans l'url imap://mon_login@mon_serveur_imap vous avez accès, après autentification, à vos mails en lecture...De la même manière vous pouvez accedez aux scritps sieve d'un compte par l'url sieve://mon_login_sieve@.
Logiquement donc, konqueror devrait après autentification afficher une page vide. Il n'y a en effet pour l'instant aucun script pour ce compte imap. Pour en créer un, clique droit et nouveau document texte que vous appellerez default.
Maintenant, très simplement, vous double-cliqué sur ce fichier default, qui s'ouvre sans broncher avec un éditeur de texte comme kwrite et vous pouvez éditer votre script. A chaque sauvegarde, votre travail est envoyé sur le serveur sieve, compilé et immédiatement actif. S'il y a une erreur de syntaxe, kwrite vous donnera même la ligne de l'erreur. Magique non ?
Petite vérification d'usage pour vérifier que le script est bien actif :
sieveshell -u toto -a toto serveur_sieve
# affichage du prompt sieve, on veut la liste des scripts de toto
list
# default
# on constate que le script n'est pas actif !
activate default
list
quit
Un script sieve commence par la déclaration des librairies pré-requises :
# importation des bibliothèques utiles
require ["reject", "fileinto", "comparator-iascii-numeric", "relational", "imapflags"]
Ensuite, vous pouvez inserez vos règles sous la forme de tests :
if BLOC_CONDITION
{
ACTION_1
...
ACTION_N
}
Les actions les plus "utiles" sont :
BLOC_CONDITION quant à lui peut être une condition simple ou une composition de conditions simples liées entre elle par des ET (allof) ou des OU (anyof) :
# condition simple
if CONDITION_SIMPLE
{
# liste des actions
}
# conditions liées par OU
if anyof (CONDITION_SIMPLE_1, CONDITION_SIMPLE_2, ..., CONDITION_SIMPLE_N)
{
# liste des actions
}
# conditions liées par ET
if allof (CONDITION_SIMPLE_1, CONDITION_SIMPLE_2, ..., CONDITION_SIMPLE_N)
{
# liste des actions
}
une condition simple se compose de l'objet sur lequel porte la condition, d'un type de condition et de paramétres. La syntaxe globale d'une condition simple est donc (notez bien le : et le not optionnel) :
[not] OBJET_CONDITION :TYPE_CONDITION PARAMETRE_CONDITION_1 ... PARAMETRE_CONDITION_N
Les objets de conditions classiques sont :
Les paramétres des conditions dépendent quant à eux beaucoup du type de condition. Cela peut être une chaine ("CHAINE"), une taille (1M pour 1mo), un tableau de chaines (["CHAINE_1","CHAINE_2",...,"CHAINE_N"]), etc...
enfin les grand types de condition sont :
L'exemple qui suit est une mise en application des principes énoncés plus haut. L'objectif est de filrer les spams flaggés par spamassassin selon 3 niveaux. Les spams de niveau 3 et plus seront détruits, les spams de niveau 2 et les erreurs de trasport de courries lié à l'usurpation d'adresse sont placés dans le dossier "spams", enfin les spams de niveau 1, sont placés dans le dossier "spams.ham".
# spamassassin a taggé le mail de niveau 3, on le détruit donc directement
if header :contains ["X-Spam-Level"] ["***"]
{
# supression du mail
discard
# c'est fini pour lui, on ne cherche pas à exécuter plus loin...
stop
}
# Par un composition de conditions de type OU, on cherche maintenant à filtre les autres
# spams pour les placer dans la boite "spam"
if anyof
(
# si le spam assassin a taggé ce mail de niveau 3
header :contains ["X-Spam-Level"] ["**"] ,
# si le mail est une erreur de distribution de courrier
allof
(
# sujet typique d'une erreur de distribution, on utilise "matches" pour bénéficier de *
header :matches "Subject" ["failure notice", "Delivery Status Notification*","Returned Mail:*"],
# on évite de jeter les erreurs de distributions de notre propre FAI
not header :matches "Received" ["*.mon_fai.fr"]
)
)
{
# on déplace le courriel dans la boîte des SPAMS
fileinto "INBOX.Spams"
# le traitement s'arrête ici
stop
}
# Le spam est de niveau 1, on peut avoir un doute, on le place donc dans le dossier spams.ham
if header :contains ["X-Spam-Level"] ["*"]
{
# on déplace le courriel dans la boîte des SPAMS
fileinto "INBOX.Spams.ham"
# le traitement s'arrête ici
stop
}
Ce bref apperçu de la syntaxe sieve permet surtout de saisir la puissance du filtrage proposé.
Maintenant quelques exemples simples de tests sieve? N'oubliez pas de mettre la ligne require comme indique plus.
On vérifie ici que la courriel est membre d'une mailling-liste (tag List-Id) et selons les cas, on ventile dans différents dossiers :
if header :contains ["List-Id"] ["xorg.lists.freedesktop.org"]
{
fileinto "INBOX.Mailling-Listes.xorg"
stop
}
Si le courriel vient d'une adresse donnée, on le place dans un dossier spécial. Noter que "contains" implique *@mon_client.com :
if header :contains ["From"] ["mon_client.com"]
{
fileinto "INBOX.Mailling-Listes.Ma Societe.mon client"
stop
}
Si le courriel est destiné à quelqu'un en particulier :
if header :contains ["To"] [""]
{
fileinto "INBOX.Mailling-Listes.Publicites"
stop
}
Si le courriel a été reçu via un serveur SMTP (relai) particulier :
if header :contains ["Received"] ["194.211.211.18"]
{
fileinto "INBOX.Ma Societe"
stop
}
Si le message est très gros, on le place dans un dossier particulier...
if size :over 1000K
{
fileinto "INBOX.gros courriels"
stop
}
Je suis en train de mettre en place un serveur smtp Postfix couplé à un serveur imap Cyrus. Autant dire que je suis heureux de lire cet article. Chapeau.
Une question : les filtres Sieve sont-ils forcément propres à UN utilisateur ? J'aimerais avoir un filtre qui classe certains messages arrivant dans une boîte, dans un dossier d'une autre boîte. Possible ?
Ravis que cela puisse servir (vu le peu de commentaires, dés fois j'ai des doutes
Pour un script global, pour autant que je m'en souvienne, il suffit d'utiliser sieveshell avec l'utilisateur cyrus. Le script sera alors exécuté à l'échelle globale.
Dit moi si cela fonctionne !
Ben non justement ça marche pas pour un script global, c'est ce que j'avais essayé mais ça marche pas
Autre chose qui serait de grande utilité : un tuto pour une installation complète Postfix / MySQL / cyrus-sasl / cyrus-imapd / Clamav / DSPAM / sieve le tout gérant des domaines virtuels. J'en trouve plein avec courier-imap mais cyrus-imap : désert. Ou alors sans le cas des domaines virtuels... avec un LDAP à la place de MySQL ça irait aussi... comme quoi je suis pas si difficile que ça !
C'est plus un tuto mais un livre qu'il faudrait là
Sur le site en cherchant tu devrais trouver "postfix/spamd", "postfix/cyrus/ssl", et "Cyrus/Sieve". Si tu ne trouves pas, dis-le moi, je te chercherais les pointeurs.
Pour ce qui est de postfix, j'avais le projet d'en écrire un mais c'est un monde à part entière ce soft. J'ai jamais eu le courage
Et en plus cela demanderais une maîtrise du bignou que je suis bien loin d'avoir... Sinon, j'ai pas vraiment exploité les domaines virtuels, juste une attaque à la sauvage postfix/virtual.cf. Donc rien de bien serieux.
Pour MySql je ne sais pas, j'utilise pas.
Salut,
je connais Sieve depuis longtemps, et c'est vraiment un outil super pratique. J'aimerai ajouter à ton article que Horde (http://www.horde.org/) possède un outil d'édition des règles Sieve. C'est très pratique pour les utilisateurs normaux qui peuvent ainsi profiter des avantages de cet outil.
Et en bonus, un lien vers mon guide d'installation (facile ?) de Horde:
http://howto.landure.fr/lone-wolf-scripts/gnu-linux/debian-4-0-etch/inst...
Bonne continuation.
Pour ceux que ça intéresse, j'ai diffusé mes modules sur CPAN pour manipuler les filtres
http://search.cpan.org/dist/Net-Sieve/
ou leur contenu
http://search.cpan.org/dist/Net-Sieve-Script/
ils son également dispo sur debian lenny et ubuntu Intrepid
Sinon pour ceux qui utilisent Thunderbird, y'a un module "sieve" qui existe..
https://addons.mozilla.org/fr/thunderbird/addon/2548
Aller juste un mot pour ajouter que dovecot gère aussi les règles sieve
Quand à thunderbird j'ai pas bien pigé comment il marchait le module
@Dup mais je l'ai mis, et en intro en plus !!!
Perso pour l'édition des scripts, après moultes essais de moultes modules qui m'ont systématiquement flingué ou au mieux crypté les sources des règles, je ne crois plus qu'en mon script basé sur vi. Lui au moins ne m'a jamais planté.
Erf j'ai commencé à lire à partir de Qu'est ce c'est Sieve inconsciemment lol
Ca va tu es pardonné
Ah bé vala, je vais plus faire d'intro moi, ça sert à rien
J'en profite, mais tu utilises dovcot de manière intensive ?
Intensive pas vraiment, mais il s'agit de mon serveur imap pour mon accès webmail & distant(thunderbird) en ssl.
Donc je suis en gros tout seul dessus mais je l'utilise combiné à postfix car il me paraissait plus simple à mettre en place que cyrus et on active les protocoles(pop3,pop3s,imap,imaps) que l'on désire dans le fichier de config.
@Dup en fait je me posais deux questions qui me feraient basculer direct :
1/ Est-ce qu'il y a un back-end postgresql
2/ Est-ce que les dossiers partagés sont enfin correctement supportés (autrement que par une immonde glute à base de ln -s)
1/ Bon en regardant vite fait la doc fourni avec le package dovecot j'ai pu y lire :
Currently supported user databases are:
* [AuthDatabase.SQL.txt]: SQL database (PostgreSQL, MySQL, SQLite)
Et idem pour l'authentification sur bdd.
2/ Dossier partagé, j'ai pu lire ca dans le dovecot.conf :
# You can have private, shared and public namespaces. The only difference
# between them is how Dovecot announces them to client via NAMESPACE
# extension. Shared namespaces are meant for user-owned mailboxes which are
# shared to other users, while public namespaces are for more globally
# accessible mailboxes.
J'ai pas testé si ca marchait bien, surtout a cette heure jme bats avec pam_ldap la, encore que je vais pas tarder à me coucher.
@Dup merci des infos ! Je vais sûrement tester cela rapidement.
Juste qq infos pour ceux qui voudraient utiliser sieve avec dovecot.
Dans dovecot.conf, décommenter la ligne
et ensuite, mettre ses règles sieve dans <racine du compte imap concerné>/.dovecot.sieve
Cf http://wiki.dovecot.org/LDA/Sieve pour qq exemple (répondeur, regex, colorier ses mails dans thunderbird) et http://casys.crevetor.org/index.php/Filtres_c%C3%B4t%C3%A9_serveur pour installer pysieved (je n'en ai jamais éprouvé le besoin car je trouve aussi pratique d'éditer mon fichier de filtres directement sur le serveur imap, mais ça peut servir).
Poster un nouveau commentaire