0

Fusionner de multiples comptes IMAP avec imapfilter

Le cas en question qui m’a poussé à chercher un outil spécifique :

Avoir plusieurs comptes email (sinon à quoi bon ?)
Avoir plusieurs clients IMAP (sinon le filtrage peut probablement se faire sur le client unique pour ne pas se disperser)
Ne pas vouloir d’un client web (sinon Mailpile a l’air très bien)

La plupart des clients mails sont soient mal adaptés au multi-compte (par exemple Thunderbird, l’affichage devient vite ignoble) ou au filtrage de mail (la plupart des clients mobiles par exemple) en plus de ne pas avoir de standard de règle de filtrages pour avoir une configuration commune pour tous (probablement à raison, tout n’a pas besoin d’être standardisé). Donc je vais utiliser imapfilter pour regrouper tous les comptes IMAP en un seul. Quelques avantages :

C’est un outil simple et peu gourmand qui pourra tourner depuis à peu près n’importe quelle machine, du Raspberry Pi qui pilote l’imprimante 3D au coin de serveur dédié/VPS qui héberge vos autres services.
La création de règles de filtrage se fait via un script Lua, fini les bêtes filtres Gmail/Thunderbird/… où le copier/coller régnait en maître et à nous les concepts ultra avancés de listes et boucles !!
Et c’est à peu près tout mais on ne lui demande rien de plus que cela (IMAP gère la synchro et les fournisseurs de mails doivent proposer un anti-spam en amont – même si SpamAssassin doit pouvoir être intégré à imapfilter si le fournisseur de mail ne le fait pas) donc c’est l’outil parfait pour la situation.

Installation

On oublie déjà l’idée d’installer le paquet imapfilter de sa distribution, il s’agit d’une version antédiluvienne. Partons donc des sources de la dernière version.

Commençons par installer les pre-requis

apt install libpcre3-dev liblua5.3-dev libssl-dev lua5.3 make

Puis téléchargeons les sources (modifier les noms pour la dernière version)

mkdir -p /tmp/imapfilter_install
cd /tmp/imapfilter_install
wget https://github.com/lefcha/imapfilter/archive/v2.6.12.zip
unzip v2.6.12.zip
cd imapfilter-2.6.12

Il ne reste plus qu’à compiler (Pour Ubuntu qui ne trouve pas Lua tout seul, sinon « make » suffit)

make INCDIRS=-I/usr/include/lua5.3 LIBLUA=-llua5.3

Puis installer (pareil pour Lua et Ubuntu)

make install INCDIRS=-I/usr/include/lua5.3 LIBLUA=-llua5.3

Configuration

Passons aux choses sérieuses. Par défaut tout se fait dans le fichier ~/.imapfilter/config.lua (documentation complète dans man imapfilter_config avec des exemples de config dispo sur le Github du projet)

Le fichier config.lua d’exemple couvre la majorité des cas donc je rajoute juste un exemple pour exécuter une grande quantité de filtre sur une grande quantité de comptes, par exemple pour filtrer des newsletter/… Les mots de passe sont stockés en clair là, il y a certainement moyen de faire mieux mais le contenu des comptes en question n’était pas assez important pour que je me penche dessus.

On commence par définir les comptes en question :

-- le compte final
real = IMAP {
    server = 'imap.server.mail',
    username = 'charles@adressecachee.com',
    password = 'motdepasse',
}
-- les autres comptes qui recoivent les mails
accounts = {
    {'imap.server.mail', 'mesnewsletter@provider.com', 'pass123'},
    {'imap.server.mail', 'mapub@unfournisseur.com', 'mdp321'},
    {'imap.server.mail', 'encoredestrucs@monmail.com', 'pwd111'},
}

Ensuite on va créer une liste de sujets de mails à filtrer dans notre dossier newsletter. Imapfilter traite les mails en ASCII par défaut et j’ai trouvé plus simple de ne pas tenter autre chose et de juste entrer mes chaînes de caractères tels que visible dans la source du message).
Par exemple un service de vente en ligne m’envoie des notifications avec ce sujet (et d’autres m’enverront du ISO-machin et d’autres encore du windows-bidule mais certains enverront juste de l’ASCII)

Subject: =?UTF-8?Q?Tu_as_re=C3=A7u_un_nouveau_message_!

Donc on va se créer dans ~/.imapfilter/config.lua une liste des sujets que l’on voudrait filtrer avec des bouts de titres des messages.

notifications = {
    "Tu_as_re=C3=A7u_un_nouveau_message_!",
    "Nouveau message concernant l'annonce",
    "Colis disponible au Point Relais",
    "Exp=E9dition_-_Votre_commande",
}

Et il ne reste plus qu’à appliquer ce filtre à tous les comptes

for i=1,#accounts do
    account = IMAP {
        server = accounts[i][1],
        username = accounts[i][2],
        password = accounts[i][3],
    }
    -- check_status() permettra d'avoir un retour dans le terminal sur l'état de la BAL avant traitement
    account.INBOX:check_status()

    for j=1,#notifications do
        results = account.INBOX:contain_subject(notifications[j])
        -- Le dossier sur le compte final (qui doit déjà être créé)
        results:move_messages(real['Notifications'])
    end
end

On lance imapfilter (avec l’option -v pour voir le détails des commandes envoyées au serveurs mail) pour un premier filtrage. Si tout se passe bien il ne reste plus qu’à l’ajouter dans crontab ou le faire tourner en tâche de fond permanente avec become_daemon. Par exemple pour le lancer toutes les 10 minutes en sauvegardant le résultat dans un fichier de log :

*/10 * * * * /usr/local/bin/imapfilter >> /home/moi/.imapfilter/crontab.log

Laisser un commentaire

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