GNU/Linux - sendmail pour envoyer des courriels en CLI ou en scripts

sendmail logo

Je mettrai ici quelques astuces que j'utilise pour envoyer des courriels avec la commande sendmail.

La commande sendmail est très utile lorsque l'on souhaite envoyer des e-mails dans des scripts bash.

Configurer Exim

J'utilise personnelement mon propre serveur de mail mais pour cet exercice je vais montrer comment configurer Exim en mode smarthost associé à un compte gmail.

Exim

Note : il faudra au préalable activer le mode applications moins sécurisées depuis le compte gmail (lien).
  • Éditer le fichier /etc/exim4/update-exim4.conf.conf :
dc_eximconfig_configtype='smarthost'
dc_other_hostnames=''
dc_local_interfaces='127.0.0.1 ; ::1'
dc_readhost=''
dc_relay_domains=''
dc_minimaldns='false'
dc_relay_nets=''
dc_smarthost='smtp.gmail.com:587'
CFILEMODE='644'
dc_use_split_config='true'
dc_hide_mailname='false'
dc_mailname_in_oh='true'
dc_localdelivery='mail_spool'
  • Éditer le fichier /etc/exim4/passwd.client et paramétrer l'adresse email et le mot de passe du compte gmail :
*:std_2021@gmail.com:myGMAILpassword123

Envoyer des courriels

Maintenant que notre serveur Exim est correctement configuré en mode smarthost nous pouvons utiliser la commande sendmail.

Simple

  • Créer un fichier /tmp/mail.header et configurer l'en-tête et le corp du message :
To: user@shebangthedolphins.net
From: std_2021@gmail.com
Subject: test mail

Hello human world!
This message has been sent with sendmail!
  • Envoyer le message :
user@host:~$ cat /tmp/mail.header | sendmail -f std_2021@gmail.com user@shebangthedolphins.net

Envoyer des mails depuis une liste d'adresses

  • Créer le fichier /tmp/mail.list et insérer les mails des destinataires :
user01@shebangthedolphins.net
user02@shebangthedolphins.net
user03@shebangthedolphins.net
  • Créer un fichier /tmp/mail.header.origin avec temp@address qui sera remplacé lors de l'envoi (avec sed -i) :
To: temp@address
From: std_2021@gmail.com
Date: Thu, 17 Jun 2021 08:45:25 +0200
Subject: test mail
  • Créer un fichier /tmp/body qui contiendra le corps du message :
Hi, this message has been sent with sendmail!
  • Envoyer les mails :
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 std_2021@gmail.com "$i"; done
  • Same but easier to read :
for i in $(cat /tmp/mail.list | sort -R | head -n 1); do
	sleep 20s					#wait 20 second beetween 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@shebangthedolphins.net 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 std_2021@gmail.com "$i" #send email to current recipient
done

Autres en-têtes

Si nécessaire on peut ajouter d'autres en-têtes :

  • Définir le content type et le charset :
Content-type: text/plain; charset=utf-8
  • Définir le Mime-Version (Normalement automatiquement ajouté) :
Mime-Version: 1.0
  • Définir le highest priority :
X-Priority: 1 (Highest)
  • Activer la notification, pour infomer l'expéditeur de la destination finale du message :
Disposition-Notification-To: <sender@shebangthedolphins.net>

Envoyer un courriel avec une pièce jointe

  • Convertir le fichier à envoyer en base64 :
user@host:~$ base64 secret.svg 
PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI5MDAiIGhlaWdo
dD0iNjAwIj48cGF0aCBmaWxsPSIjRUQyOTM5IiBkPSJNMCAwaDkwMHY2MDBIMHoiLz48cGF0aCBm
aWxsPSIjZmZmIiBkPSJNMCAwaDYwMHY2MDBIMHoiLz48cGF0aCBmaWxsPSIjMDAyMzk1IiBkPSJN
MCAwaDMwMHY2MDBIMHoiLz48L3N2Zz4=
  • Éditer le fichier /tmp/body :
--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
MCAwaDMwMHY2MDBIMHoiLz48L3N2Zz4=
--19032019ABCDE
  • Éditer le fichier /tmp/header :
To: user@shebangthedolphins.net
From: std_2021@gmail.com
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/mail /tmp/mail | sendmail -f std_2021@gmail.com user@shebangthedolphins.net
Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

Contact :