fbpixel
Étiquettes : ,

Un des intérêts principaux des langages de programmation, comme Python, est d’automatiser des tâches comme l’envoi de mail. Nous allons voir dans ce tutoriel comment écrire un programme Python permettant d’envoyer un mail à partir d’un compte Gmail.

Ce tutoriel peut être appliqué à tout ordinateur notamment un Raspberry Pi.

Pour envoyer des mails à partir de microcontrôleur compatible Arduino. Vous pouvez lire ce tutoriel.

Matériel

  • Ordinateur ou Raspberry Pi
  • Compte Gmail

Principe de fonctionnement

Pour envoyer un mail avec Python, nous allons utiliser le protocole SMTP (Simple Mail Transfer Protocol), nous allons donc passer par un serveur qui gère l’envoi de mail. Comme le serveur smtp de Gmail. Pour pouvoir utiliser ce serveur, il faut un compte Gmail (création gratuite) et il faut activer la validation en deux étapes.

Configuration du compte Gmail

Sur la page de gestion du compte, aller dans l’onglet « Sécurité », puis cherchez l’encart « Connexion à Google ».

Ajouter la validation en deux étapes.

connexion-a-google Envoyez un mail à partir d'un script Python

Générer un mot de passe d’accès au compte pour une application donnée

generate-application-password Envoyez un mail à partir d'un script Python

Il vous suffit de recopier dans le code Python ci-dessous, l’identifiant utilisateur (l’adresse Gmail) et le mot de passe délivré par Google (encart jaune ci-dessus).

Cette fonction est volontairement simplifier pour montrer l’envoie de mail mais il est possible de la modifier afin d’envoyer des sujet, corps de message et informations différentes.

Code

Pour gérer le protocole STMP, nous allons utiliser la librairie stmplib que vous pouvez installer avec la commande

pip install smtplib

Pour une réutilisation plus simple du code, nous avons créer la classe EmailSenderClass pour faciliter l’envoi de mail. N’oublier pas de remplacer l’adresse du destinataire « destinataire@email.com » par la vôtre en bas du script dans la fonction

email.sendHtmlEmailTo("Admin","destinataire@email.com","Ceci est un mail automatique envoyé à partir d'un script Python.")
#!/usr/bin/env python
# -*- coding: utf-8 -*-

#Libraries
import sys
import smtplib

from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
from email.header import Header
from email.utils import formataddr

EMAIL_HTML_TEMPLATE="""<html>
				  <head>
				  </head>
				  <body>
					<p style ="margin: 5px 0;line-height: 25px;">Bonjour {},<br>
					<br>
					Ceci est un mail au format html.
					<br>
					{}
					<br>
					Bien à vous,<br>
					{} <br>
					</p>
				  </body>
				</html>
				"""


class EmailSenderClass:

	def __init__(self):
		""" """
		self.logaddr = "<gmail address>"
		self.fromaddr = "contact@domaine.com"# alias
		self.password = "<gmail app password"#


	def sendMessageViaServer(self,toaddr,msg):
		# Send the message via local SMTP server.
		server = smtplib.SMTP('smtp.gmail.com', 587)
		server.starttls()
		server.login(self.logaddr, self.password)
		text = msg.as_string()
		server.sendmail(self.fromaddr, toaddr, text)
		server.quit()
			
				

	def sendHtmlEmailTo(self,destName,destinationAddress,msgBody):
		#Message setup
		msg = MIMEMultipart()
		 
		msg['From'] =  "Me<"+self.fromaddr+">"
		msg['To'] = destinationAddress
		msg['Subject'] = "Hello mail"
		
		hostname=sys.platform
		
			
		txt = EMAIL_HTML_TEMPLATE
		
		txt=txt.format(destName,msgBody,hostname)
		
		#Add text to message
		msg.attach(MIMEText(txt, 'html'))
		
		print("Send email from {} to {}".format(self.fromaddr,destinationAddress))
		self.sendMessageViaServer(destinationAddress,msg)



if __name__ == "__main__":
	email= EmailSenderClass()
	email.sendHtmlEmailTo("Admin","destinataire@email.com","Ceci est un mail automatique envoyé à partir d'un script Python.")

Résultat

Après avoir lancé le script, vous devriez recevoir dans votre boite de réception le mail décrit dans le programme.

raspberrypi-email-sender-result Envoyez un mail à partir d'un script Python

Sources