Envoyer des emails en ligne de commande sous GNU/Linux avec Sendmail et msmtp
- Mise à jour le 01 févr. 2026
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.
- Installer le paquet msmtp :
root@host:~# apt update && apt install msmtp
- Créer un lien symbolique afin que
sendmailsoit 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.headeret 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.listcontenant 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.origincontenant 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