imapfilter : filtrer les courriels en CLI

Rédigé par Alexandre le 17/02/2022

#courriel #debian #outil

Depuis que j'ai un domaine chez OVH, j'utilise leur offre MX Plan comme service de messagerie. Au-delà du fait que ce service est bon marché, je n'ai jamais rencontré de problème avec et il est hébergé en France par une entreprise française.

Évidemment, je ne fais pas un article pour dire que tout va bien, mais pour présenter une solution a un problème qui me prenait la tête régulièrement. L'inconvénient majeur de se séparer de Google, est qu'on perd son système antispam et le confort de son interface web (PC) ou son application cliente (smartphone).

L'antispam d'OVH est loin d'être aussi bon que celui de Google. En effet, OVH utilise très certainement une solution libre (SpamAssassin par exemple), qui même si elle est efficace, n'est pas collaborative. L'interface web quant a elle, est une affaire de goût, mais aussi parce qu'OVH ne suit pas les mises à jour de la solution qu'ils ont choisie Roundcube. Bref, dans cette interface web, ce qui me manquait le plus, c'est la gestion des filtres. J'avais contourné ce problème en utilisant Thunderbird, cependant il faut que celui-ci soit ouvert pour que les règles s'appliquent.

Mon besoin de filtrage, puisque c'est ce dont il s'agit, a été comblé lorsque j'ai découvert imapfilter. Ce petit logiciel permet de se connecter en IMAP à un serveur (Gmail aussi) et d'appliquer toute une série de règles. La configuration se fait lua.

Dans la suite, je détaille l'installation et donne un exemple de configuration.

Installer imapfilter :

$ sudo apt install imapfilter

Créer le dossier de configuration :

$ mkdir ~/.imapfilter

Créer le fichier de configuration :

$ tee ~/.imapfilter/config.lua <<EOF
-- gérer les mots de passe complexes (source: https://github.com/lefcha/imapfilter/issues/199)
function sanitize_pwd(pwd)
  pwd = string.gsub(pwd, "\n", "")
  pwd = string.gsub(pwd, '%\\', '\\\\')
  pwd = string.gsub(pwd, '%"', '\\"')
  return pwd
end

-- définir le dossier de base
if_dir = os.getenv('HOME') .. '/.imapfilter/'

-- inclure la configuration des comptes
dofile(if_dir .. "accounts/demo_at_ykn_local.lua")
dofile(if_dir .. "accounts/<compte2>.lua"
EOF

Créer le dossier de stockage de la configuration par compte :

$ mkdir ~/.imapfilter/accounts/ && \
chmod go-rwx ~/.imapfilter/accounts/

Créer le fichier de configuration d'un compte, par exemple :

$ tee ~/.imapfilter/accounts/demo_at_ykn_local.lua <<EOF
-- définition du compte
demo_at_ykn_local = IMAP {
  server = 'ssl0.ovh.net',
  username = 'demo@ykn.local',
  password = sanitize_pwd('<mot de passe>'),
  port = 993,
  ssl = 'ssl3',
}

-- options
options.timeout = 120
options.starttls = true
options.charset = 'UTF-8'

-- afficher le status
demo_at_ykn_local.INBOX:check_status()

-- mettre à la corbeille les Confirmation de réservation de basic-fit
results = demo_at_ykn_local.INBOX:is_older(1) *
          demo_at_ykn_local.INBOX:contain_from('basic-fit.com') *
          demo_at_ykn_local.INBOX:contain_subject('Confirmation de réservation')
results:mark_seen()
results:move_messages(demo_at_ykn_local['Trash'])

-- mettre à la corbeille les messages de doctolib.fr
results = demo_at_ykn_local.INBOX:is_older(1) *
          demo_at_ykn_local.INBOX:contain_from('no-reply@doctolib.fr')
results:mark_seen()
results:move_messages(demo_at_ykn_local['Trash'])

-- supprimer de la corbeille les messages de plus de 30 jours
results = demo_at_ykn_local['Trash']:is_older(30)
results:delete_messages()
EOF

NB : remplacer <mot de passe> par le mot de passe du compte.

Déployer la planification :

sudo tee /etc/systemd/system/imapfilter@$(whoami).timer <<EOF
[Unit]
Description=Schedule imapfilter for %I
ConditionFileNotEmpty=/home/%I/.imapfilter/config.lua

[Timer]
OnBootSec=5m
OnCalendar=*:0/15
Persistent=true

[Install]
WantedBy=timers.target
EOF

Déployer le service :

$ sudo tee /etc/systemd/system/imapfilter@$(whoami).service <<EOF
[Unit]
Description=Launch imapfilter as %I
After=syslog.target
After=network.target
ConditionFileNotEmpty=/home/%I/.imapfilter/config.lua

[Service]
User=%I
Group=%I
Type=oneshot
ExecStart=/usr/bin/imapfilter

[Install]
WantedBy=multi-user.target
EOF

Démarrer le service :

$ sudo systemctl start imapfilter@$(whoami).service; sudo systemctl status imapfilter@$(whoami).service

En cas d'erreur, exécuter la commande à la main :

$ imapfilter -v

Si tout s'est bien passé, activer la planification :

$ sudo systemctl enable imapfilter@$(whoami).timer

Je ne vais pas plus loin dans les explications parce que le manuel est vraiment très complet. Je vous invite donc à le consulter pour créer les règles comme vous le souhaitez.

Références