msmtp
msmtp est un client SMTP.( doc msmtp 1.8.7)
Sending emails via SMTP on Ubuntu or Debian Servers
Dans son mode de fonctionnement par défaut, il lit un courrier à partir d’une entrée standard et l’envoie à un serveur SMTP prédéfini qui s’occupe de sa bonne distribution. Les options de la ligne de commande et les codes de sortie sont compatibles avec sendmail.
Installer
Installez le package msmtp et msmtp-mta , ce qui crée un alias sendmail pour msmtp.
sudo apt install msmtp msmtp-mta
Version
msmtp --version
msmtp version 1.8.3
Plateforme : x86_64-pc-linux-gnu
Librairie TLS/SSL : GnuTLS
Librairie d'authentification : GNU SASL
Méthodes d'authentification supportées :
plain scram-sha-1 external gssapi cram-md5 digest-md5 login ntlm
Support IDN : activé
NLS: activé, LOCALEDIR : /usr/share/locale
Support de porte-clés: aucun(e)
Nom du fichier de configuration système : /etc/msmtprc
Nom du fichier de configuration utilisateur : /home/user/.msmtprc
Copyright (C) 2019 Martin Lambers and others.
This is free software. You may redistribute copies of it under the terms of
the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.
There is NO WARRANTY, to the extent permitted by law.
Configuration de base
Depuis la version 1.8.6 de msmtp, vous pouvez placer votre configuration utilisateur dans ~/.msmtprc ou $XDG_CONFIG_HOME/msmtp/config . Voici un exemple de configuration msmtp (le fichier est basé sur l’exemple de fichier par utilisateur situé dans /usr/share/doc/msmtp/msmtprc-user.example ; le fichier de configuration système appartient à /etc/msmtprc et ses le fichier d’exemple correspondant se trouve dans /usr/share/doc/msmtp/msmtprc-system.example).
Ouverture du fichier ~/.msmtprc (dans votre dossier personnel).
Ne pas utiliser de commande sudo. C’est bien l’utilisateur qui envoie les mails.
nano ~/.msmtprc
# Exemple pour un fichier de configuration utilisateur ~/.msmtprc
#
# Ce dossier porte sur le TLS et l'authentification. Les fonctionnalités non utilisées ici sont les suivantes
# journalisation, délais, proxy SOCKS, paramètres TLS, notification de l'état de livraison
# (DSN), et plus encore.
# Définissez les valeurs par défaut pour tous les comptes suivants.
defaults
# Utilisez le port de soumission du courrier 587 au lieu du port SMTP 25.
port 587
# Utilisez toujours le TLS.
tls on
# Établir une liste d'AC de confiance pour le TLS. La valeur par défaut est d'utiliser les paramètres du système, mais
# vous pouvez sélectionner votre propre dossier.
#tls_trust_file /etc/ssl/certs/ca-certificates.crt
# Si vous sélectionnez votre propre fichier, vous devez également utiliser la commande tls_crl_file pour
# vérifier les certificats révoqués, mais malheureusement obtenir les listes de révocation et
# Il n'est pas simple de les tenir à jour.
#tls_crl_file ~/.tls-crls
# Un service de courrier électronique gratuit
account freemail
# Nom d'hôte du serveur SMTP
host smtp.freemail.example
# Comme alternative au tls_trust_file/tls_crl_file, vous pouvez utiliser tls_fingerprint
# pour épingler un seul certificat. Vous devez mettre à jour l'empreinte digitale lorsque le
# le certificat du serveur change, mais un attaquant ne peut pas vous piéger pour que vous acceptiez
# un certificat frauduleux. Obtenez l'empreinte digitale avec
# msmtp --serverinfo --tls --tls-certcheck=off --host=smtp.freemail.example
#tls_fingerprint 00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD:EE:FF:00:11:22:33
# Enveloppe - à partir de l'adresse
from joe_smith@freemail.example
# Authentification. Le mot de passe est donné en utilisant l'une des cinq méthodes, voir ci-dessous.
auth on
user joe.smith
# Méthode de mot de passe 1 : Ajoutez le mot de passe au porte-clés du système (system keyring), et laissez msmtp l'obtenir
# automatiquement. Pour définir le mot de passe du porte-clés en utilisant le libsecret de Gnome :
# $ secret-tool store --label=msmtp \
# host smtp.freemail.example \
# service smtp \
# utilisateur joe.smith
# Méthode de mot de passe 2 : stocker le mot de passe dans un fichier crypté, et indiquer à msmtp
# la commande à utiliser pour le décrypter. Cette commande est généralement utilisée avec GnuPG, comme dans
# cet exemple. Habituellement, gpg-agent demande une fois le mot de passe de décryptage.
passwordeval gpg2 --no-tty -q -d ~/.msmtp-password.gpg
# Méthode de mot de passe 3 : Enregistrez le mot de passe directement dans ce fichier. En général, il n'est pas
# une bonne idée de stocker les mots de passe dans des fichiers en texte clair. Si vous le faites quand même, à
# Assurez-vous au moins que ce fichier ne peut être lu que par vous-même.
#password secret123
# Méthode de mot de passe 4 : enregistrez le mot de passe dans ~/.netrc.
# Cette méthode n'est probablement pas plus pertinente.
# Méthode de mot de passe 5 : ne pas spécifier de mot de passe. Msmtp vous le demandera
# Cela signifie que vous devez être en mesure de taper dans un terminal lorsque le msmtp fonctionne.
# Une deuxième adresse de courrier au même service de courrier électronique gratuit
account freemail2 : freemail
from joey@freemail.example
# Le serveur SMTP de votre FAI
account fai
host mail.fai.example
from smithjoe@fai.example
auth on
user 12345
# Définir un compte par défaut
account default : freemail
Le fichier de configuration utilisateur doit être explicitement lisible / inscriptible par son propriétaire ou msmtp échouera
chmod 600 ~/.msmtprc
Pour éviter d’enregistrer le mot de passe en texte brut dans le fichier de configuration, utilisez passwordeval pour lancer un programme externe, ou consultez la section “Gestions des mots de passe”.
Cet exemple utilisant Gnu PG est couramment utilisé pour effectuer le déchiffrement d’un mot de passe:
echo -e "password\n" | gpg --encrypt -o .msmtp-gmail.gpg # enter id (email...)
Avertissement: la plupart des shells enregistrent l’historique des commandes (par exemple .bash_history .zhistory). Pour éviter cela, utilisez gpg avec le shell stdin:
gpg --encrypt -o .msmtp-gmail.gpg -r <email> - # email ou ID de la clé qui va chiffrer
Le tiret de fin n’est pas une faute de frappe, il oblige plutôt gpg à utiliser stdin. Après avoir exécuté cet extrait de code, saisissez votre mot de passe, appuyez sur entrée et appuyez sur Ctrl-d pour que gpg puisse crypter votre mot de passe.
Pour utiliser la gestion du mot de passe par gpg dans msmtp , modifier ~/.msmtprc
passwordeval "gpg --quiet --for-your-eyes-only --no-tty --decrypt ~/.msmtp-gmail.gpg"
passwordeval gpg --no-tty -q -d ~/.msmtp-password.gpg
Utilisation de la commande mail
Afin de pouvoir utiliser la commande mail
nous devons installer mailx
sudo apt install bsd-mailx
Configurer l’agent de transport du courrier pour utiliser msmtp
sudo nano /etc/mail.rc
ajouter ce qui suit :
set mta=/usr/bin/msmtp
Test de fonctionnement
L’option de compte ( --account=,-a
) indique quel compte utiliser comme expéditeur:
echo "hello there username." | msmtp -a default username@domain.com
Ou, avec les adresses dans un fichier:
To: username@domain.com
From: username@gmail.com
Subject: A test
Hello there.
cat test.mail | msmtp -a default <username>@domain.com
- Conseils
- si vous utilisez Gmail, vous devrez :
- Si vous utilisez l’authentification à deux facteurs: créez un mot de passe d’application
- Sinon: autorisez les applications moins sécurisées. (non recommandé)
- Vous pouvez utiliser
--read-envelope-from
au lieu de-a default
pour choisir automatiquement le compte par le champFrom:
dans le message que vous allez envoyer.
- si vous utilisez Gmail, vous devrez :
Avec la commande mail
echo "Test envoi message en ligne de commande avec mail" | mail -s "mail via msmtp" usr@desti.fr
Utilisation
- Pour envoyer le contenu d’un fichier texte comme message:
cat readme.txt | msmtp desti@inconnu.space
- Pour envoyer un fichier binaire, ou compressé en pièce jointe :
uuencode application.zip | msmtp desti@inconnu.space
Pour préciser le sujet du mail, il faut utiliser Subject: DeQuoiOnParle en tête de message.
Donc si on envoie un fichier readme.txt, à moins qu’il commence par Subject:… le message n’aura pas de sujet
Attention: il faut alors un saut de ligne, une solution simple est d’utiliser printf plutôt que echo.
Exemple:
printf "Subject:DeQuoiOnParle\nLeCorpsDuMessage" | msmtp desti@inconnu.space
Ne pas oublier les tags ci dessous en début de votre message électronique sans quoi il ne sera pas forcement accepté par gmail ou autre (non respect de la RFC2822)
From: mon-adresse@domaine.xx
To: adresse-destination@domaine.xx
subject: le sujet de l'Email
le corps du texte commence à cette ligne
- Depuis votre client de messagerie, vérifiez que vous avez bien reçu le message attendu
Configurations particulières
gmail impose l’utilisation d’une couche TLS (messagerie yunohost également):
~/.msmtprc
account default
tls on
host smtp.gmail.com
port 587
from nom_user@gmail.com
auth on
user nom_user # ou nom_user@gmail.com
password password_user
tls_starttls on
tls_certcheck on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
La dernière ligne est spécifique aux systèmes basés sur debian. Elle pointe vers le fichier où sont stockés l’ensemble des certificats racine de conficance du système
Orange sécurisé L’opérateur historique Orange fonctionne avec TLS :
/.msmtprc
account default
host smtp.orange.fr
protocol smtp
auth login
tls on
tls_starttls off
tls_certcheck on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
from mon-adresse@orange.fr
maildomain orange.fr
port 465
user mon-adresse
password mon-motdepasse
gandi.net Paramétrage pour l’utilisation de l’adresse fournie avec les noms de domaines achetés avec gandi.net
~/.msmtprc
account default
host mail.gandi.net
from <adresse de l'émetteur>
tls on
tls_certcheck off
tls_starttls off
auth on
user <adresse Gandi/nom d'utilisateur utilisé pour se connecter à la boîte aux lettres électronique Gandi>
password <mot de passe boîte aux lettres électronique>
Correctif pour la commande mail
Pour que la commande mail fonctionne, vous devrez mettre ce qui suit dans /etc/mail.rc
Veuillez noter que pour avoir l’utilitaire mail, vous devrez installer le paquet mailutils.
Fichier : /etc/mail.rc
set sendmail="/usr/bin/msmtp -t"
Vous pouvez tester que le courrier fonctionne avec la commande suivante :
echo "Ceci est un corps de message" | mail -s "Hello there from mail command line" desti@destinataire.tld
Correctif crontab
Lorsque crontab n’exécute pas une commande, il envoie un message électronique. Pour effectuer l’opération, il utilise l’exécutable sendmail. En ayant installé le paquet msmtp-mta il est créé un lien /usr/sbin/sendmail vers /usr/bin/msmtp.
De cette façon, crontab n’a pas besoin de configuration supplémentaire.
Le problème ici est que crontab envoie toujours un message à un utilisateur local. Si je me connecte en tant qu’utilisateur admin et que je crée une tâche crontab pour cet utilisateur, l’email sera envoyé à admin sur localhost. On peut corriger ce problème à l’aide des approches suivantes. Le fichier /etc/aliases définit les alias de courriel pour l’utilisateur. Par exemple :
# File: /etc/aliases
root: admin@myserver.com, supervisor@myserver.com
default: catch-all@myserver.com
Compte tenu de cette configuration, tous les courriels qui vont à root@localhost seront également envoyés à admin@myserver.com et supervisor@myserver.com. De plus, tous les messages destinés à des utilisateurs inconnus (inexistants) seront envoyés à catch-all@myserver.com.
MAILTO
Crontab offre une façon plus élégante d’envoyer des courriels. Au début du fichier crontab, vous pouvez l’éditer avec crontab -e
, déclarer la variable MAILTO :
MAILTO="xand@xand.es"
* * * * * /tmp/aaa.sh
Outils de messagerie
Installer les outils de messagerie
apt-get install mailutils
On test un envoie de mail
echo "Un mail de test" | mail -s "test envoi" destinataire@domaine.tld
Cette commande va envoyer un mail avec comme émetteur le nom FQDN (Full Qualified Domain Name) de la machine.
Vous pouvez envoyer un mail en modifiant ce nom c’est comme ça
echo "This is the main body of the mail" | mail -s "test mail" destinataire@domaine.tld -aFrom:autreNom\<autrenom@autrenom.fr\>
Bien sur, si vous passez par un relais, ce dernier vérifiera que le nom que vous tentez d’utiliser vous appartient bien en effectuant une recherche DNS inversée sur l’IP publique effectuant la requête.
Vous pouvez vérifier que le mail est bien partie dans les logs
tail /var/log/mail.log
Il se peut que votre mail atterrisse dans votre boite de spam.
C’est le cas des serveur GMAIL qui vérifie l’entré SPF. Le SPF (Sender Policy Framework) permet au serveur de réception mail de s’assurer que l’email a bien été envoyé par un serveur qui en a le droit.
Il faut déclarer le serveur de mail dans votre DNS à l’aide d’une entrée SPF.
Un petit exemple chez OVH
domaine.com IN TXT "v=spf1 include:mx.ovh.com ~all"
Gestion des mots de passe
Les mots de passe pour msmtp peuvent être stockés dans du texte en clair, des fichiers cryptés ou un trousseau de clés.
Porte-clés GNOME
Le stockage des mots de passe dans GNOME Keyring est pris en charge nativement dans msmtp. Configurez le trousseau comme décrit sur la page wiki liée et installez libsecret . Ensuite, stockez un mot de passe en exécutant:
secret-tool store --label=msmtp host smtp.your.domain service smtp user yourusername
C’est tout, maintenant msmtp devrait trouver le mot de passe automatiquement.
GnuPG
La directive de password
peut être omise. Dans ce cas, si le compte en question a une valeur d’authentification auth
autre que off
, l’invocation de msmtp à partir d’un shell interactif demandera le mot de passe avant d’envoyer du courrier. msmtp ne demandera pas s’il a été appelé par un autre type d’application, tel que Mutt . Dans de tels cas, le paramètre --passwordeval
peut être utilisé pour appeler un outil de trousseau de clés externe comme GnuPG .
Pour ce faire, configurez GnuPG , y compris gpg-agent pour éviter d’avoir à saisir le mot de passe à chaque fois. Ensuite, créez un fichier de mot de passe chiffré pour msmtp, comme suit. Créez un répertoire sécurisé avec 700 autorisations situé sur un tmpfs pour éviter d’écrire le mot de passe non chiffré sur le disque. Dans ce répertoire, créez un fichier texte brut avec le mot de passe du compte de messagerie. Ensuite, chiffrez le fichier avec votre clé privée:
gpg --default-recipient-self -e /path/to/plain/password
Supprimez le fichier en texte brut et déplacez le fichier crypté vers l’emplacement final, par exemple ~/.mail/.msmtp-credentials.gpg .
Dans ~/.msmtprc ajoutez:
passwordeval "gpg --quiet --for-your-eyes-only --no-tty --decrypt ~/.mail/.msmtp-credentials.gpg"
Normalement, cela suffit pour qu’une invite de mot de passe GUI apparaisse lors de l’envoi, par exemple, d’un message de Mutt . Si l’invite gpg pour la phrase secrète ne peut pas être émise, démarrez l’ agent gpg avant. Un simple hack pour démarrer l’agent consiste à exécuter une commande externe dans votre muttrc en utilisant la syntaxe backtick `command ` . Par exemple, vous pouvez mettre quelque chose comme ce qui suit dans votre fichier muttrc
set my_msmtp_pass=`gpg -d mypwfile.gpg`
Mutt l’exécutera au démarrage, gpg-agentt mettra en cache votre mot de passe, msmtp sera content et vous pourrez envoyer des mails.
Remarque: Si vous faites cela, vous devrez redémarrer mutt après que gpg-agent ait effacé le mot de passe pour recommencer à envoyer des e-mails
Une alternative consiste à placer les mots de passe dans ~/.netrc , un fichier qui peut agir comme un pool commun pour msmtp, OfflineIMAP et les outils associés.
Divers
Utilisation de msmtp hors ligne
Bien que msmtp soit génial, il nécessite que vous soyez en ligne pour l’utiliser. Ce n’est pas idéal pour les personnes utilisant des ordinateurs portables avec des connexions intermittentes à Internet ou des utilisateurs d’accès à distance. Plusieurs scripts ont été écrits pour remédier à ce fait, collectivement appelés msmtpqueue.
Les scripts sont installés sous /usr/share/doc/msmtp/msmtpqueue . Vous voudrez peut-être copier les scripts dans un emplacement pratique sur votre ordinateur ( /usr/local/bin est un bon choix).
Enfin, modifiez votre MUA pour utiliser msmtp-enqueue.sh au lieu de msmtp lors de l’envoi de courrier électronique. Par défaut, les messages en file d’attente seront stockés dans ~/.msmtpqueue
Pour modifier cet emplacement, modifiez la ligne QUEUEDIR=$HOME/.msmtpqueue
dans les scripts (ou supprimez la ligne et exportez la variable QUEUEDIR
dans .bash_profile
comme : export QUEUEDIR="$XDG_DATA_HOME/msmtpqueue"
Lorsque vous souhaitez envoyer un courrier que vous avez créé et mis en file d’attente, exécutez:
/usr/local/bin/msmtp-runqueue.sh
L’ajout de /usr/local/bin à votre CHEMIN peut vous faire économiser quelques touches si vous le faites manuellement. Le fichier README fourni avec les scripts contient des informations pratiques, il est recommandé de les lire.
Envoyer du courrier avec PHP en utilisant msmtp
Recherchez l’option sendmail_path
dans votre php.ini et modifiez comme ceci:
sendmail_path = "/usr/bin/msmtp -C /path/to/your/config -t"
Notez que vous ne pouvez pas utiliser un fichier de configuration utilisateur (c’est-à-dire: un sous ~ /) si vous prévoyez d’utiliser msmtp comme remplacement de sendmail avec php ou quelque chose de similaire. Dans ce cas, créez simplement /etc/msmtprc et supprimez votre configuration utilisateur (ou pas si vous prévoyez de l’utiliser pour autre chose). Assurez-vous également qu’il est lisible par tout ce que vous utilisez (php, django, etc …)
Dans le manuel msmtp: les comptes définis dans le fichier de configuration utilisateur remplacent les comptes du fichier de configuration système. Le fichier de configuration utilisateur ne doit pas avoir plus d’autorisations que l’utilisateur en lecture / écriture
Il est donc impossible d'avoir un fichier conf sous ~/ et qu'il soit toujours lisible par l'utilisateur php.
Pour le tester, placez ce fichier sur votre serveur compatible php ou en utilisant php-cli.
<?php
mail("your@email.com", "Test email from PHP", "msmtp as sendmail for PHP");
?>
Utilisation de l’authentification XOAUTH2 pour Gmail (Archlinux)
msmtp ne prend actuellement pas en charge l’authentification OAUTH2. Pour utiliser l’authentification XOAUTH2 avec Gmail (voir les informations officielles ), vous pouvez installer le package msmtp-oauth2. Le package archlinux a effectué un petit piratage afin que la méthode d’authentification simple envoie le AUTH XOAUTH2 password au lieu de AUTH PLAIN … , désactivant efficacement l’authentification ordinaire et activant XOAUTH2. Un exemple de configuration est le suivant:
account gmail
host smtp.gmail.com
port 587
from your@gmail_login_email
tls on
tls_starttls on
tls_certcheck off
auth plain
user any_thing_here
passwordeval "get-gmail-token"
logfile ~/.msmtp.log
Le script get-gmail-token peut être trouvé à partir des fichiers source du package AUR. Voir plus d’informations sur le lien getmail sur la façon dont cela fonctionne. Consultez également le démarrage rapide de l’API Gmail pour savoir comment enregistrer une application Gmail et l’autoriser à accéder aux e-mails.
Dépannage
Problèmes avec TLS
Si vous voyez le message suivant:
msmtp: TLS certificate verification failed: the certificate hasn't got a known issuer
cela signifie probablement que votre tls_trust_file n’est pas correct.
Suivez simplement le bon manue. Il vous explique comment trouver l’émetteur du certificat de serveur d’un serveur smtp donné. Ensuite, vous pouvez explorer le /usr/share/ca-certificates/ pour savoir si, par hasard, le certificat dont vous avez besoin est là. Sinon, vous devrez obtenir le certificat par vous-même. Si vous utilisez votre propre certificat, vous pouvez lui faire confiance en ajoutant msmtp à votre ~/.msmtprc :
tls_fingerprint <SHA1 (recommended) or MD5 fingerprint of the certificate>
Si vous essayez d’envoyer du courrier via GMail et recevez cette erreur, consultez ce fil ou utilisez simplement le deuxième exemple GMail ci-dessus.
Si vous êtes complètement désespéré, mais que vous êtes sûr à 100% que vous communiquez avec le bon serveur, vous pouvez toujours désactiver temporairement la vérification du certificat:
msmtp --tls-certcheck off
Le serveur a envoyé une réponse vide
Si vous obtenez une erreur “server sent empty reply”, cela signifie probablement que le serveur de messagerie ne prend pas en charge STARTTLS sur le port 587, mais nécessite TLS sur le port 465.
Pour permettre à msmtp d’utiliser TLS sur le port 465, ajoutez la ligne suivante à ~/.msmtprc :
tls_starttls off
Liens
Envoi d’e-mails avec msmtp et msmtpq
msmtp : installation rapide
Exemple avec serveur smtp yanfi.space
Installer msmtp et les outils
sudo apt install msmtp-mta mailutils
Le fichier de configuration ~/.msmtprc
account default
tls on
logfile ~/.msmtp.log
host yanfi.space
port 587
from yakoyann@yanfi.space
auth on
user yakoyann@yanfi.space
tls_starttls on
tls_certcheck on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
Le fichier de configuration ~/.netrc
machine yanfi.space
login yakoyann@yanfi.space
password MotPasseSmtp
Accès uniquement par utilisateur
chmod 600 ~/.msmtprc
chmod 600 ~/.netrc
Test
echo "Test envoi message en ligne de commande" | mail -s "msmtp" user@desti.fr
Le fichier log
mars 28 17:17:24 host=yanfi.space tls=on auth=on user=yakoyann@yanfi.space from=yakoyann@yanfi.space recipients=user@desti.fr mailsize=180 smtpstatus=250 smtpmsg='250 2.0.0 Ok: queued as B28BF6059E' exitcode=EX_OK
Si vous utilisez un parefeu iptable, il faut débloquer le port tcp 587 en sortie