logo rss

Envoyer des emails en ligne de commande sous GNU/Linux avec Sendmail et msmtp

Logo sendmail Logo Debian

Cet article présente des techniques pratiques pour envoyer des emails en ligne de commande avec la commande sendmail sous GNU/Linux.

La commande sendmail est particulièrement utile pour l’envoi d’emails depuis des scripts Bash, notamment pour l’automatisation, la supervision et les notifications système.

Plutôt que de configurer un agent de transfert de courrier complet (MTA) comme Exim, souvent complexe à mettre en place sous Debian, ce guide s’appuie sur une solution légère et efficace basée sur msmtp.

Installer et configurer msmtp sous Debian

Dans ce guide, msmtp est utilisé comme un client SMTP simple agissant comme un remplacement de sendmail. Bien que les exemples reposent sur un serveur de messagerie privé, la configuration peut également être adaptée à des fournisseurs courants comme Gmail.

💡 Note : Depuis le 1er mai 2025, Google n’autorise plus l’authentification SMTP basée sur un simple couple identifiant/mot de passe. L’authentification OAuth 2 est désormais requise. Consultez l’annonce officielle de Google ici : support.google.com. L’intégration avec sasl-xoauth2 peut être utilisée (dépôt GitHub), bien que cette configuration n’ait pas été testée dans le cadre de cet article.

  • Installer le paquet msmtp :
root@host:~# apt update && apt install msmtp
  • CrĂ©er un lien symbolique afin que sendmail soit liĂ© Ă  msmtp :
root@host:~# ln -s /usr/bin/msmtp /usr/bin/sendmail
  • Modifier le fichier de configuration global /etc/msmtprc :
# Définir les valeurs par défaut pour tous les comptes
defaults
auth           on	# Activer l’authentification SMTP
tls            on	# Utiliser TLS pour sécuriser la connexion
tls_trust_file /etc/ssl/certs/ca-certificates.crt	# Chemin vers les certificats d’autorité de confiance
logfile        /var/log/msmtp.log

# Paramètres du compte n°1
account stdrocks 
host mail.std.rocks	# Nom d’hôte du serveur SMTP
port 465		# Port SMTP
from user@std.rocks     # Adresse utilisée dans l’en-tête « From »
user user@std.rocks     # Nom d’utilisateur pour l’authentification SMTP
password MyUserP@ss     # Mot de passe SMTP
tls_starttls off        # Désactiver STARTTLS
tls_certcheck off       # Désactiver la vérification du certificat TLS

# Définir ce compte comme compte par défaut
account default : stdrocks

Envoyer des emails en ligne de commande avec sendmail

Envoyer un email simple avec sendmail

  • CrĂ©er un fichier /tmp/mail.header et dĂ©finir les en-tĂŞtes ainsi que le contenu du message :
To: user@shebangthedolphins.net
From: john@std.rocks
Subject: test mail

Hello human world!
This message has been sent with sendmail!
  • Envoyer l’email en ligne de commande :
user@host:~$ cat /tmp/mail.header | sendmail -f john@std.rocks user@shebangthedolphins.net

Envoyer des emails Ă  plusieurs destinataires depuis un fichier

  • CrĂ©er un fichier /tmp/mail.list contenant la liste des adresses email des destinataires :
user01@shebangthedolphins.net
user02@shebangthedolphins.net
user03@shebangthedolphins.net
  • CrĂ©er un fichier d’en-tĂŞte modèle /tmp/mail.header.origin contenant une adresse email factice (temp@address) qui sera remplacĂ©e dynamiquement :
To: temp@address
From: john@std.rocks
Date: Thu, 17 Jun 2021 08:45:25 +0200
Subject: test mail
  • CrĂ©er le fichier contenant le corps de l’email /tmp/body :
Hi, this message has been sent with sendmail!
  • Envoyer des emails Ă  l’aide d’une boucle et d’une liste de destinataires :
user@host:~$ for i in $(cat /tmp/mail.list | sort -R | head -n 1); do sleep 20; cp /tmp/mail.header.origin /tmp/mail.header; echo "sending mail to $i"; sed -i "s/temp@address/$i/" /tmp/mail.header; sed -i "s/Date:.*/Date: $(date -R)/" mail.header; cat /tmp/mail.header /tmp/body | /usr/sbin/sendmail -f john@std.rocks "$i"; done
  • MĂŞme script, prĂ©sentĂ© de manière plus lisible :
for i in $(cat /tmp/mail.list | sort -R | head -n 1); do
	sleep 20s					#wait 20 second between each mail
	cp /tmp/mail.header.origin /tmp/mail.header	#copy template header to current header
	echo "sending mail to $i" 	#echo current recipient
	sed -i "s/temp@address/$i/" /tmp/mail.header		#replace temp@address by current recipient mail address in /tmp/mail.header 
	sed -i "s/Date:.*/Date: $(date -R)/" /tmp/mail.header		#replace Date field by current date in /tmp/mail.header
	cat /tmp/mail.header /tmp/body | /usr/sbin/sendmail -f john@std.rocks "$i" #send email to current recipient
done

Envoyer des emails de manière répétée avec des délais

Cette boucle permet d’automatiser l’envoi de notifications par email depuis la ligne de commande Linux : elle envoie un message toutes les 4 heures à un destinataire fixe via sendmail et met à jour l’en-tête Date à chaque envoi.

  • CrĂ©er tout d’abord un fichier d’en-tĂŞte /tmp/mail.header :
X-Priority: 1 (Highest)
From: sender@shebangthedolphins.net
To: dest@shebangthedolphins.net
Date: Thu, 17 Jun 2021 08:45:25 +0200
Subject: STD: Subject that I want
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
Content-Transfer-Encoding: 8bit
MIME-Version: 1.0
Disposition-Notification-To: <sender@shebangthedolphins.net>
  • CrĂ©er ensuite le fichier contenant le corps de l’email /tmp/body :
echo "Hello human world!" > /tmp/body
  • Enfin, exĂ©cuter la commande suivante pour envoyer les emails :
user@host:~$ for i in $(seq 1 60); do
   echo "sending mail number $i"
   sed -i "s/^Date:.*/Date: $(date -R)/" /tmp/mail.header
   cat /tmp/mail.header /tmp/body | /usr/sbin/sendmail -f user@shebangthedolphins.net dest@shebangthedolphins.net
   sleep 4h
done

Conseils sur les en-têtes d’email

Il est possible d’ajouter ou d’ajuster les en-têtes des emails afin de contrôler leur traitement et leur affichage par les clients de messagerie.

  • DĂ©finir le type de contenu et l’encodage des caractères :
Content-Type: text/plain; charset=utf-8
  • DĂ©finir la version MIME (gĂ©nĂ©ralement ajoutĂ©e automatiquement) :
MIME-Version: 1.0
  • DĂ©finir la prioritĂ© du message :
X-Priority: 1 (Highest)
  • Activer les notifications d’état de livraison afin d’informer l’expĂ©diteur lorsque le message est distribuĂ© ou lu :
Disposition-Notification-To: <sender@shebangthedolphins.net>

Envoyer un email avec une pièce jointe à l’aide de sendmail

Cet exemple montre comment envoyer un email avec une pièce jointe en construisant manuellement un message MIME multipart et en encodant le fichier en Base64.

  • Commencer par convertir le fichier Ă  joindre en Base64 :
user@host:~$ base64 secret.svg 
PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI5MDAiIGhlaWdo
dD0iNjAwIj48cGF0aCBmaWxsPSIjRUQyOTM5IiBkPSJNMCAwaDkwMHY2MDBIMHoiLz48cGF0aCBm
aWxsPSIjZmZmIiBkPSJNMCAwaDYwMHY2MDBIMHoiLz48cGF0aCBmaWxsPSIjMDAyMzk1IiBkPSJN
CAwaDMwMHY2MDBIMHoiLz48L3N2Zz4=
  • Modifier le fichier d’en-tĂŞte de l’email /tmp/header :
--19032019ABCDE
Content-Type: text/plain; charset=utf-8; format=flowed
Content-Transfer-Encoding: 7bit

Hi, this message has been sent with sendmail!

--19032019ABCDE
Content-Type: application/svg; name="secret.svg"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="secret.svg"

PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI5MDAiIGhlaWdo
dD0iNjAwIj48cGF0aCBmaWxsPSIjRUQyOTM5IiBkPSJNMCAwaDkwMHY2MDBIMHoiLz48cGF0aCBm
aWxsPSIjZmZmIiBkPSJNMCAwaDYwMHY2MDBIMHoiLz48cGF0aCBmaWxsPSIjMDAyMzk1IiBkPSJN
CAwaDMwMHY2MDBIMHoiLz48L3N2Zz4=
--19032019ABCDE
  • Envoyer l’email avec la pièce jointe :
To: user@shebangthedolphins.net
From: john@std.rocks
Date: Thu, 17 Jun 2021 08:45:25 +0200
Subject: test mail
Content-type: text/plain; charset=utf-8
Content-Disposition: inline
Content-Transfer-Encoding: 8bit
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="19032019ABCDE"
  • Envoyer le mail :
user@host:~$ cat /tmp/header /tmp/body | sendmail -f john@std.rocks user@shebangthedolphins.net