Pousser ses filtres SIEVE en ligne de commande et sans mot de passe (avec Kwallet)

Les filtres Sieve sont des régles de filtrage de mails exécutées par le serveur de messagerie (NB : tous ne le proposent pas). C’est à mon sens l’option la plus propre pour filtrer ses mails : quelque soit mon logiciel de consultation de mes mails (webmail, client graphique ou textuel sur ordinateur, client sur smartphone…), le filtrage sera toujours le même, sans avoir besoin de recopier les règles.

Pour éditer ces règles, il y a plusieurs solutions. La solution de groupware Bluemind, que j’utilise à titre personnel et professionnel fournit un éditeur graphique sur le webmail, mais il est trop limité pour mon usage : je ne peux que cumuler 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 provenant 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 Bluemind ne permet pas cela, les règles seront plus basiques (ah, les limitations des interfaces graphiques !). Thunderbird peut utiliser une extension, Sieve pour gérer les filtres Sieve, mais je ne sais plus trop ce que ça vaut, ça fait longtemps que je n’utilise plus Thunderbird. Kmail, le client de messagerie de KDE et que j’utilise, permet de gérer (nativement) les filtres Sieve de façon graphique mais poussée ou… de les écrire directement. Voilà qui est top ! Ah mais… c’est pas ouvert dans Vim. Dommage, j’ai mes petites habitudes et j’ai horreur d’utiliser un autre éditeur de texte.

La ligne de commande : sieve-connect

Donc, personnellement, j’utilise Vim pour écrire mes scripts Sieve et sieve-connect pour les envoyer à mon serveur de messagerie. Exemple :

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

Explication des options :

  • -s serveur.example.org : l’adresse du serveur ;
  • -p 2000 : le port utilisé par le serveur pour l’interface de gestion des filtres Sieve ;
  • -u luc@example.org : mon login ;
  • --localsieve /home/luc/filter.siv : l’adresse du fichier à pousser ;
  • --upload : l’action à entreprendre, donc l’envoi au serveur ;
  • --remotesieve mes_regles.sieve : le nom du fichier distant dans lequel je vais pousser mes règles. On peut effectivement 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’à activer le fichier qui les contient et zou 🙂

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

Sieve-connect permet d’envoyer des règles, de les récupérer, de lister les fichiers de règles, d’activer 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 profiter de KWallet, le gestionnaire de mot de passe de KDE contient déjà le mot de passe de mon compte mail, puisque j’utilise Kmail. Donc autant le lui demander !

Je peux demander l’accès au portefeuille 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 « application ». Kwallet me demandera si j’autorise l’application « Sieve push » à accéder au portefeuille. Cette commande va me retourner un handle que je vais utiliser dans mes demandes ultérieures. En allant voir dans l’application graphique de gestion Kwallet, KWalletManager, je vois que le mot de passe de mon compte de messagerie est akonadi_imap_resource_1rc du dossier imap. Donc pour en demander 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 application, "Sieve push", dans la commande. C’est nécessaire.

Plus qu’à donner le mot de passe à sieve-connect. Pour simplifier, je combine tout ça dans une fonction 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 terminal et ça enverra mon fichier de filtres à mon serveur de messagerie. Si mon portefeuille KWallet est ouvert, ça partira direct, sinon, ça me demandera le mot de passe du portefeuille.

Crédit : Photo par Tyler Nix sur Unsplash