La boîte à Tutoriels de Christopher PECAUD

Envoi d'un email automatique avec Python et smtplib

Laisser un commentaire

SOMMAIRE

I Introduction
II Prérequis
III Ecriture du script
IV Conclusion

I Introduction

Nous allons voir dans ce document comment envoyer des mails de notifications à partir d’un script Python en utilisant le module smtplib. Vous verrez donc comment paramétrer votre script pour qu’il puisse se connecter à un serveur SMTP, mais aussi la configuration du mail à envoyer avec certaines fonctionnalités du module MimeMultipart.

II Prérequis

Nous allons avoir besoin du module smtplib, afin de nous connecter à un serveur SMTP cependant ce module est installé avec Python.

De même pour le module MimeMultipart qui va nous servir à paramétrer notre mail avant de l’envoyer.

Donc vous n’avez aucune installation à effectuer pour pouvoir écrire votre script.

Nous allons dans un premier temps devoir définir les imports nécessaires à l’écriture de notre script.

Nous allons avoir besoin des imports suivants pour les modules smtplib et email :

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

Dans un premier temps nous importons donc le module smtplib et ssl. Ssl est requis si vous utilisez une connexion au SMTP sécurisé.

Dans ce premier exemple nous allons écrire un simple script qui va nous permettre d’envoyer un simple mail en utilisant une connexion non sécurisée avec un serveur SMTP

Utilisation d’une connexion non sécurisée

On crée les variables suivantes :
port = 25 # pour une connexion non sécurisé
smtp_server = « adresse IP du serveur smtp » # adresse IP du serveur smtp
sender_mail = @ mail de la source 
receiver_mail = @ mail de destination

Ces variables nous serviront pour la connexion au serveur de mail et pour créer le mail à envoyer.

L’étape suivante consiste à créer le mail. On utilise l’objet MimeMultipart pour créer une instance.

message = MIMEMultipart()

Ensuite on utilise les propriétés de la variable message pour créer le sujet, le corps, l’adresse de l’envoyeur et l’adresse du destinataire.

Pour définir les adresses d’envoi et de destination on utilise les lignes de commandes suivantes :

message["From"] = sender_mail
message["To"] = receiver_mail

Pour créer le sujet du mail on utilise cette ligne de commande :

message["Subject"] = "Sujet du message"

Pour créer le corps du texte nous utilisons une nouvelle variable qui va nous permettre de définir cet élément :

body = """Corps du texte"""

Nous pouvons écrire notre texte du corps en « plain » ou en « html ». Dans notre cas nous avons défini notre contenu en mode « plain text ». Pour attacher ce contenu au message il faut utiliser la méthode de classe attach() comme ceci :

message.attach(MIMEText(body, "plain"))

Il nous reste plus qu’à envoyer le message. Dans un premier temps, on se connecte au serveur SMTP en utilisant la fonction en lui passant en paramètre les variables smtp_server et port que l’on a défini précédemment.

server = smtplib.SMTP(smtp_server, port)
server.sendmail(sender_mail, receiver_mail, message.as_string()) 

Cette méthode accepte les paramètres suivants :

  • L’adresse d’envoi qui correspond à la valeur contenue dans notre variable sender_mail ;
  • L’adresse de destination qui correspond à la valeur contenue dans notre variable receiver_mail ;
  • Et enfin le contenu de notre variable de type liste converti en chaîne de caractères.

On ferme ensuite la connexion avec le serveur en utilisant la méthode quit() :

server.quit() 

Voici le script complet :

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

def SendingEmail():
    port = 25
    
    smtp_server = "@ IP ou hostname du serveur SMTP"
    sender_mail = "@ mail d'envoi du message"
    receiver_mail = "@mail de destination du mail"
    
    message = MIMEMultipart()
    message["Subject"] = "Objet du mail "
    message["From"] = sender_mail
    message["To"] = receiver_mail
    body = """Corps du mail en format texte sans formatage"""
    message.attach(MIMEText(body, "plain"))

    try: 
        server = smtplib.SMTP(smtp_server, port)
       
              
        server.sendmail(sender_mail, receiver_mail, message.as_string()) 
        server.quit()   
    
    except Exception:
        server.quit()     
        print("Le mail n'a pas pu être envoyé...")
    
if __name__ == "__main__":
                    
    SendingEmail()

 

Ce script ne permet d’envoyer un mail simple par l’intermédiaire d’une connexion non sécurisée nous allons voir dans la partie suivante comment envoyer un mail de façon sécurisée en utilisant le serveur SMTP de Gmail pour exemple.

Utilisation d’une connexion sécurisée SSL avec le serveur SMTP de Gmail

Dans ce second script nous allons nous appuyer sur une connexion sécurisée SSL. Pour utiliser cette fonctionnalité depuis peu il faut paramétrer une fonctionnalité de sécurité dans le compte Gmail de la boîte qui sera utilisée pour faire transférer les mails. Cette fonctionnalité s’appelle la « Validation en deux étapes » et va vous permettre de générer un mot de passe d’application qui sera utilisé pour remplacer le mot de passe d’authentification de votre compte Gmail. Vous devez l’activer en cliquant sur « Validation en deux étapes ». Normalement une fois celle-ci activée, vous devriez obtenir ceci :

description image

Pour générer le mot de passe d’application, il suffit de cliquer sur « Mots de passe des applications ». Dans la page qui s’affiche alors :

description image

Dans la liste déroulante « Sélectionnez une application » choisissez la valeur « Autre (Nom personnalisé) » et dans la liste déroulante « Sélectionnez un appareil » choisissez « Ordinateur Windows » si vous exécutez ce script sur un ordinateur de ce type. Sinon choisissez une autre option. Il ne reste plus qu’à cliquer sur le bouton « Générer ». Une autre page s’affiche alors avec le code généré. Copiez-le, vous en aurez besoin dans la suite.

Nous pouvons maintenant passer à l’écriture de notre script. En fait la seule chose qui change par rapport au précédent script est la partie concernant la connexion au serveur smtp Gmail avec une connexion sécurisée.

Donc pour commencer nous allons définir les variables suivantes :

port = 465
smtp_server = "smtp.gmail.com"
password = "collez le code généré par le compte Gmail précédemment sans espace "
email = "adresse mail du compte Gmail utilisé pour la connexion"
sender_mail = @ mail de la source 
receiver_mail = @ mail de destination

La partie concernant la création du mail ne diffère pas de celle du script précédent, nous ne nous y attarderons pas dessus.

Une fois le mail créer et prêt à être envoyé nous commençons la partie concernant connexion au serveur SMTP de Gmail en utilisant cette fois-ci la méthode SMTP_SSL :

server = smtplib.SMTP_SSL(smtp_server, port)

Ensuite on crée une structure try… Except pour gérer les exceptions potentiellement levées.

A l’intérieur de cette structure on amorce le processus d’envoi de mail par une connexion authentifiée au serveur. Pour ce faire on utilise la méthode login de la classe smtp_lib :

server.login(email, password)
server.sendmail(sender_mail, receiver_mail, message.as_string()) 

Et nous fermons la connexion avec le serveur :

server.quit()

Voici le script complet :

import smtplib, ssl
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from time import sleep

def SendingEmail():
    port = 465
    password = "mot de passe d'application généré dans le compte gmail sans espace"
    smtp_server = "smtp.gmail.com"
    email = "nom du compte de connexion Gmail"
    sender_mail = "@ mail d'envoi"
    receiver_mail = "@ mail de destination"

    message = MIMEMultipart()
    message["Subject"] = "C'est ici que vous définissez l'objet du mail"
    message["From"] = sender_mail
    message["To"] = receiver_mail
    body = """Voici le contenu du corps du mail"""
    message.attach(MIMEText(body, "plain"))

    server = smtplib.SMTP_SSL(smtp_server, port)
    try: 
    
        server.login(email, password)
        server.sendmail(sender_mail, receiver_mail, message.as_string()) 
        server.quit()   
    
    except Exception:
        server.quit()     
        print("Le mail n'a pas pu être envoyé...")
if __name__ == "__main__":
    
    SendingEmail()

IV Conclusion

Dans ce document nous avons vu comment envoyer un mail en utilisant une connexion non sécurisée pour commencer à appréhender l’utilisation des bibliothèques Python et nous avons ensuite dans un deuxième temps vu un cas de connexion sécurisée par SSL en utilisant le serveur smtp de Gmail. Nous avons vu comment il est possible de gérer la sécurité de votre compte Gmail en activant la « Validation en deux étapes » qui est désormais de toute façon requise pour une utilisation SMTP sécurisée.

blog comments powered by Disqus