Tuto Python: comment envoyer un e-mail

Table des matières

Introduction

  1. Prérequis
  2. SMTP
  3. SMTPlib
  4. Utiliser le serveur de messagerie intégré Python
  5. Utiliser un compte de messagerie générique (Gmail) pour envoyer des e-mails avec Python

5.1 Établir une connexion SMTP sécurisée

5.2 Envoyer des emails

  1. Ajouter du style à vos e-mails
  2. Ajout de pièces jointes à l'e-mail
  3. Envoi de plusieurs e-mails avec python
  4. Envoie des E-mails en masse

Conclusion

Introduction

Python est un langage de programmation très polyvalent. Il dispose d'un écosystème diversifié de bibliothèques open source qui facilitent la création de fonctionnalités communes dans un projet. Dans ce cadre, l’envoi d'e-mails avec Python est un exemple de cette fonctionnalité.

L'envoi d'e-mails est extrêmement utile, il vous permet d'envoyer des e-mails en masse, d'envoyer des codes de confirmation ou de vérification aux utilisateurs, ou même d'automatiser les tâches d'envoi des e-mails régulières. Ce tutoriel vous permettra d’envoyer des e-mails avec Python en utilisant SMTP (Simple Mail Transfer Protocol).

Pour un serveur SMTP, il est possible d’utiliser un serveur SMTP local ou un serveur se connectant à un service SMTP tiers. Dans cet article, nous utiliserons les deux alternatives citées.

N.B : Tout d'abord, vous devez configurer votre compte Gmail pour autoriser les applications moins sécurisées à partir de ce lien https://myaccount.google.com/u/1/lesssecureapps

Notez que ce paramètre n'est pas disponible pour les comptes ayant une validation en deux étapes activée.

1. Prérequis

Pour envoyer des e-mails avec Python, il est nécessaire d’avoir un ensemble d’éléments installés et configurés dans votre machine , à savoir :

  • Python: Si vous n’avez toujours pas installé Python sur votre machine, nous vous invitons à consulter le tutoriel d’installation Python.
  • Un compte Gmail: vous pouvez utiliser un compte Gmail existant. Cependant, dans ce didacticiel, vous devrez modifier un paramètre de sécurité Gmail. Vous utiliserez également votre nom d'utilisateur et votre mot de passe en texte brut.

Que vous créiez un nouveau compte ou que vous utilisiez un compte existant, la première chose à faire est d'activer «Accès aux applications moins sécurisées». Pour ce faire, assurez-vous d’abord que vous êtes connectés au compte souhaité.

Maintenant que votre compte Gmail est correctement configuré, vous devrez installer quelques bibliothèques Python essentielles, à savoir:

  • La bibliothèque SSL

Dans ce tutoriel, vous utiliserez une connexion SMTP sécurisée. Nous aurons besoin de la bibliothèque SSL pour ce faire. Ouvrez un shell ou une invite de commande et installez-le à l'aide de pip avec la commande suivante:

Syntaxe :

pip install ssl

  • SMTPlib (partie de la bibliothèque Python standard)

SMTPLib fait partie des bibliothèques standards de Python. Cela signifie que vous n'aurez pas besoin de l'installer explicitement, mais il est important de savoir quelques notions importantes sur cette bibliothèque.

2. SMTP

Un serveur SMTP est un ordinateur ou une application responsable de l'envoi des e-mails. Il fonctionne selon le protocole SMTP (Simple Mail Transfer Protocol). Un serveur SMTP reçoit des e-mails du client de messagerie. Ensuite, il les transmet à un autre serveur SMTP et les relie vers le serveur de messagerie entrant.

Un serveur SMTP aura une adresse (ou des adresses) qui peuvent être définies par l’utilisateur de messagerie ou l'application que vous utilisez, il est généralement au format smtp.serveraddress.com. (Par exemple, l'adresse du serveur SMTP de Gmail est smtp.gmail.com). Vous pouvez également trouver l'adresse de votre serveur SMTP dans la section « paramètre » de votre compte.

Lorsque vous envoyez un e-mail, le serveur SMTP traite votre e-mail, décide à quel serveur envoyer le message et relie le message vers ce serveur.

3. SMTPlib

La SMTPlib est une bibliothèque Python pour l'envoi des e-mails à l'aide du protocole SMTP (Simple Mail Transfer Protocol). C’est un module intégré; nous n'avons pas besoin de l'installer, il permet ainsi de faire abstraction de toutes les complexités du SMTP.

4. Utiliser le serveur de messagerie intégré Python

Pour envoyer un e-mail, nous devons avoir accès à un serveur de messagerie. Python est livré avec un serveur de messagerie de développement simple. Dans ce cadre, la mise en place d'un serveur SMTP local est un bon moyen de tester la fonctionnalité de votre code. Vous pouvez envoyer des e-mails et imprimer leur contenu dans un shell interactif.

Entrez la commande suivante dans le terminal pour démarrer un serveur de débogage SMTP local.

Syntaxe :

 python -m smtpd -c DebuggingServer -n localhost:1025

Insérez ensuite le code suivant:

Syntaxe :

import smtplib
from email.mime.text import MIMEText
destinateur = ['[email protected]']
destinataire = ['[email protected]']
port = 1025
msg = MIMEText('Ceci est un mail de test')
msg['Subject'] = 'Test '
msg['From'] = '[email protected]'
msg['To'] = '[email protected]'
with smtplib.SMTP('localhost', port) as server:
server.sendmail(destinateur, destinataire, msg.as_string())

Résultat d’exécution

5. Utiliser un compte de messagerie générique (Gmail) pour envoyer des e-mails avec Python

L’utilisation d’un compte de messagerie générique un excellent moyen de tester votre code et de le voir effectivement livré dans une boîte de réception. Nous découvrirons un exemple dans la section suivante.

5.1 Établir une connexion SMTP sécurisée

Dans la section précédente, nous avons envoyé un e-mail via un serveur SMTP local sans sécurité ni cryptage appropriés. Lorsque vous envoyez des e-mails dans le monde réel, ceci n'est pas conseillé. Vous devez vous assurer d’abord que votre connexion SMTP est sécurisée. Pour ceci, il existe deux principaux protocoles qui sécurisent une connexion SMTP, à savoir :

  • TLS (Transport Layer Security).
  • SSL (Secure Socket Layer)

TLS est une version améliorée de SSL. Bien que SSL soit un peu plus ancien, il est encore largement utilisé. Il existe également deux ports (465, 587) que vous utiliserez pour initier la connexion.

Si le port 587 est utilisé, une connexion non chiffrée est établie, puis chiffrée ultérieurement. La connexion est initiée à l'aide de server = smtplib.SMTP et ultérieurement chiffrée à l'aide de server.starttls.

Néanmoins, si le port 465 est utilisé, le cryptage SSL est initié avant toute communication. La connexion SMTP est initiée à l'aide de server = smtplib.SMTP_SSL

Malgrés le port utilisé, Gmail chiffrera la connexion à l'aide de TLS. Cependant, les certificats CA par défaut peuvent être chargés en appelant .create_default_context () et en créant un contexte SSL sécurisé.

5.2  Envoyer des emails

5.2.1 E-mails en texte brut

Nous utiliserons le port 465 dans ce guide. Cependant, le code requis pour les deux ports est indiqué ci-dessous. Envoyons un e-mail avec seulement un corps et aucun objet. Veuillez dans ce cas à modifier les adresses de l'expéditeur et du destinataire et le mot de passe en conséquence.

  • Pour le port 465

Syntaxe

import smtplib, ssl
smtp_server = 'smtp.gmail.com'
port = 465
destinateur = '[email protected]'
password = 'Votre mot de pass'
destinataire = '[email protected]'
message = 'Bienvenue au port 465.'
context = ssl.create_default_context()
with smtplib.SMTP_SSL(smtp_server, port, context=context) as server:
server.login(destinateur, password)
server.sendmail(destinateur, destinataire, message)

  • Pour le port 587

Syntaxe :

import smtplib, ssl
smtp_server = 'smtp.gmail.com'
port = 587
destinateur = '[email protected]'
password = 'Votre mot de pass'
destinataire = '[email protected]'
message = 'Bienvenue au port 587.'
context = ssl.create_default_context()
try:
server = smtplib.SMTP(smtp_server,port)
server.starttls(context=context)
server.login(destinateur, password)
server.sendmail(destinateur, destinataire, message)
except Exception as exep:
print(exep)
finally:
server.quit()

5.2.2 Ajout d'un objet à l'e-mail

Nous pouvons ajouter un sujet en changeant le message pour avoir un «Objet:» et avoir deux caractères de nouvelle ligne. (\ n). Pour ce faire, modifiez la variable de message (comme indiqué ci-dessous) et essayez de renvoyer l'e-mail. Veuillez noter les guillemets triples au lieu d'un guillemet simple.

Syntaxe :

message = """Subject: Bonjour
Ce message est envoyé depuis Python.""

Si vous souhaitez utiliser des guillemets simples à la place, utilisez le code suivant:

Syntaxe :

message = 'Subject: Bonjour \n\n Ce message est envoyé depuis Python.'

6. Ajouter du style à vos e-mails

Dans la dernière section de ce tutoriel, nous avons envoyé des e-mails avec une ligne d'objet et un corps simple. Cela ne suffit généralement pas pour résoudre les problèmes réels liés aux e-mails. Vous devrez styliser votre texte, ajouter des hyperliens et inclure des images. Nous utiliserons le module (email) de messagerie intégré de Python pour cela. Le code est assez long, alors parcourons-le petit à petit

Tout d'abord, importons nos bibliothèques et définissons les variables.

Syntaxe :

import smtplib, ssl
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
smtp_server = 'smtp.gmail.com'
port = 465
destinateur = '[email protected]'
password = 'Votre mot de pass'
destinataire = '[email protected]'

La prochaine étape que vous devrez faire est de définir un objet MIMEMultipart. Vous le convertirez en une chaîne plus tard et vous l'enverrez comme message électronique.

Syntaxe :

message = MIMEMultipart('alternative')
message['Subject'] = 'MIME Test'
message['From'] = destinateur
message['To'] = destinataire

Vous allez ensuite créer des versions en texte brut et HTML de l'e-mail que vous souhaitez envoyer :

Syntaxe :

email_texte = """\
salut,
Prends soin de toi
Au revoir!"""
email_html = """\
Salut,
Prend soin de toi
Au revoir!
"""

Vous allez ensuite transformer ces e-mails en texte brut et HTML en objets MIMETEXT et les joindre au message :

Syntaxe :

mimetext_texte = MIMEText(email_texte, "texte")
mimetext_html = MIMEText(email_html, "html")
message.attach(mimetext_texte)
message.attach(mimetext_html)

Vous pouvez maintenant envoyer l'e-mail en ajoutant la syntaxe suivante à l'ensemble du code :

Syntaxe :

context = ssl.create_default_context()
with smtplib.SMTP_SSL(smtp_server, port, context=context) as server:
server.login(destinateur, password)
server.sendmail(destinateur, destinataire, message.as_string())

7. Ajout de pièces jointes à l'e-mail

L'envoi de pièces jointes est une partie importante de l'envoi d'e-mails. Nous devons encoder les fichiers à envoyer par e-mail car nous travaillons avec un flux de données textuelles. Le moyen le plus simple de le faire est d'utiliser encoders.encode_base64 ().

Voyons ce principe en action. Notez que même si nous utiliserons une image dans ce tutoriel, vous pouvez utiliser une logique similaire pour envoyer d'autres types de fichiers (comme des PDF). Cela dit, Gmail refuse certaines extensions de fichiers comme .exe.

Tout d'abord, construisons notre code dans la mesure où nous avons spécifié nos définitions de variables et instancié le corps de l'e-mail avec un simple message, puis ouvrons le fichier, encodons-le et ajoutons un en-tête et une méthode de pièces jointes à notre e-mail:

Dans cette section, je vais utiliser un compte gmail que j'ai créé juste pour ce tutoriel pour exécuter des tests afin de vous permettre de comprendre clairement les étapes:

Syntaxe

import smtplib, ssl
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email import encoders
smtp_server = 'smtp.gmail.com'
port = 465
destinateur = '[email protected]'
password = 'Testing445566'
destinataire = '[email protected]'
nom_fichier = 'fichier.png'
message = MIMEMultipart('alternative')
message['Subject'] = 'envoie d\'un fichier'
message['From'] = destinateur
message['To'] = destinataire
message.attach(MIMEText('envoyer une pièce jointe', 'plain'))
with open(file_name, 'rb') as attachment:
file_part = MIMEBase('application', 'octet-stream')
file_part.set_payload(attachment.read())
encoders.encode_base64(file_part)
file_part.add_header(
'Content-Disposition',
'attachment; filename='+ str(nom_fichier)
)
message.attach(file_part)
context = ssl.create_default_context()
with smtplib.SMTP_SSL(smtp_server, port, context=context) as server:
server.login(destinateur, password)
server.sendmail(destinateur, destinataire, message.as_string())

Résultat d’exécution

8. Envoi de plusieurs e-mails avec python

Si vous savez comment importer un fichier texte (de préférence un CSV), vous pouvez le parcourir pour collecter des adresses e-mail et utiliser les principes de ce tutoriel pour envoyer plusieurs e-mails avec Python.

Voyons ce principe en action. Pour ce tutoriel, nous enverrons un simple e-mail avec un message d'accueil personnalisé qui dit "Bonjour".

Tout d'abord, créez un fichier CSV avec des e-mails et tout autre contenu que vous souhaitez ajouter à l'e-mail. Vous pouvez utiliser MS Excel pour ce faire. Ouvrez votre logiciel de feuille de calcul, créez un tableau avec deux colonnes "Nom" et "E-mail" et enregistrez-le au format CSV.

Voici à quoi cela ressemblera dans un éditeur de texte:

Syntaxe :

nom,email
John,[[email protected]]
Philip,[[email protected]]
[[email protected]]

Ensuite, vous voudrez écrire tous les composants communs de votre code:

Syntaxe :

import smtplib, ssl
import csv
smtp_server = 'smtp.gmail.com'
port = 465
destinateur = 'VotreGmail.com'
password = 'Votre mot de pass'
context = ssl.create_default_context()
with smtplib.SMTP_SSL(smtp_server, port, context=context) as server:
with open('MesEmails.csv') as f:
reader = csv.reader(f)
next(reader)
for row in reader:
message = 'bienvenue a cour-gratuit.com ! ' + row[0]
server.login(destinateur, password)
server.sendmail(destinateur, row[1], message)

9. Envoie des E-mails en masse

Les services de messagerie en masse peuvent être utilisés pour envoyer une quantité massive d'e-mails à des fins différentes, telles que des tâches de marketing et de promotion. Il existe de nombreux fournisseurs de services de messagerie en masse. Bien qu'ils ne soient pas gratuits, certains d'entre eux proposent des versions d'essai intéressantes.

Voici quelques fournisseurs de messagerie en masse ainsi que l'utilisation disponible sur leur plan gratuit:

  • SendinBlue: 300 e-mails par jour
  • Pepipost: 100 emails par jour
  • Mailgun: 10000 emails par mois
  • Mailjet: 6000 e-mails à vie
  • SendGrid: 40000 dans le premier mois

Pour utiliser l'un de ces services, il suffit de changer le smtp dans votre code, au lieu d'utiliser le smtp de gmail, utilisez celui de sendgrid par exemple.

Conclusion

Python est un excellent moyen pour automatiser les tâches d'envoi des e-mails ou même d'envoyer des e-mails générés automatiquement aux clients.

La bibliothèque standard requise pour envoyer un e-mail est smtplib, mais il existe de nombreuses autres bibliothèques qui permettent un style supplémentaire, l'ajout d'images et l'ajout de pièces jointes. Les e-mails que vous envoyez via Python peuvent être transmis via des protocoles tels que SSL et TLS garantissant que le contenu de votre e-mail est crypté.

Il existe ainsi de nombreuses autres bibliothèques qui facilitent l'envoi d'e-mails avec Python comme Yagmail, Enveloppes, Flanker…

Article publié le 06 Décembre 2020par Mouhtat Bilal