Dominique Meeùs
Dernière modification le   
retour à la table des matières — à l’index — à ma page de départ

Mutt, client de courrier

Mutt est un client de courrier, qui permet de lire le courrier d’un compte POP ou IMAP. Il permet aussi de composer du courrier à envoyer et, dans la philosophie de Linux, il en confie l’envoi aux programmes classiques comme Postfix ou Sendmail. Cependant, sous la pression des utilisateurs, on y a ajouté la possibilité de se connecter directement à un SMTP tiers. On peut donc l’utiliser pour composer et envoyer le message. Cela m’intéressait particulièrement de le faire en ligne de commande. (Sinon, j’utilise bien sûr Thunderbird.)

Début 2016 en Ubuntu, le paquet mutt comporte toujours postfix en dépendance, mais on ne doit pas configurer Postfix qui ne servira pas. On peut renseigner le SMTP directement dans ~/.muttrc (ou dans ~/.mutt/muttrc) par set smtp_url = "smtp://smtp.myprovider.com:25/". (C’est possible aussi avec authentification, voir les nombreuses discussions sur la manière dont certains utilisent Mutt avec Gmail. Pour une documentation complète, voir The Mutt E-Mail Client par Michael Elkins.)

Mutt est un programme interactif, mais il est possible aussi d’envoyer un message en ligne de commande : mutt -s "sujet du message" someone@provider.com < contenu. C’est différent de msmtp en ce qu’il fallait alors donner un message complet avec headers. Ici il faut donner seulement le contenu. En outre, on peut donner des attachements :

mutt -s "sujet du message" -a attachedfile -- someone@provider.com < contenu

mais après un nom de fichier attaché, il faut impérativement séparer l’adresse du destinataire par --.

On ne peut pas remplacer l’adresse someone@provider.com par "Someone Lastname <someone@provider.com>" dans les commandes ci-dessus. Cependant on peut remplacer l’adresse par une commande mailto et la commande mailto accepte un long nom complet comme mailto:Someone Lastname <someone@provider.com>. Ce qui est donc permis et qui permet de passer le nom complet en ligne de commande, c’est

mutt -s "sujet du message" -a attachedfile -- mailto:Someone%20Lastname%20%3Csomeone@provider.com%3E < contenu

où il faut dans le mailto: encoder les espaces (%20) et les < > (%3C et %3E) et rien d’autre : pas le @ ni les éventuels caractères accentués du nom long (dans un système en UTF-8).

Si on groupe de telles commandes mailto dans un fichier, une personne par ligne, on peut envoyer le message à toutes les personnes de la liste, une par une, avec le script :

#!/bin/bash
while read line
do
  mutt $line -s "sujet du message" -a attachedfile < contenu
done < listemailto
#

et c’est ce que je rêvais de faire avec msmtp. Tant qu’à faire, on peut aussi personnaliser l’envoi des messages, leur sujet et quels fichiers on attache, si on donne les indications voulues dans un fichier CSV, disons listemailto.csv, sur le modèle :

First,Last,first.last@provider.com,sujet du message,contenu First,image First.png,doc First.pdf

(attention : sans délimiteurs de texte " " ou autres !) avec le script :

#!/bin/bash
IFS=","
# to read CSV, define separator other than default whitespace
while read -r first last address subject message annex1 annex2
do
  mutt -s $subject -a "$annex1" "$annex2" -- "mailto:${first}%20${last}%20%3C${address}%3E" < "$message"
done < listemailto.csv
IFS=
#

Comme sujet, Mutt prend tout le texte qui suit -s. Il est donc inutile de délimiter ce texte. Il est permis de répéter -a à chaque annexe, mais ce n’est pas nécessaire. Le paramètre -a prend ce qui suit comme liste de noms de fichiers à attacher. Il faut donc dans le script délimiter les variables de nom de fichier annexe pour le cas où ces noms contiendraient des espaces (délimiter dans le fichier CSV ne marche pas). Délimiter pour la même raison la variable du message. Pour que l’adresse n’apparaisse pas comme un nom de fichier de plus dans la liste qui suit -a, il faut la faire précéder de -- et il faut impérativement une espace entre -- et l’adresse.

Bien sûr ce script personnalise seulement l’envoi, pas les contenus. Il faut avoir préparé par d’autres moyens les contenus personnalisés de message et avoir sous la main les fichiers attachés destinés à chacun. On pourrait envoyer plus ou moins de fichiers attachés, mais le même nombre pour chaque personne, correspondant au nombre de champs de fichiers attachés dans le CSV et de variables de fichiers attachés dans le script. Pour les préparer les messages personnalisés, on peut utiliser la fonctionnalité de publipostage de LibreOffice Writer. On crée la lettre modèle en format ODF (*.odt). Cependant, au moment d’enregistrer le résultat personnalisé (comme documents séparés !), on demande le format Texte. Si le nom choisi est « lettre », on aura des fichiers lettre_0.txt, lettre_1… à renseigner dans le CSV de l’envoi par Mutt. Le même CSV peut d’ailleurs servir à créer les lettres personnalisées, mais il faut veiller à faire correspondre à chacun des champs du CSV une variable (éventuellement non utilisée) dans le script ci-dessus. On peut cependant grouper à la fin les champs qui servent à LibreOffice et pas à Mutt. En effet la dernière variable de read contient toute le reste de la ligne du CSV ; on peut donc en faire une variable « dépotoir » de tous les champs qui n’intéressent pas le script.

Si on veut envoyer du Content-Type: multipart/alternative, il faut d’une part écrire soi-même le contenu multipart avec les séparations par boundary et ajouter le header qui dit multipart/alternative par l’option -e "my_hdr Content-Type: multipart/alternative". L’avantage par rapport à msmtp est alors réduit à la facilité d’ajouter un fichier attaché sans devoir soi-même l’intégrer (éventuellement codé) dans le contenu.

Dominique Meeùs . Date: 2011… 2016