Mutt, redécouverte et configuration partagée

Bonsoir à tous !

Je me sens motivé ces jours ci pour redécouvrir des outils considérés comme « complexes » pour certains mais tellement intéressants à découvrir et maitriser. Dans ce domaine, les applications en console sont au premier rang : elles demandent un investissement dans la documentation du logiciel et dans la mise en place d'une configuration de fichiers textes. 

Un outil indispensable, pour ceux qui n'ont jamais apprécié les webmails, c'est un courrieleur. Utilisé au quotidien, il doit correspondre à vos besoins et présenter un confort d'utilisation irréprochable (à mon avis). J'ai testé de nombreux clients de messagerie : Claws-mail arrive largement en tête de la catégorie graphique, grâce à sa légéreté et ses options complètes. Thunderbird, je ne suis pas capable, désolé…

Fût un temps où j'ai également utilisé Mutt, le client messagerie en console. J'avais abandonné lors de mon passage en Bépo : le changement des raccourcis claviers m'avait oté les repères que j'avais pris et j'avais perdu le goût de l'utiliser. Jusqu'à ces derniers jours où j'ai décidé de lui redonner sa chance.

Alors bien sur, il a fallu que je me redocumente sur les fonctions de cette application, très complète, et que je me replonge dans la configuration du muttrc, pierre angulaire de cet outil. C'est alors que j'ai eu le sentiment d'un bordel monstre dans ce fichier de config crée, monté, patché et inspiré de nombreux tutos sur la toile. Un vrai foutoir !

J'ai donc décidé de rafraichir un peu tout ça, de nettoyer le code et de repartir sur des bases saines. Cela m'a permis de mieux comprendre le fonctionnement de Mutt (les copier coller n'enseignent rien) et peut être de vous proposer un kit de démarrage pour ceux qui souhaitent passer le cap et courrieller depuis Vim et Mutt !

Le multi-compte dans Mutt : le foutoir presque assuré

Et oui, lorsque c'est fait à La Rache, on s'arrache vite les cheveux, c'est le moment de le dire. Le muttrc devient vite illisible et on se perd dans les folder-hooks, les réinitialisations de config, le mélange entre les mailboxes… J'en perdais mon latin, même si cela fonctionnait.

J'ai donc cherché un moyen de faire fonctionner Mutt avec deux fichiers de configuration différents. Comme je suis sous i3 et que j'aime le tiling, avoir deux instances de Mutt côte à côte, une par compte mail, c'est l'idéal. J'ai alors trouvé le « graal » en tombant sur cet article  qui explique comment, avec une variable, des alias et screen, faire cohabiter facilement deux profils bien distincts. Bon, je n'utilise pas screen mais le concept me plaisait bien et j'ai donc bossé dans ce sens : un script va me lancer les deux instances de Mutt, avec des fichiers de config distincts et idéalement facilement modifiables. On est parti ? Go.

Si vous souhaitez voir cela en concrêt, je vous propose de télécharger l'archive qui comprend tous les fichiers nécessaires et qui vous permettra, sans grosse modification, de vous connecter en IMAP à un compte Gmail et un compte GoogleApps. Cette archive contient un dossier bin/ avec 3 scripts et un dossier .mutt/ avec les fichiers de configuration. Placez bin/ et .mutt/ dans votre répertoire personnel, en n'oubliant pas de faire une sauvegarde de votre .mutt originel si vous en avez un.

Détail de la configuration

Je vais vous expliquer le fonctionnement de ma configuration, basée sur quelques variables et le découpage du muttrc originel pour gagner en confort de lecture et en facilité d'adaptation selon les comptes. Vous pourrez facilement ajouter des nouveaux comptes, sans pour autant modifier beaucoup de fichiers.

L'étape de lancement et la déclaration des variables

Nous allons commencer par créer les lanceurs pour les instances de mutt. Ce sont les fichiers bin/{gmail.sh,googleapps.sh}  que nous allons détailler ici :

#!/bin/sh
LOCAL_CONFIG=gmail \
USER=login-avant-@ \
PASS=******* \
DOMAIN=gmail.com \
GPG_KEY=********* \
/usr/bin/mutt

C'est le fichier de base, qui définit les identifiants et autres données mises en variables pour ne pas se les coltiner dans les autres fichiers de config. Idéalement donc, vous penserez à mettre des permissions un peu strictes si vous partagez votre ordinateur (700 me semble bien mais vous pouvez le chiffrer). Le LOCAL_CONFIG est ce qui va permettre de différencier le muttrc et sera repris pour les sous parties de la configuration (signatures, thèmes de couleurs). Le reste semble assez clair. Le fichier bin/googleapps.sh est sensiblement identique, excepté un changement dans la définition de l'$USER et l'ajout d'un champ personnalisé.

#!/bin/sh
LOCAL_CONFIG=googleapps \
USER=email@complet \
PASS=********* \
DOMAIN=gmail.com \
ORGANIZATION="La Rache" \
GPG_KEY=********** \
/usr/bin/mutt

Le dernier fichier, bin/m est celui qui permet de lancer d'une commande les deux instances. Pour faire au mieux, je vous conseille de déclare votre $HOME/bin dans votre $PATH. Par exemple dans votre .zshrc, ce qui permettra de l'appeler via dmenu :

PATH=$PATH:"/home/mike/bin"

Voici donc le contenu du fichier de lancement. Modifiez roxterm par le terminal de votre choix. Le titre est optionnel mais bien pratique.

#!/bin/sh
roxterm --title=GoogleApp -e "$HOME/bin/googleapps.sh" & roxterm --title=Gmail -e "$HOME/bin/gmail.sh"

Pour finir avec ces 3 fichiers : ils doivent être executables.

Le fichier de configuration commun : muttrc

J'ai regroupé dans ce fichier toute la configuration globale, celle qui va bien pour les différents comptes. Vous noterez qu'il n'y a aucune donnée à modifier pour qu'il soit opérationnel. J'ai essayé de commenter et de trier suivant les catégories. Par contre : je suis en BÉPO ! Les accès claviers sont à modifier si vous utilisez une disposition de dinosaure 

# ## GENERAL
set hidden_host=yes
set move=no
set quit=ask-yes
set mark_old=no
set tilde=yes
set delete=yes
set reply_regexp="^((re|aw|sv|ang):[ \t]*)+"
set sig_dashes=yes
set abort_nosubject=yes
set abort_unmodified=yes
set postpone=ask-no
set tmpdir="/tmp/"
set sort=threads
set sort_aux=last-date-received
set editor="vim + -c 'set ft=mail tw=80' -c ':0/^$'"
set metoo=no
set confirmappend=no
# configuration des alias
set alias_file= ~/.mutt/aliases
set sort_alias= alias
set reverse_alias=yes
source $alias_file
# Visualiseur HTML
set implicit_autoview=yes
auto_view text/html application/x-pgp-message
alternative_order text/plain text/enriched text text/html # Show the "text/plain" part *before* the "text/html" part
set mailcap_path="~/.mailcap"
# ## CHARSET
set allow_8bit=yes
set locale = fr_FR.utf8
set charset="utf-8"
set send_charset="utf-8:iso-8859-15:us-ascii"
charset-hook us-ascii UTF-8
charset-hook x-unknown UTF-8
charset-hook windows-1250 CP1250
charset-hook windows-1251 CP1251
charset-hook windows-1252 CP1252
charset-hook windows-1253 CP1253
charset-hook windows-1254 CP1254
charset-hook windows-1255 CP1255
charset-hook windows-1256 CP1256
charset-hook windows-1257 CP1257
charset-hook windows-1258 CP1258
# ## Sons
# Beep when new mail arrives.
set beep_new=yes
# sinon, silence
set beep=no
# simplifie la procédure d'édition
set fast_reply=yes
# ## Set cache
set header_cache=yes
set header_cache="~/.mutt/cache/headers"
set message_cachedir=yes
set message_cachedir="~/.mutt/cache/bodies"
# ## Certificats
set certificate_file=~/.mutt/certificates
# ## Abook 
set query_command="abook --mutt-query '%s'"
macro index,pager A "<pipe-message>abook --add-email-quiet<return>" "Ajouter cet expéditeur dans Abook"
bind editor <Tab> complete-query
# ## VIEW MAIL
set smileys="(>From)|(:[-^]?[][)(><}{|/DP])"
set pager_context=1 # number of lines that overlap on paging
set pager_index_lines=8
set pager_stop=yes
#
# ## REPLY
set edit_headers=yes
set attribution="%n a probablement écrit:" # attribution format : on day, name wrote (alias=%a if you want to add that)
set indent_string="> "
# ## INDEX
set auto_tag=yes
set to_chars=" +-.F"
set date_format="%d/%b-%H:%M"
# Hooks pour régler la largeur des colonnes selon la taille du terminal (source wiki archlinux)
folder-hook .*[sS]ent.* 'set my_col_from = `echo $((35 * ($(tput cols)-35) / 100))`; set my_col_subject = `echo $((65 * ($(tput cols)-35) / 100))`; set index_format="%2C | %Z [%d] %-$my_col_from.${my_col_from}t --> %-$my_col_subject.${my_col_subject}s"'
folder-hook ! .*[sS]ent.* 'set my_col_from = `echo $((35 * ($(tput cols)-35) / 100))`; set my_col_subject = `echo $((65 * ($(tput cols)-35) / 100))`; set index_format="%2C | %Z [%d] %-$my_col_from.${my_col_from}F --> %-$my_col_subject.${my_col_subject}s"'
# ## HEADERS
ignore *
unignore From: Organization: Website: To Cc Reply-To Mail-Followup-To Subject User-Agent X-Mailer Date X-Spam-Level:
hdr_order Date From: Organization: Website: To Cc Reply-To Mail-Followup-To User-Agent X-Mailer X-Spam-Level: Subject
# ## BINDINGS
bind pager <up> previous-line
bind pager <down> next-line
bind index F flag-message
bind pager F flag-message
macro attach W <save-entry><kill-line>/srv/download/mutt/
# ## BÉPO
bind browser,attach t next-entry
bind browser,attach s previous-entry
bind index t next-undeleted
bind index s previous-undeleted
bind generic,index,browser T next-entry
bind generic,index,browser S previous-entry
bind pager t next-line
bind pager s previous-line
bind index,attach j tag-entry
bind index J tag-pattern
bind index ^J untag-pattern
bind index <Esc>j tag-thread
bind pager,index k save-message
bind attach,pager b exit
bind browser b previous-page
macro index b "y"
bind browser r select-entry
bind index r display-message
bind pager r view-attachments
bind attach r view-attach
bind attach k save-entry
bind index,pager,attach , reply
# ## Source pour intégrer les différents profils
source ~/.mutt/muttrc.local.$LOCAL_CONFIG

La ligne importante ici est la dernière : vous notez la présence de la première variable, qui va diriger Mutt vers la suite de la configuration, selon le compte choisi.

Le fichier de compte

Voici l'endroit où tout se sépare. Je vous colle uniquement le fichier concernant le compte Gmail (.mutt/muttrc.local.gmail). Vous pourrez voir l'autre dans l'archive.

# ## RECEIVE
set imap_authenticators=login
set imap_passive=no
set ssl_starttls=yes
set imap_user=$USER@$DOMAIN
set imap_pass=$PASS
set mail_check = 60
set timeout = 300
set imap_keepalive = 900
set folder = imaps://$USER@imap.$DOMAIN:993/
set spoolfile = +INBOX
set postponed = +Drafts
# set record = +Sent
# ## SEND
set smtp_url=smtps://$USER:$PASS@smtp.$DOMAIN
set realname='Mickael Brangeon'
set from=$USER@$DOMAIN
set hostname=$DOMAIN
set signature="~/.mutt/signatures/$LOCAL_CONFIG.txt"
# ## LISTES DE DIFFUSION
subscribe awesome@naquadah.org
subscribe dev@suckless.org
subscribe frugalware-devel@frugalware.org
# ## HOOKS
# FILTRES POUR TRI
save-hook "~C dev@suckless.org" =Listes/suckless
save-hook "~C awesome@naquadah.org" =Listes/awesome
save-hook "~C frugalware-devel@frugalware.org" =Listes/frugal-dev
# GESTION PARTIELLE D'UN COMPTE CHEZ GANDI RELEVÉ SUR LE COMPTE GMAIL
send-hook '~C ^root@wolf\.am$' 'my_hdr From: botchikii <root@wolf.am>'
send-hook '~f ^root@wolf\.am$' 'my_hdr Jabber-ID: botchchikii@wolf.am'
send-hook '~f ^root@wolf\.am$' 'set signature="~/.mutt/signatures/gandi.txt"'
# ## GNUPG
source ~/.mutt/gpg.rc
set pgp_sign_as="$GPG_KEY"
set pgp_autosign=no
set pgp_autoencrypt=no
set pgp_replysign=yes
set pgp_replyencrypt=yes
set pgp_verify_sig=yes
set pgp_timeout=900
set pgp_long_ids=no
# ## COLORSHEME
source ~/.mutt/colors/$LOCAL_CONFIG

Vous noterez que les variables renseignées dans le lanceur sont bien utiles ici ! Par contre, j'ai tenté de mettre le prénom et le nom réel en variable également mais cela n'a pas été pris. Je ne sais pas pourquoi. Bref, vous pourrez modifier ça à la mimine ! Le reste du fichier est assez clair je pense. Réglage du compte, préférences de réception et d'envoi, inscription à des mailing lists et une gestion partielle d'un compte annexe géré par mon gmail. GPG est géré également mais pas en auto (c'est saoulant de signer tous les mails). La dernière ligne vous apprend également que nous ne sommes pas arrivés au bout : il reste le thème de couleurs : si on a deux comptes, autant les différencier non ? En fait, ce sont les mêmes thèmes à la différence de la barre de status : jaune pour l'un, vert pour l'autre. Les signatures sont également définies par un fichier ad-hoc.

Les fichiers annexes

Comme dit dans la partie précédente, vous avez également les signatures dans .mutt/signatures/ suivant le même concept (nom de fichier = $LOCAL_CONFIG.txt, ainsi que les thèmes de couleurs dans .mutt/colors/ . Je n'ai pas renouvelé le concept pour les alias, qui sont communs aux deux comptes (je ne vois pas l'intérêt de les dégrouper) et définis dans .mutt/aliases. Le fichier .mutt/gpg.rc est destiné au réglage du module gpg.

La touche finale

Maintenant que tout est paramétré, il suffit de créer un raccourci clavier dans votre ~/.i3/config :

bindsym XF86Sleep exec $HOME/bin/m

Je n'ai par contre pas réussi à faire comprendre à i3 de lancer les deux terminaux dans un tag spécifique : le titre donné par roxterm n'influence pas l'instance du terminal et il n'y a donc pas moyen de les identifier.

Voici pour la mise à jour de ma configuration de Mutt. Je suis content car tout est plus clair maintenant, plus facile à reprendre en main et peaufiner. Utiliser Mutt est un réel plaisir et j'ai plus de fun qu'avec Claws-mail, qui reste un très bon client de messagerie mais qui est finalement moins « sexy » !

Quelques liens pour terminer :

Bonne lecture de mails à vous ! 

Rédigé par botchikii
28 février 2014 | Libre, Outils | Mots clés : mutt, cli, email, configuration

3 commentaires

#1 vendredi 28 février 2014 @ 22:49 PacMiam a dit :

Depuis le temps que je me dis qu'il faut que je tente mutt, ton article m'a donné envie de m'y mettre ^^

Au sujet de roxterm, tu peux le lancer avec l'argument --role <nom> et ensuite via .i3/config ajouter un :

assign [window_role=<nom>] <workspace>

A chaque fois que tu lanceras la commande : roxterm --role <nom> -e <executable>, il te l’enverras tranquillement dans la workspace correspondant :)

#2 vendredi 28 février 2014 @ 22:51 botchikii a dit :

Ah excellent ça, je l'ai pas trouvé dans le man :p Merci !

#3 lundi 03 mars 2014 @ 18:45 chdorb a dit :

Ça fait un moment que je veux me mettre à Mutt, mais étant moi aussi en bépo, et ne connaissant que très partiellement Mutt, ça m'a freiné un peu…
Là ça me donne vraiment envie de tester avec ta conf.
Merci !

Écrire un commentaire

 Se rappeler de moi sur ce site

Quelle est la deuxième lettre du mot xczi ? :