Ted écrit des trucs

Sur des sujets en lien avec la vie privée, ou parfois pas.

Gérer ses mails en local : étape 3, rendre le tout utilisable avec mutt !

— modifié le

Ce billet fait partie d'une série d'articles présentant la façon dont je gère mes mails en local. Si vous êtes arrivés là sans lire l'introduction, c'est probablement une bonne idée de commencer par le début.


On commence enfin à en avoir fini avec la configuration « sous le capot », et on va enfin pouvoir voir directement les conséquences de nos bidouillages. Je vous présente donc Mutt, le client mail moins pourri que les autres.

C'est même, à traduction approximative près, leur slogan officiel.

Mutt est un client mail en mode console qui, conformément à la philosophie Unix, a été conçu pour être uniquement un client mail, c'est à dire qui lit un dossier de types Maildir, et qui permet de gérer son contenu efficacement. Il est très rapide, efficace, clair, et surtout, configurable à l'infini.

Installation et premiers pas

Pour l'installer, sans surprise, aptitude install mutt en root fera l'affaire. Pour le lancer, il suffit de lui préciser le dossier que l'on veut qu'il lise. Par exemple :

mutt -f ~/Mail/ikura_damien

vu que dans mon .offlineimaprc, j'avais indiqué ce dossier comme destination d'une de mes boîtes mail.

Je laisse faire au lecteur ses premiers pas dans mutt. Globalement, c'est plutôt intuitif - j/k ou les flèches directionnelles pour se déplacer, Entrée pour ouvrir un mail, q pour revenir au menu précédent… Dès qu'on cherche à faire une action, il suffit de taper ? au clavier pour obtenir la liste des commandes disponibles avec une description courte. On s'y fait assez vite, il n'y a pas besoin d'un tutoriel détaillé comme pour vim, par exemple. Par contre, par défaut, la configuration n'est pas très utilisable. Modifions donc le fichier de config', ~/.muttrc, pour en faire un mutt aux petits oignons qui fait exactement ce qu'on veut.

Évidemment, en pratique, devoir taper quelque chose d'aussi comme mutt -f ~/Mail/ikura_damien quand on veut ouvrir sa boîte mail, c'est affreusement long, donc j'ai un alias dans mon ~/.bash_aliases :

alias dam="mutt -f ~/Mail/dam"

dam est un lien symbolique vers ~/Mail/ikura_damien (ce qui permet de changer de dossier dans mutt en cliquant c, et en entrant =dam, au lieu de =ikura_damien).

Réglages internes

Alias

Mutt a un système d'alias minimaliste que je trouve pratique. L'idée est de taper « maman » dans le champ « To: » d'un mail qu'on veut envoyer, au lieu de adressedemamaman@gmail.com. Pour ajouter un alias, appuyer sur a alors qu'un mail de la personne en question est sélectionné.

set alias_file=~/.muttalias
source ~/.muttalias
set reverse_alias

Je sais que d'autres utilisent des logiciels de carnet d'adresses plus complexes (abook, ou des systèmes basés sur ldbd) mais en ce qui me concerne, ça me suffit.

Cache

Mutt a une fonction, désactivée par défaut, pour mettre certaines données (des en-têtes ou même le contenu de messages) en cache quelque part. Ça permet, notamment, de charger beaucoup plus rapidement le contenu de boîtes de réception récemment ouvertes. Pour activer cette fonction, on peut par exemple créer un dossier cache dans le ~/.mutt et ajouter :

set header_cache = ~/.mutt/cache/headers
set message_cachedir = ~/.mutt/cache/bodies

dans le ~/.muttrc.

Identités alternatives

Le comportement de mutt dépend parfois de la condition « est-ce que le message courant est un message reçu, ou un message envoyé » (par exemple, si on essaie de « répondre » à un message qu'on a envoyé, on a pas envie de se répondre à soi-même…). Et comme tout ce qu'il sait faire, c'est lire le contenu de dossiers, il n'a pas de méthode infaillible pour ça. Il faut donc l'aider avec un morceau de configuration dans lequel on lui dit quelles adresses e-mail sont les notres.

alternates ".*@desfontain.es|ddfontaines@gmail.com"

Configuration spécifique au dossier dans lequel on se trouve

C'est bien beau, tout ça, mais on aimerait bien que mutt interagisse avec le reste du système. Par exemple, qu'il sache quelle commande exécuter lorsqu'on lui dit d'envoyer un mail. Le paramètre pour ça s'appelle sendmail. Assez logiquement, si on veut utiliser msmtpq, il faudrait entrer :

set sendmail = "/usr/local/bin/msmtpq"

sauf que c'est plus compliqué que ça : on veut utiliser le contenu du .msmtprc pour envoyer les e-mails de plusieurs façons différentes, suivant si on est dans une boîte ou dans une autre.

On peut faire ça dans mutt, en utilisant des hooks. Dans le .muttrc, on met quelque chose de ce type :

folder-hook +dam "source ~/.mutt/damien"
folder-hook +ikura_damien/.* "source ~/.mutt/damien"

pour chaque dossier en local. Le fichier indiqué, ici ~/.mutt/damien, contient des morceaux de configuration qui ne seront pris en compte que si le dossier courant est ~/Mail/ikura_damien ou ~/Mail/dam. Dans le morceau de configuration en question, on met donc plein de choses.

On précise à msmtp la section de sa configuration à utiliser quand on veut envoyer un mail :

set sendmail = "/usr/local/bin/msmtpq -a damien"

on envoie les mails en mettant le bon champ « From: » :

set from = "damien@desfontai.nes"

on se met en copie de chaque mail envoyé (pas mal de gens avec qui j'ai discuté trouvent ça bizarre, moi j'aime bien voir sur une même page les mails que j'envoie et ceux que je reçois) :

my_hdr bcc: damien@desfontai.nes

du coup, ça ne sert à rien de garder une copie des mails envoyés dans un autre dossier :

unset record

et enfin, on indique l'endroit où on veut stocker les brouillons :

set postponed=+"ikura_damien/drafts"

Affichage et interface

Moins de questions, plus d'efficacité

Pas besoin de demander confirmation avant de sauver un message dans un dossier ou lorsqu'un message est déplacé par un script :

set noconfirmappend
set move = no

pas non plus besoin de poser cinquante mille questions sur les headers lorsqu'on répond à un mail :

set fast_reply

pour envoyer un mail, appuyer sur « Entrée » après avoir fermé l'éditeur, ça paraît naturel :

bind compose <Return> send-message

par ailleurs, ouvrir les boîtes mails compressées naturellement, ça permet de gagner du temps le jour où on en a l'utilité :

open-hook \\.gz$ "gzip -cd %f > %t"
close-hook \\.gz$ "gzip -c %t > %f"
append-hook \\.gz$ "gzip -c %t >> %f"

et d'un coup, ça va déjà plus vite :-)

Utiliser l'éditeur de son choix

Évidemment, une grande partie du temps qu'on passe sur un client mail consiste à envoyer des mails, donc le choix (et la bonne configuration) de l'éditeur de texte utilisé est aussi important que celui du client mail lui-même.

set editor="vim -c 'set tw=70 et'"

J'utilise vim, avec ma configuration habituelle (que je détaillerai dans un prochain billet, peut-être, un jour), en lui indiquant en plus d'utiliser des lignes de 70 caractères, pour être non seulement en règle vis-à-vis de la RFC sur le sujet mais pour avoir un peu de marge (et que les réponses, qui vont décaler chaque ligne de deux caractères en rajoutant les >, respectent toujours la RFC).

En passant, on en profite pour afficher les en-têtes du mail dans l'éditeur lui-même, ce qui permet de rajouter des destinataires ou de changer le sujet plus facilement qu'en faisant ça à l'intérieur de mutt.

set edit_headers = yes

Ah, et les signatures automatiques, je trouve ça horripilant, donc évitons.

unset signature

Avoir un joli affichage, c'est important

Par défaut, mutt manque sacrément de couleurs, et n'a pas vraiment une utilisation optimale de l'écran par défaut. Bien entendu, ses possibilités infinies de configuration permettent facilement non seulement de combler les lacunes de l'affichage par défaut, mais aussi d'obtenir une interface qui convient exactement aux besoins de chaque utilisateur.

Le pager, et le comportement des menus

Déjà, on utilise le pager de mutt parce que généralement, on a de la place sur l'écran : quand on consulte un message, on a une partie de l'écran qui permet de voir quels sont les quelques mails précédents et suivants, comme un petit menu. C'est très pratique.

set pager_context=5
set pager_index_lines=6

Ensuite, j'ai horreur de l'affichage de la liste de mails « par pages », où lorsqu'on descend plus bas que ce qui est déjà affiché, on se retrouve tout en haut de la page suivante. C'est beaucoup moins fluide qu'avec le bout de config' qui supprime ce phénomène.

set menu_scroll
set menu_context=6

Quand quelqu'un répond à un mail, on a envie de pouvoir accéder au mail original rapidement, et c'est particulièrement vrai lors de grosses discussions avec plein de ramifications. On va donc dire à mutt de trier les messages par fil de discussion, et il va même nous afficher les discussions compliquées sous la forme d'un joli arbre dans la liste.

set sort=threads
set sort_aux="last-date-received"
set strict_threads

Des couleurs, vite !

Bon, ça va déjà mieux, mais ça manque d'un truc important : la couleur. Avec les hooks de mutt, on peut profiter de la puissance des expressions régulières pour colorer n'importe quoi de n'importe quelle couleur. Ce morceau de config' prend vite de la place, donc on peut le mettre dans un fichier à part, que l'on appelle de la façon suivante :

source ~/.mutt/colors

j'ai mis mon ~/.mutt/colors personnel en ligne. Je ne pourrais pas me passer de la fonction qui colore les mails adressés à moi personnellement différemment (de façon beaucoup plus visible) que les mails reçus parce que je suis sur une liste de diffusion : en général, ceux de la première catégorie sont beaucoup plus importants.

Pour une interface vraiment aux petits oignons

Continuons avec quelques trucs moins importants, qui sont plus du confort qu'autre chose. La genre de barre bleue en haut ne sert franchement à rien donc enlevons-la :

set help = no

j'aime bien marquer visuellement la fin des e-mails par des tildes :

set tilde

je n'ai pas envie de « voir » quand une ligne a été coupée en deux, c'est moche :

set nomarkers

je n'ai pas envie de voir toutes les en-têtes d'un mail, mais seulement celles susceptibles de m'intéresser :

ignore *
unignore From: Subject To Cc Date Reply Organization Newsgroup

j'ai envie que les lignes soient coupées intelligemment, entre les mots, lorsqu'elles ne tiennent pas sur l'écran :

set smart_wrap

je suis content que les entrées du menu « alias » soient triés en fonction de l'alias et non pas du nom ou de l'adresse réelle de la personne :

set sort_alias = alias

et pour finir, afficher la version de mutt au démarrage, ça ne coûte rien et c'est joli :

push <show-version>

joie, bonheur, allégresse, mon client mail ressemble exactement à ce dont je rêvais quand j'étais petit.

Tout ce que je raconte ici sont mes opinions personnelles, pas celles de mon employeur.
Je suis toujours ravi de recevoir des réactions, critiques, questions, ou autres commentaires sur ce que j'écris. Envoyez-moi ce qui vous chante à se.niatnofsed@neimad.