Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).


L'icône rouge permet de télécharger chaque page du wiki visitée au format PDF et la grise au format ODT → ODT PDF Export

Mutt + msmtp multi-comptes

  • Objet : Configuration de Mutt et de msmtp pour pouvoir gérer l'envoie de plusieurs comptes depuis Mutt.
  • Niveau requis : avisé

Introduction

Comment paramétrer mutt et msmtp pour pouvoir envoyer des emails provenant deux adresses mails différentes ? C'est la question à laquelle je propose deux solutions. Mais je dois vous avertir, je décris deux méthodes pour y arriver. C'est un peu alambiqué, car il faut que les deux logiciels coopèrent. En plus certaines options portent le même nom dans les deux… Donc soyez attentif !

Des commentaires sont présents dans les fichiers de configurations. Ils sont là à titre d'information et d'explication. Lisez-les.

Msmtp

Commençons par la configuration de msmtp. Je propose l'exemple suivant avec deux comptes hypothétiques. Le fichier de configuration de msmtp doit se trouver dans le HOME de l'utilisateur et s'appelle .msmtprc. Je propose la configuration suivante :

fichier .msmtprc
defaults
# on demande un log des transactions smtp. Le répertoire
# ~/Mail doit exister !
logfile ~/Mail/msmtp.log
tls_trust_file /etc/ssl/certs/ca-certificates.crt
 
# un premier compte, le nom qui suit le mot account est libre
# c'est juste la désignation du compte pour msmtp. On ne mettra,
# toutefois, pas d'espaces dans ce nom !
account compte_nom1
# host définit le relais smtp à utiliser.
host smtp.truc.fr
# from est l'adresse email
from nom1@truc.fr
# ici on demande une authentification
auth on
# le user doit correspondre en principe à la partie avant l'@ 
# de l'adresse mail, mais ce n'est pas toujours le cas.
user nom1
# on utilise tls.
tls on
# le port par défaut quand on utilise tls est 465 dans msmtp.
# ce n'est pas celui qui est tout le temps utilisé. Le port
# 587 est très courant aussi.
port 587
password XXXXXXX
 
# ici on désigne ce premier compte comme étant celui par défaut.
# C'est celui-ci que msmtp utilisera quand aucun compte n'aura pas été 
# demandé en particulier. (cf la suite).
 
account default :compte_nom1
 
# on définit un second compte :
account compte_nom2
host smtp.machin.fr
from  nom2@machin.fr
auth off
# Quand l'athentification est désactivé l'option user est inutilisée.
#user nom2
# le port 25 est le port par défaut quand n'utilise pas tls
port 25

Pour connaître le port utiliser, on peut tester en lançant msmtp comme suit :

msmtp --serverinfo --tls --tls-certcheck=off --host smtp.truc.fr --port 587

Si msmtp ne répond pas arrêter le en appuyant sur ctrl-C. Sinon, cela permet de voir les fonctionnalités acceptées par le serveur mail. Vous pouvez tester les ports 465 et 25 avec ou non le tls.

Les mots de passe doivent être stockés en clair dans le ficher .msmtprc. Normalement msmtp est capable de demander le mot de passe quand nécessaire, mais quand on l'utilise depuis mutt ce n'est pas possible. Il faut pour ce faire utiliser une autre option : passwordeval qui permet de lancer une commande qui va afficher le mot de passe sur la sortie standard. 1)

Mutt

Bon passons à la configuration de mutt. Je ne décris ici que les quelques options qui nous intéressent pour l'envoi des mails avec plusieurs comptes.

Lorsque vous modifiez des options dans le fichier de configuration de mutt (.muttrc), pensez à quitter mutt et à le relancer. Sinon ce sont les anciens réglages qui resteront effectifs.

Solution 1

On va utiliser l'option -a de msmtp qui permet de désigner le compte à utiliser pour l'envoi du mail. C'est le nom du compte désigner par « account compte_nom1 » par exemple. Pour cela dans mutt nous allons utiliser la variable sendmail qui permet de demander à mutt d'utiliser un autre programme que /usr/bin/sendmail Donc voici l'extrait du .muttrc qui nous intéresse.

extrait du .muttrc
set sendmail='/usr/bin/msmtp -a default'
set use_from='yes'
 
# On définit deux variables pour éviter les fautes de frappes.
# correspond au from de .msmtprc de  « account compte_nom1 »
set my_address_one='nom1@truc.fr'
 
# correspond au from de .msmtprc de « account compte_nom2 »
set my_address_two='nom2@machin.fr'
 
set realname='Prénom Nom'
 
# Correspond à  « account  default » dans .msmtprc, dans notre cas
# c'est aussi « account compte_nom1 »
set from=$my_address_one
 
# On déclare les adresses mails qui sont les notres. Ça évite
# de s'envoyer des emails à soi même quand on répond à tous
# aux mails avec plusieurs contacts. Cela permet aussi
# de faire des recherches sur nos propres mails ou l'inverse.
# Je pense qu'on ne peut pas utiliser des variables ici…
alternates ^nom1@truc.fr$ ^nom2@machin.fr$
 
# Pour répondre avec la bonne adresse (utilise alternates)
set reverse_name='yes'
 
# on utilise le send2-hook qui est évalué dès qu'on édite un nouveau mail
# ou que l'on change l'adresse du  dans le menu compose ici
# grâce à ce hook on change la variable sendmail. On peut aussi
# changer plusieurs variables.
send2-hook "~f $my_address_one" "set sendmail='/usr/bin/msmtp -a default'"
send2-hook "~f $my_address_two" "set 'sendmail=/usr/bin/msmtp -a compte_nom2'"
 
# Pour changer l'adresse du from dans le menu compose on crée deux macros,
# de cette façon il suffit de taper « <esc> 1 » pour utiliser la première 
# adresse et « <esc> 2 » pour la seconde.
macro compose <esc>1 "<esc>f^U$realname <$my_address_one>"
macro compose <esc>2 "<esc>f^U$realname <$my_address_two>"

Dans le send2-hook la première chaîne (~f $my_address_one par exemple) est un motif de recherche. Le ~f demande à mutt de faire une correspondance avec le champ from du mail. Le reste est une expression rationnelle, mais on utilisera une chaîne simple.

J'ai lu une doc où ils utilisaient ~e à la place de ~f. Avec ~e la correspondance est cherchée par rapport à l'expéditeur qui peut être différent du from du mail. Les essais que j'ai réalisé avec ~e se sont révélés infructueux, on utilisera donc ~f.

Solution 2

Cette fois-ci on ne va pas modifier la variable sendmail. On va utiliser de nouveau send2-hook pour modifier la variable from de mutt. Cela combiné avec l'utilisation de l'option de mutt, use_envelope_from va permettre d'appeler msmtp avec les paramètres suivant :

    msmtp -f adresse_expéditeur -- adresse_destinataire

Quand il est appelé comme cela, msmtp va utiliser le from qu'on a paramètré pour chaque compte, pour déterminer comment il va envoyer le mail.

Faites attention à ne pas confondre, les différents from. il y en a trois :

  • le from du mail.
  • celui du fichier dans le fichier ~/.msmtprc
  • et enfin celui dans le fichier ~/.muttrc

Les trois sont bien définis dans trois fichier différents. Mutt se sert des variables from et realname definies dans son fichier .muttrc pour remplir automatiquement le champ from du mail lorsqu'on demande de composer un nouveau message (avec la touche M). Si l'on change la valeur de ce champ dans le mail une fois que l'on quitte l'éditeur, mutt n'est pas au courant que l'on a changé cette valeur. Pour lui faire prendre en compte ce changement on va utiliser send2-hook.

Pour que cette méthode fonctionne il faut que le from de mutt corresponde au from du mail et au from du compte à utiliser dans le fichier de configuration de msmtp (.msmtprc). Ce dernier point est très important, attention aux fautes de frappe !

Pour générer la commande :

    msmtp -f adresse_expéditeur -- adresse_destinataire

mutt se sert de sa variable from pour adresse_expéditeur, et non du from du mail.

Voici, l'extrait du .muttrc que je propose :

extrait du .muttrc
set sendmail='/usr/bin/msmtp'
set use_from='yes'
set use_envelope_from='yes'
 
# On définit deux variables pour éviter les fautes de frappes.
# correspond au from de .msmtpcrc de « account compte_nom1 »
set my_address_one='nom1@truc.fr'
 
# correspond au from de .msmtprc de « account compte_nom2 »
set my_address_two='nom2@machin.fr'
 
set realname='Prénom Nom'
# Correspond au « account default » dans .msmtprc, dans notre cas
# c'est aussi  « account compte_nom1 »
set from=$my_address_one
 
# On déclare les adresses mails qui sont les notres. Ça évite
# de s'envoyer des emails à soi même quand on répond à tous
# aux mails avec plusieurs contacts. Cela permet aussi
# de faire des recherches sur nos propres mails ou l'inverse.
# Je pense qu'on ne peut pas utiliser des variables ici…
alternates ^nom1@truc.fr$ ^nom2@machin.fr$
 
# Pour répondre avec la bonne adresse (utilise alternates)
set reverse_name='yes'
 
 
# on utilise le send2-hook qui est évalué dès qu'on édite un nouveau mail
# ou que l'on change l'adresse du from dans le menu compose ici
# grâce à ce hook on change la variable from. On peut aussi
# changer plusieurs variables.
send2-hook "~e $my_address_two" "set from=$my_address_two"
 
# Pour changer l'adresse du from dans le menu compose on crée deux macros,
# de cette façon il suffit de taper « <esc> 1 » pour utiliser la première 
# adresse et « <esc> 2 » pour la seconde.
macro compose <esc>1 "<esc>f^U$realname <$my_address_one>"
macro compose <esc>2 "<esc>f^U$realname <$my_address_two>"

Peu de choses ont changé par rapport à la première solution. La variable sendmail = /usr/bin/msmtp est sans options supplémentaires. L'option use_envelope_from est positionnée à yes , c'est ce qui permet d'appeler msmtp avec la commande msmtp -f expéditeur – destinataire.

Mutt utilise la variable from définit dans .muttrc (ou dans ce cas la valeur que l'on donne dans send2-hook) et non le champ from du mail pour fixer l'expéditeur utiliser dans la commande msmtp.

Et enfin, le send2-hook où l'on utilise ~e et non ~f. Aussi on fixe le from de mutt.

Ne me demander pas pourquoi, mais ici le ~e fonctionne. Remarquez que l'avantage, c'est qu'on est pas obligé d'avoir deux send2-hook. Dans cette configuration, la variable from reprend sa valeur d'origine « toute seule ». C'est un mystère supplémentaire car il est dit dans la documentation que lorsqu'on change une valeur avec un hook sa valeur reste celle attribuée dans le hook. C'est pour cela que quand on utilise les hook il faut en principe utiliser un hook par défaut qui rétablit la ou les valeurs par défaut. Ça fait deux mystères !

C'est la méthode que je préfère, elle est plus légère.

Conclusion

Bref, ces déboires avec le ~e et ~f sont peut-être un bug. Je ne sais pas, je n'ai pas encore tout compris à ce sujet. Pour info j'utilise NeoMutt version 1.8.3 (du 09-06-2017). NeoMutt est un Mutt amélioré avec notamment la possibilité d'avoir une barre latéralle pour naviguer entre les différentes BALs. Peut-être que ces réglages sont spécifiques à la version de mutt que j'utilise.

Petites bidouilles pour débugger

Je propose maintenant un petit truc qui permet de voir comment msmtp est appelé. Pour cela nous allons faire un petit script en shell que j'appelle mysendmail :

#! /bin/sh
if ! [ -d ~/tmp ]; then
    mkdir -m 0700 tmp
fi
echo $@ >~/tmp/params.txt
cat >~/tmp/message.txt 

Ce shell script peut être placé dans le HOME. Voici ce qu'on y fait :

  • On crée un répertoire ~/tmp s'il n'existait pas.
  • On sauvegarde les paramètres passés dans le fichier ~/tmp/params.txt
  • On sauvegarde le mail dans ~/tmp/message.txt

Et c'est tout. Autant dire tout de suite qu'avec ce script, vous n'enverrez aucun mail !

Ensuite, pour l'utiliser avec mutt on va rendre ce script exécutable :

chmod u+x ~/mysendmail 

Puis on remplace toute les occurrences de sendmail='/usr/bin/msmtp' par sendmail='~/mysendmail dans le fichier .muttrc.

À partir de là, chaque que vous enverrez un mail dans mutt, c'est le script mysendmail qui sera appelé. Vous pourrez voir ainsi les paramètres passés au script ainsi que la façon dont mutt a formé le mail. Vous pourrez alors expérimenté ce que ça fait de changé l'option use_envelope_from. C'est sympa de le voir par soi-même.

N'oubliez pas de rétablir l'option sendmail après vos expériences. Sinon, plus aucuns mails ne seront envoyé, et vous vous demanderez pourquoi personne ne vous répond :-D

Une autre chose que vous pouvez tester, c'est la valeur, de la variable sendmail dans mutt lorsque vous utiliser la Solution 1. Dans mutt pour connaître la valeur d'une variable, il suffit de taper : pour passer en mode commande. Là une ligne apparaît en bas de l'écran, puis vous tapez :

set ?sendmail

La commande set permet non seulement de fixer la valeur d'une variable mais aussi de connaître la valeur de cette variable. Pour obtenir la valeur d'une variable il suffit de précéder le nom de la variable par un point d'interrogation.

De cette façon vous pourrez vérifier la valeur des variables sendmail et from (pour la Solution 2) facilement.

1) Voir ici pour savoir comment faire.
utilisateurs/enicar/tutos/mutt-msmtp-multi-comptes.txt · Dernière modification: 23/08/2017 17:12 par enicar

Pied de page des forums

Propulsé par FluxBB