Ted écrit des trucs

C'est pas toujours très intéressant, mais il fait ce qu'il peut.

Passer d'OfflineIMAP à isync/mbsync

posté le
modifié pour la dernière fois le

Ça fait un petit bout de temps que j'en ai marre d'OfflineIMAP. À l'époque, la seule raison pour laquelle je l'avais choisi comme utilitaire de synchronisation IMAP, c'était sa position proéminente dans les résultats de recherche sur Internet. Puis, je l'ai gardé pendant longtemps par inertie, et parce que faute de point de comparaison, je ne savais pas si ce que je lui reprochais était inhérent à n'importe quel utilitaire du genre. Mes griefs principaux étaient les suivants :

  • c'est leeent (30 secondes pour synchroniser cinq comptes, en ne comptant pas le temps de téléchargement) ;
  • lorsque je n'ai pas de connexion Internet, ça devient vraiment lent, comme s'il ne comprenait pas qu'il était hors-ligne ;
  • lorsqu'on lance une instance d'OfflineIMAP alors qu'il y en a déjà une qui tourne, ça crée une situation chaotique et imprévisible, une sorte de deadlock (aw, Wikipédia me dit que ça s'appelle une « étreinte fatale » en français, n'est-ce pas adorable) qui nécessite souvent de tuer le processus à la main pour que ça aille mieux, et si on lance OfflineIMAP automatiquement toutes les deux minutes, ce genre de situation arrive souvent ;
  • puis, finalement, j'ai rencontré un bug incompréhensible qui m'a convaincu d'aller voir ailleurs si l'herbe était plus verte.

J'ai donc installé et fait marcher isync/mbsync (le premier nom est historique, le second est le nom de la nouvelle version de l'exécutable). Je ne sais pour l'instant pas si c'est significativement mieux qu'OfflineIMAP, mais ça a l'air rapide, les gens en disent du bien sur Internet, et surtout, ça a l'avantage de ne pas être OfflineIMAP.

Bref, voilà un mini-guide pour passer de l'un à l'autre. Mon .offlineimaprc ressemblait à ça :

[general]
accounts = damien
ui = quiet
 
[Account damien]
localrepository = damien_local
remoterepository = damien_remote
 
[Repository damien_local]
type = Maildir
localfolders = ~/Mail/ikura_damien/
 
[Repository damien_remote]
type = IMAP
ssl = yes
remotehost = desfontain.es
remoteuser = damien
remotepasseval = monsupermotdepasse
realdelete = no
cert_fingerprint = [plein de lettres et de chiffres]

et la section correspondante de mon .mbsyncrc ressemble maintenant à ça :

IMAPAccount dam
Host desfontain.es
User damien
Pass monsupermotdepasse
CertificateFile ~/Documents/cert-imap-ikura.pem
 
IMAPStore dam-remote
Account dam
 
MaildirStore dam-local
Path ~/Mail/ikura_damien/
Inbox ~/Mail/ikura_damien/INBOX
 
Channel dam
Master :dam-remote:
Slave :dam-local:
Create Both
SyncState *

et une fois que c'est fait, il faut bien sûr remplacer l'appel à l'exécutable d'OfflineIMAP par mbsync -a (typiquement, dans le crontab). Passons donc les configurations en revue pour comprendre comment traduire l'une en l'autre.

Trucs généraux

Pas mal de trucs ne nécessitent pas qu'on s'y attarde : j'imagine que vous aurez compris que les options basiques ont changé de nom, que la syntaxe diffère un peu. Les trucs nouveaux sont essentiellement le Create Both (qui signifie : quand y'a un dossier qui est créé en local, le créer aussi sur le serveur ; et de même dans l'autre sens) et le SyncState * qui dit de créer le fichier contenant les informations sur l'état des dossiers dans les deux sens dans un emplacement qui dépend du compte (~/Mail/ikura_damien/INBOX/.mbsyncstate dans mon exemple).

Configuration SSL

Mon serveur IMAPS utilise un certificat auto-signé, donc par défaut, mbsync (comme OfflineIMAP) va logiquement m'envoyer balader lorsque je vais essayer de m'y connecter. Avec OfflineIMAP, on pouvait indiquer un fichier .crt contenant le certificat en question, ou bien directement son empreinte.

Avec mbsync, on peut aller chercher le certificat et le mettre dans un fichier de la façon suivante :

openssl s_client -connect desfontain.es:993 -showcerts 2>&1 < /dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | sed -ne '1,/-END CERTIFICATE-/p' > ~/Documents/cert-imap-ikura.pem

puis on indique CertificateFile ~/Documents/cert-imap-ikura.pem dans le fichier de configuration, et pouf ça marche. (Évidemment, il faut utiliser l'adresse de votre serveur imap à la place de desfontain.es — le port 993 utilisé est le standard 993, mais vous aurez peut-être aussi besoin de changer sa valeur par défaut.)

Les mots de passe en clair, c'est mal

Vous vous souvenez peut-être que dans un article précédent, j'expliquais que j'appelais un script Python depuis OfflineIMAP pour stocker mes mots de passe IMAP dans un fichier chiffré par GPG, et non pas en dur dans le fichier de configuration. mbsync ne sait pas appeler un script Python, mais il sait lancer une commande externe. J'ai donc transformé mon .offlineimap.py en un script indépendant, que j'ai rendu exécutable et que j'ai mis dans un dossier de mon $PATH, ce qui me permet de traduire mon remotepass = mailpasswd("damien") en un PassCmd "decryptpasswd.py damien" (qui remplace le Pass monsupermotdepasse précédent).

(Précision : le script decryptpasswd.py contient en dur le chemin du dossier dans lequel je stocke mes mots de passe chiffré : vous aurez probablement envie de changer ça avant de l'utiliser.)

Conclusion (Ajoutée en avril 2017)

Ça fait donc presque deux ans que j'utilise isync et j'en suis très content.

  • Les rares problèmes que j'ai eus sont arrivés avec une fréquence bien moindre que quand j'utilisais OfflineIMAP.
  • C'est beaucoup plus rapide, ça n'ajoute qu'une à deux secondes au temps nécessaire pour télécharger les nouveaux mails.
  • Ça arrive que ça échoue parce qu'il y a plusieurs instances qui tournent en même temps, mais c'est vraiment rare. Tuer toutes les instances de mbsync suffit à le refaire fonctionner.

Je recommande :-)

Je n'ai pas de système de commentaires sur ce blog, mais je serai ravi de recevoir des réactions, des critiques ou des demandes de précisions sur ce que j'ai pu écrire. Vous pouvez m'envoyer ce qui vous chante à l'adresse :
se.niatnofsed@neimad.