Le lecteur de courrier électronique mutt est apprécié en mode texte. À l’origine il ne permettait que de lire des messages reçus en local. Cependant il permet maintenant (et ce n’est pas récent) d’utiliser les protocoles pop ou imap pour lire les messages et de se connecter en smtp sur un serveur distant pour envoyer les messages. Ce billet explique un moyen de le configurer pour l’utiliser efficacement et facilement avec plusieurs fournisseurs de courrier électronique.

Pour comprendre ce billet il est bon d’être familiarisé avec la configuration de mutt, et en particulier les mécanismes de hook. Vous pouvez vous référer au manuel pour avoir la documentation officielle.

Contexte

Dans ce billet nous considérerons que nous cherchons à utiliser le même mutt pour lire depuis plusieurs comptes imap, chaque compte ayant une identité différente, et étant associée à un serveur smtp différent.

Le but est de pouvoir envoyer par défaut un email avec l’identité correspondant à la boite lue, mais de pouvoir changer, y compris via des hooks (par exemple pour envoyer à une mailing list, quelle que soit la boite actuellement visitée).

J’avais mis en place ce type de configuration il y a quelques années, mais ma situation a évoluée et je ne l’utilise plus, il peut donc y a avoir quelques erreurs. Cependant je pense que ce type de configuration peut être utile c’est pourquoi je publie. Si vous trouvez des erreurs, les correctifs sont bienvenus.

Qu’est-ce qu’une identité ?

Une identité est un ensemble d’information utilisées lors de l’envoi d’un message :

  • Le nom

  • L’adresse email

  • le serveur d’envoi avec éventuellement le login et mot de passe associés.

  • la boite éventuelle où laisser une copie du message envoyé.

Exemples utilisés dans ce billet

Dans ce billet je prendrai l’exemple d’une situation avec 2 comptes :

  • Un compte personnel chez son fai

  • Un compte gmail

Bien entendu chaque fournisseur d’email ne permet d’envoyer de message que depuis son propre serveur, et il est donc hors de question d’utiliser un sendmail local pour l’envoi.

Organisation des fichiers

Tout le mécanisme est basé sur des hooks qui chargent des fichiers via la commande source. Il faut donc répartir la configuration sur un ensemble de fichiers qui seront chargés selon les circonstances.

Organisation générale

Hiérarchie des fichiers
.mutt
├── common-send-hooks
├── muttrc
├── profiles
│   ├── fai
│   └── gmail
└── senders
    ├── fai
    └── gmail

J’ai mis toute la configuration dans un répertoire .mutt, non standard mais qui me permet de regrouper mes différents fichiers. Voici une description rapide des fichiers et de leur rôle avant de voir les commandes qu’on met dans chaque fichier.

common-send-hooks

Dans ce fichier je mets, comme le nom l’indique l’ensemble des send-hooks utilisés quelle que soit l’identité d’envoi, par exemple des signatures selon la destination ou des commandes pour changer l’identité d’envoi quand on envoie à une mailing list. Ainsi j’ai (entre autres), pour que mes message à la mailing list mutt-users utilisent mon identité fai

send-hook mutt-users "source ~/.mutt/senders/fai"
muttrc

C’est le fichier principal. Pour que mutt le prenne en compte, mon ~/.muttrc est un lien symbolique sur ce fichier. Voir ci-dessous pour plus de détails.

profiles

Dans ce répertoire j’ai un fichier par compte de lecture, contenant les configurations liées à ce compte. Voir ci-dessous pour plus d’explication

senders

Dans ce répertoire j’ai un fichier par identité d’envoi. Voir ci-dessous pour plus d’explication.

Ceci est un schéma de base, on peut aussi avoir d’autres fichiers qui pourront être chargés au besoin.

Fichier Muttrc

Dans ce fichier, on trouve

  1. La définition des défauts et des réglages communs.

  2. La logique de chargement des fichiers de configuration selon le compte visité.

  3. Des macros de changement d’identité

Réglages et macros communs

Ici je mets les macros communes, les réglages de couleur, les fcc-hook,subscribe, etc. De fait la majeure partie de la configuration est dans cette partie du fichier muttrc

Chargement du profil selon le folder/le compte

J’utilise là

  • des account-hook de la forme

account-hook . 'unset imap_user;unset imap_pass;set ssl_starttls=yes'
account-hook imap://mail.fai "source ~/.mutt/profiles/fai"
account-hook imaps://imap.gmail.com "source ~/.mutt/profiles/gmail"

Le premier est pour éviter une fuite de mot de passe vers le mauvais serveur.

  • les folder-hook correspondant

folder-hook imap://mail.fai/ "source ~/.mutt/profiles/fai"
folder-hook imaps://imap.gmail.com/ "source ~/.mutt/profiles/gmail"

Profiles

Dans les fichiers de profil je mets

  • Les identifiants sur le serveur imap (imap_user et imap_pass), et l’éventuel usage de starttls.

  • Des macros spécifiques, par exemple pour signaler un message comme spam

  • Je fais un source de l’identité d’expéditeur par défaut pour ce compte

  • Je mets en place les send-hook

Voici un exemple :

# -*- conf -*-
##
#
# home profile

set imap_user=user_name
set imap_pass=********
set ssl_starttls=yes

macro index "<Esc>j" "<enter-command> \
set my_resolve=\$resolve my_confirmappend=\$confirmappend \
resolve=no confirmappend=no<enter>\
<clear-flag>N\
<enter-command> set resolve=\$my_resolve &my_resolve<enter>\
<save-message>imap://mail.fai/spam<enter>\
<enter-command> set confirmappend=\$my_confirmappend &my_confirmappend<enter>"

macro pager "<Esc>j" '<save-message>imap://mail.fai/spam<enter><enter>'

macro pager,index "<Esc>h" '<copy-message>imap://mail.fai/nospam<enter><enter>'

source ~/.mutt/senders/fai

unhook send-hook

send-hook . "source ~/.mutt/senders/fai"

source "~/.mutt/common-send-hooks"

Senders

Dans les fichiers de sender, peu de chose :

  • l’adresse d’expéditeur

  • La signature éventuelle

  • les identifiants sur le serveur smtp

Ainsi l’exemple suivant suffit-il

# -*- conf -*-
set from=address@fai signature=~/.signature-courte
set record=^
set smtp_url="smtp://user@mail.fai:587/" smtp_pass="********"

Conclusions

C’est un schéma assez complexe de configuration, mais il fonctionne, même s’il est assez difficile à débugguer.

J’aurais voulu à l’époque pouvoir ajouter plusieurs points :

  • Possibilité de changer l’expéditeur par une macro. Mais cela n’est pas trop compatible avec l’utilisation du send-hook . que j’ai utilisé pour revenir en arrière lorsqu’un envoi à une ML change le sender.

  • Possibilité d’avoir plusieurs identités pour un même fournisseur. Là c’est le manque de courage qui m’a retenu.

  • Faire une configuration plus propre à l’aide de variables de configuration. Cette approche pourrait peut-être aider à gérer le premier point.