Envoyer un mail html avec Python

python mail html
python gmail
automatiser mail

Mail simple :

On commence par envoyer un mail simple puis nous verrons l’envoi d’un mail en html avec python mail html

Envoyer un mail avec python c’est super simple, voici le code en python pour ce faire :

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText



#The mail addresses and password
sender_address = "Monadressemail@gmail.com"
sender_pass = "mon password"
receiver_address = "adresse_mail_destination@outlook.com"
#Setup the MIME
message = MIMEMultipart()
message['From'] = sender_address
message['To'] = receiver_address
message['Subject'] = 'Mon premier mail avec python'
#The body and the attachments for the mail
message.attach(MIMEText("Le petit message contenue dans le mail", 'html'))
#Create SMTP session for sending the mail
session = smtplib.SMTP('smtp.gmail.com', 587) 
session.ehlo()
session.starttls() #enable security
session.ehlo()
session.login(sender_address, sender_pass)
text = message.as_string()
session.sendmail(sender_address, receiver_address, text)
session.quit()
print('Mail Envoyé')

Par défaut j’utilise l’adresse smtp de gmail mais si tu utilises un autre fournisseur de messagerie tu peux remplacer smtp.gmail.com et 587 par le nom de serveur smtp et le port de ton fournisseur.

Python mail html

Bon maintenant nous allons envoyer un mail html avec python :

Dans le même dossier que notre fichier python on créée un fichier.html qui contiendra :

<!DOCTYPE html>
<html>
    <head>
        <title>Example</title>
    </head>
    <body>
        <p>This is an example of a simple HTML page with one paragraph.</p>
    </body>
</html>

Rien de fou 😉

Ensuite dans notre code python on récupère le contenu du fichier html dans une variable et on l’ajoute dans notre mail

Mail avec un fichier HTML :

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText


# add variable into HTML var
html = open('fichier.html','r')
html = html.read()
#The mail addresses and password
sender_address = "Monadressemail@gmail.com"
sender_pass = "mon password"
receiver_address = "adresse_mail_destination@outlook.com"
#Setup the MIME
message = MIMEMultipart()
message['From'] = sender_address
message['To'] = receiver_address
message['Subject'] = 'Mon premier mail avec python'
#The body and the attachments for the mail
message.attach(MIMEText(html, 'html'))
#Create SMTP session for sending the mail
session = smtplib.SMTP('smtp.gmail.com', 587) 
session.ehlo()
session.starttls() #enable security
session.ehlo()
session.login(sender_address, sender_pass)
text = message.as_string()
session.sendmail(sender_address, receiver_address, text)
session.quit()
print('Mail Envoyée')

Ajouter des variables dans un template HTML

OK c’est sympa mais si on veut quelque chose d’utile et automatiser ?

Si on souhaite que notre code python influence le fichier html et ajoute nos variables dans notre html avant de l’envoyer voici comment faire (l’exemple est tiré de mon projet de scraping de sneakers 😅 ) :

Voici le template HTML (mail.html):

<html>
  <head></head>
  <body>
    <h1>La Paire de demain : TOMORROW <br></h1>
       <h2>TITLE_NAME</h2>
       <h3>Prix de vente : PRICE€
         Prix de resell : resell_min€ - resell_max€
         date de sortie : DATE
         code sku : SKU
         <p>url: URL</p>
       </h3>
       <img class="fit-picture"
       src="IMAGE">
  </body>
</html>

L’objectif est que notre script python récupère le contenu du fichier dans une variable puis remplace : TOMORROW, TITLE_NAME, PRICE, resell_min, resell_max, DATE, SKU, URL et IMAGE (je sais j’aurais pu tout mettre en majuscule mais à la base ça ne devait pas être public 🤐)

Voici donc notre script python mail html :

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from datetime import date, timedelta
import locale


locale.setlocale(locale.LC_ALL, 'fr_FR.UTF-8')

today = date.today()
tomorrow = today + timedelta(days = 1)
tomorrow = tomorrow.strftime("%A %d %B %Y").title()

title_name = "Nike Air Force 1 Low Next Nature WMNS PECAN QUILT"
price = "130"
resell_price_min = 130
resell_price_max = 180
date_sortie = "05/11 à 09:00"
sku = "DH0775-200"
url = "- https://tidd.ly/3mbyq4p - https://4elementos.com/en/women-s-sneakers/24286-152220-nike-air-force-1-07-lxx-dh0775-200nike-air-force-1-07-lxx-dh0775-200.html#/9-talla-365 - https://www.woodwood.com/en/product/7610/nike-air-force-1-07-lxx"
image = "https://ci3.googleusercontent.com/proxy/mKa9UzvlvMu8oBydn9e0edvO32J48RgZ35FwqB8WeADJI4aiwkGiCIkMOTqY6icb4MB0jAvxa2j4QOdfFYs1RNFO5xhOfdIebul2cfl8Dr6sdA2QskaLgBuAbuneOkEKcN7-iLPrmweikv5CRRT1CfbLZcBdXpcwtdZ1790G8_74nMBKMPvMrF6zGd4d7P2OOH0Joy_JaPvayvkQILuxZto=s0-d-e1-ft#https://s3.eu-west-3.amazonaws.com/statics.whentocop.fr/thumbnail_nike_air_force_1_low_next_nature_wmns_pecan_quilt_dh0775_200_1b92e686ca.png"

# add variable into HTML var
with open('mail.html', 'r') as f:
    file_html = f.read()
new_html = file_html.replace('TOMORROW',str(tomorrow))
new_html = new_html.replace('TITLE_NAME',title_name)
new_html = new_html.replace('PRICE',price)
new_html = new_html.replace('resell_min',str(resell_price_min))
new_html = new_html.replace('resell_max',str(resell_price_max))
new_html = new_html.replace('DATE',date_sortie)
new_html = new_html.replace('SKU',sku)
new_html = new_html.replace('URL',url)
new_html = new_html.replace('IMAGE',image)
#The mail addresses and password
sender_address = "Monadressemail@gmail.com"
sender_pass = "mon password"
receiver_address = "adresse_mail_destination@outlook.com"
#Setup the MIME
message = MIMEMultipart()
message['From'] = sender_address
message['To'] = receiver_address
message['Subject'] = 'Les paires de demain'   #The subject line
#The body and the attachments for the mail
message.attach(MIMEText(new_html, 'html'))
#Create SMTP session for sending the mail
session = smtplib.SMTP('smtp.gmail.com', 587) #use gmail with port
session.ehlo()
session.starttls() #enable security
session.ehlo()
session.login(sender_address, sender_pass) #login with mail_id and password
text = message.as_string()
session.sendmail(sender_address, receiver_address, text)
session.quit()
print('Mail Sent')

J’ai mis les variables à la main pour l’exemple, dans mon projet les variables sont scrapées mais on peut faire la même chose avec des variables récupérée dans une base de données par exemple.

Et voici le mail FINAL de notre super python mail html:

python mail html

Tu peux aller encore plus loin en utilisant ce script dans un conteneur docker avec une cron à l’heure que tu veux pour automatiser le tout.

Si tu veux en savoir plus sur les mails avec python : la documentation

Les autres articles Python

Laisser un commentaire