Pous­ser ses filtres SIEVE en ligne de commande et sans mot de passe (avec Kwal­let)

Les filtres Sieve sont des régles de filtrage de mails exécu­tées par le serveur de messa­ge­rie (NB : tous ne le proposent pas). C’est à mon sens l’op­tion la plus propre pour filtrer ses mails : quelque soit mon logi­ciel de consul­ta­tion de mes mails (webmail, client graphique ou textuel sur ordi­na­teur, client sur smart­phone…), le filtrage sera toujours le même, sans avoir besoin de reco­pier les règles.

Pour éditer ces règles, il y a plusieurs solu­tions. La solu­tion de group­ware Blue­mind, que j’uti­lise à titre person­nel et profes­sion­nel four­nit un éditeur graphique sur le webmail, mais il est trop limité pour mon usage : je ne peux que cumu­ler des règles et non pas les mixer, créer des sous règles, etc. Un exemple de sous-règle : si je souhaite que les mails prove­nant de l’adresse foo@example.org soit rangés dans un dossier foo, et que si, parmi ces mails, le sujet contient bar, le mail soit marqué comme lu, je peux écrire en Sieve :

if allof ( address :contains "from" ["foo@example.org"] ) {
    if allof ( header :contains "Subject" "bar" ) {
        setflag "\\Seen";
    }
    fileinto "foo";
    stop;
}

Mais Blue­mind ne permet pas cela, les règles seront plus basiques (ah, les limi­ta­tions des inter­faces graphiques !). Thun­der­bird peut utili­ser une exten­sion, Sieve pour gérer les filtres Sieve, mais je ne sais plus trop ce que ça vaut, ça fait long­temps que je n’uti­lise plus Thun­der­bird. Kmail, le client de messa­ge­rie de KDE et que j’uti­lise, permet de gérer (nati­ve­ment) les filtres Sieve de façon graphique mais pous­sée ou… de les écrire direc­te­ment. Voilà qui est top ! Ah mais… c’est pas ouvert dans Vim. Dommage, j’ai mes petites habi­tudes et j’ai horreur d’uti­li­ser un autre éditeur de texte.

La ligne de commande : sieve-connect

Donc, person­nel­le­ment, j’uti­lise Vim pour écrire mes scripts Sieve et sieve-connect pour les envoyer à mon serveur de messa­ge­rie. Exemple :

sieve-connect -s serveur.example.org -p 2000 -u luc@example.org \
 --localsieve /home/luc/filter.siv --upload --remotesieve mes_regles.sieve

Expli­ca­tion des options :

  • -s serveur.example.org : l’adresse du serveur ;
  • -p 2000 : le port utilisé par le serveur pour l’in­ter­face de gestion des filtres Sieve ;
  • -u luc@example.org : mon login ;
  • --localsieve /home/luc/filter.siv : l’adresse du fichier à pous­ser ;
  • --upload : l’ac­tion à entre­prendre, donc l’en­voi au serveur ;
  • --remotesieve mes_regles.sieve : le nom du fichier distant dans lequel je vais pous­ser mes règles. On peut effec­ti­ve­ment avoir plusieurs fichiers de règles, mais un seul sera actif. Pratique pour avoir des règles spéciales pour les vacances : il n’y a qu’à acti­ver le fichier qui les contient et zou 🙂

Là-dessus, sieve-connect va me deman­der mon mot de passe et hop, c’est poussé !

Sieve-connect permet d’en­voyer des règles, de les récu­pé­rer, de lister les fichiers de règles, d’ac­ti­ver l’un ou l’autre. Bien pratique donc !

Et le mot de passe ?

Pour ne pas avoir à donner mon mot de passe à chaque fois sans pour autant le mettre dans un script, je vais profi­ter de KWal­let, le gestion­naire de mot de passe de KDE contient déjà le mot de passe de mon compte mail, puisque j’uti­lise Kmail. Donc autant le lui deman­der !

Je peux deman­der l’ac­cès au porte­feuille de mot de passe via D-Bus :

qdbus org.kde.kwalletd5 /modules/kwalletd5 open kdewallet imap "Sieve push"

La chaîne "Sieve push" est le nom que je déclare pour mon « appli­ca­tion ». Kwal­let me deman­dera si j’au­to­rise l’ap­pli­ca­tion « Sieve push » à accé­der au porte­feuille. Cette commande va me retour­ner un handle que je vais utili­ser dans mes demandes ulté­rieures. En allant voir dans l’ap­pli­ca­tion graphique de gestion Kwal­let, KWal­letMa­na­ger, je vois que le mot de passe de mon compte de messa­ge­rie est akonadi_imap_resource_1rc du dossier imap. Donc pour en deman­der le mot de passe, je fais :

qdbus org.kde.kwalletd5 /modules/kwalletd5 readPassword le_handle_obtenu_avant \
 imap akonadi_imap_resource_1rc "Sieve push"

NB : on notera que je répète le nom de mon appli­ca­tion, "Sieve push", dans la commande. C’est néces­saire.

Plus qu’à donner le mot de passe à sieve-connect. Pour simpli­fier, je combine tout ça dans une fonc­tion que je vais mettre dans mon ~/.zshrc :

sievepush() {
    ID=$(qdbus org.kde.kwalletd5 /modules/kwalletd5 open kdewallet imap "Sieve push")
    echo $(qdbus org.kde.kwalletd5 /modules/kwalletd5 readPassword $ID imap akonadi_imap_resource_1rc "Sieve push") | sieve-connect -s serveur.example.org -p 2000 -u luc@example.org --localsieve /home/luc/filter.siv --upload --remotesieve mes_regles.sieve
}

Et voilà ! Plus qu’à lancer sievepush depuis mon termi­nal et ça enverra mon fichier de filtres à mon serveur de messa­ge­rie. Si mon porte­feuille KWal­let est ouvert, ça partira direct, sinon, ça me deman­dera le mot de passe du porte­feuille.

Crédit : Photo par Tyler Nix sur Unsplash

Suppri­mer tous les mails de la file d’at­tente de post­fix pour un domaine parti­cu­lier

Aver­tis­se­ment : cette astuce ne fonc­tionne que si vous utili­sez postfix. Il faudra l’adap­ter si vous utili­sez autre chose, comme exim par exemple.

Il arrive qu’on ait un grand nombre de mails en attente pour un domaine erroné. Une des erreurs les plus fréquentes que nous rencon­trons à Frama­soft est l’uti­li­sa­tion d’une adresse en @gmail.fr. Un mail envoyé à une telle adresse n’abou­tira jamais (dig MX gmail.fr +short vous en convain­cra, il n’y a pas de champ MX pour ce domaine). Nous rencon­trons aussi pas mal d’adresses @voila.fr alors que voila.fr a cessé de four­nir du mail depuis le 12 janvier 2016 (Voir http://korben.info/voila-cest-fini.html).

On pour­rait lais­ser ces mails dans la file d’at­tente et attendre qu’ils expirent d’eux-mêmes au bout de 5 jours… mais cela fait 5 jours où la file d’at­tente gros­sit pour rien, ce qui déclenche des alertes dans notre super­vi­sion, ce qui peut masquer un réel problème.

Pour se débar­ras­ser de ces mails en une commande :

mailq | grep "gmail.fr" -B1 |\
 sed -e "s@ .*@@" -e "s@--.*@@" -e "s@(\(host\|delivery\|connect\).*@@i" -e "s@\*@@g" |\
 sed ':a;N;$!ba;s/\n/ /g' |\
 sed -e "s@ \+@ -d @g" -e "s@^@postsuper -d @" -e "s@ -d \+\$@@" |\
 bash