Comment envoyer des e-mails via Gmail en Python ?
L'expédition manuelle d'un grand volume de courriels peut être une tâche décourageante. L'utilisation de services externes permet l'envoi de courriels groupés, mais qu'en est-il de la création de votre propre solution ?
Ne serait-ce pas idéal ? C'est justement ce que nous allons faire : développer un script en Python pour l'envoi de courriels.
Python propose une bibliothèque nommée `smtplib`, dédiée à la transmission d'e-mails. Cette bibliothèque repose sur le protocole SMTP (Simple Mail Transport Protocol), standard pour l'envoi de courriels.
Configuration de Gmail
Pour cet exemple, nous utiliserons Gmail comme fournisseur de messagerie. Google n'autorise pas par défaut les scripts à se connecter directement. Une modification des paramètres de sécurité de votre compte Gmail est nécessaire pour permettre cette connexion.
Cependant, ajuster les paramètres de sécurité de votre compte principal peut être risqué. Il est préférable de créer un compte Gmail dédié à cet usage. Accédez aux paramètres de sécurité via ce lien et activez l'option "Autoriser les applications moins sécurisées".
Si vous préférez éviter cette option, vous pouvez utiliser l'API Google pour vous connecter à votre compte Gmail. Le script d'authentification via l'API Google est disponible ici.
Étapes d'envoi d'un courriel
L'envoi d'un courriel à l'aide de la bibliothèque `smtplib` nécessite le respect de plusieurs étapes. Commençons par les détailler avant de passer à l'écriture du script.
#1. Connexion au serveur SMTP
Chaque fournisseur de messagerie possède un nom de domaine et un port de serveur SMTP spécifiques. Ces informations sont cruciales pour la configuration du script. Pour Gmail, le nom de domaine du serveur SMTP est `smtp.gmail.com` et le port est `465`.
Nous privilégierons le cryptage SSL pour la connexion au serveur SMTP, réputé plus sûr que le cryptage TSL. Si vous souhaitez utiliser le cryptage TSL, le port à utiliser sera le 587 au lieu du 465. Le nom de domaine du serveur SMTP varie selon votre fournisseur de messagerie.
Voici le code pour la connexion au serveur SMTP :
server = smtplib.SMTP_SSL(smtp_server_domain_name, port, context=ssl_context)
#2. Authentification
Une fois la connexion au serveur SMTP établie, nous pouvons nous identifier en utilisant notre adresse e-mail et notre mot de passe grâce à la méthode `login` de l'objet SMTP. Le code associé est le suivant :
server.login(sender_email, password)
#3. Transmission du courriel
Après l'authentification, l'envoi du courriel est direct. Utilisez la méthode `sendmail`, en veillant à respecter le format suivant pour le message :
Sujet : votre_sujet_avec_retour_à_la_ligne contenu_du_courriel
Les espaces ne sont pas indispensables, ils servent simplement à la clarté du format. Voici un exemple de code :
server.sendmail(sender_mail, email, f"Subject: {subject}n{content}")
#4. Déconnexion
N'oubliez pas de clore la connexion SMTP.
Nous avons décrit les étapes nécessaires à l'envoi d'un courriel via Python. Passons maintenant au code complet.
import smtplib, ssl
class Mail:
def __init__(self):
self.port = 465
self.smtp_server_domain_name = "smtp.gmail.com"
self.sender_mail = "GMAIL_ADDRESS"
self.password = "SECURE_PASSWORD"
def send(self, emails, subject, content):
ssl_context = ssl.create_default_context()
service = smtplib.SMTP_SSL(self.smtp_server_domain_name, self.port, context=ssl_context)
service.login(self.sender_mail, self.password)
for email in emails:
result = service.sendmail(self.sender_mail, email, f"Subject: {subject}n{content}")
service.quit()
if __name__ == '__main__':
mails = input("Saisissez les adresses email : ").split()
subject = input("Saisissez le sujet : ")
content = input("Saisissez le contenu : ")
mail = Mail()
mail.send(mails, subject, content)
Nous avons créé une classe appelée `Mail`, avec une méthode `send` pour l'envoi des courriels. La structuration en classe rend le code plus lisible. La méthode `send` implémente les étapes décrites précédemment.
Félicitations ! Vous venez d'envoyer un courriel en utilisant un script Python.
Contenu HTML
Comment envoyer un courriel en HTML ? Est-ce possible ?
Bien sûr ! L'utilisation de la bibliothèque `email.mime`, intégrée à Python, permet l'envoi de courriels au format HTML.
La norme MIME a été conçue pour étendre les possibilités des courriels et intégrer différents types de contenu tels que les vidéos, les images et les applications.
Deux classes du module `email.mime` nous seront utiles : `MIMEText` et `MIMEMultipart`. Explorons-les brièvement.
#1. MIMEText
La classe `MIMEText` est utilisée pour définir le contenu HTML de notre courriel. Une instance de la classe `MIMEText` est créée en lui fournissant le contenu HTML et le type de contenu. Voici un exemple de code :
html_content = MIMEText(html_template, 'html')
Certains fournisseurs de messagerie ne gèrent pas l'affichage HTML. Il est donc recommandé de créer deux instances de la classe `MIMEText`, une pour le texte brut et une autre pour le HTML.
#2. MIMEMultipart
La classe `MIMEMultipart` facilite le formatage et l'ajout d'informations telles que le sujet, l'adresse d'expédition, l'adresse de destination, etc. Le contenu généré avec la classe `MIMEText` est transmis à `MIMEMultipart` à l'aide de la méthode `attach`.
L'instance de `MIMEMultipart` doit être créée avec l'argument `alternative` afin d'afficher soit du texte brut, soit du HTML. Voici le code pour envoyer un courriel avec du contenu HTML.
import smtplib, ssl
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
class Mail:
def __init__(self):
...
def send(self, emails):
ssl_context = ssl.create_default_context()
service = smtplib.SMTP_SSL(self.smtp_server_domain_name, self.port, context=ssl_context)
service.login(self.sender_mail, self.password)
for email in emails:
mail = MIMEMultipart('alternative')
mail['Subject'] = 'toptips.fr Célébrations'
mail['From'] = self.sender_mail
mail['To'] = email
text_template = """
toptips.fr
Bonjour {0},
Nous sommes heureux de vous annoncer que notre site web a atteint 10 millions de vues ce mois-ci.
"""
html_template = """
<h1>toptips.fr</h1>
<p>Bonjour {0},</p>
<p>Nous sommes heureux de vous annoncer que notre site web a atteint <b>10 millions</b> de vues le mois dernier.</p>
"""
html_content = MIMEText(html_template.format(email.split("@")[0]), 'html')
text_content = MIMEText(text_template.format(email.split("@")[0]), 'plain')
mail.attach(text_content)
mail.attach(html_content)
service.sendmail(self.sender_mail, email, mail.as_string())
service.quit()
if __name__ == '__main__':
mails = input("Saisissez les adresses email : ").split()
mail = Mail()
mail.send(mails)
Vous pouvez également ajouter une copie carbone invisible à l'aide de l'attribut `Cci` de l'instance `MIMEMultipart`.
Ajout de pièces jointes
Les pièces jointes peuvent être des images, des PDF, des documents, des feuilles de calcul, etc. La classe `MIMEBase` du module `email.mime` permet d'ajouter des pièces jointes aux courriels.
Voici comment ajouter une pièce jointe au courriel précédent.
import smtplib, ssl
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
from pathlib import Path
class Mail:
def __init__(self):
...
def send(self, emails):
## login...
for email in emails:
## MIMEMultipart instance
## text and html templates
## MIMEText instances
## attaching messages to MIMEMultipart
## attaching an attachment
file_path = "toptips.fr-logo.png"
mimeBase = MIMEBase("application", "octet-stream")
with open(file_path, "rb") as file:
mimeBase.set_payload(file.read())
encoders.encode_base64(mimeBase)
mimeBase.add_header("Content-Disposition", f"attachment; filename={Path(file_path).name}")
mail.attach(mimeBase)
## sending mail
service.quit()
if __name__ == '__main__':
mails = input("Saisissez les adresses email : ").split()
mail = Mail()
mail.send(mails)
Envoi groupé de courriels
Nous avons utilisé une boucle pour envoyer le même courriel à plusieurs destinataires. Cela est approprié si vous ne voulez pas que les destinataires connaissent les autres destinataires.
Cependant, si vous devez envoyer le même courriel à 1 000 personnes du même groupe, une boucle n'est pas la solution la plus efficace. L'ajout de plusieurs adresses e-mail dans le champ "À" du courriel est préférable. Comment réaliser cela en Python ?
Il est nécessaire de combiner la liste des adresses e-mail en une seule chaîne de caractères, en les séparant par une virgule et un espace. La méthode `join` permet de réaliser cette opération. Voici le code correspondant :
", ".join(emails)
Remplacez le champ "À" dans le script par la chaîne générée ci-dessus. C'est tout : vous avez envoyé un courriel à un groupe de personnes en une seule action.
Conclusion
Il existe des bibliothèques tierces pour l'envoi de courriels en Python, telles que Envelopes, Yagmail, ou encore Flanker. Ces bibliothèques permettent de simplifier l'écriture de scripts en réduisant le nombre de lignes de code. N'hésitez pas à les explorer !
Désormais, vous pouvez automatiser l'envoi de vos courriels grâce à des scripts Python. La structure d'envoi des courriels varie en fonction de votre cas d'utilisation. Nous avons exploré différents scénarios d'envoi de courriels. Vous pouvez facilement personnaliser les scripts présentés dans ce tutoriel pour répondre à vos besoins spécifiques. Cet article a servi de référence pour la création de ce tutoriel.
Bon développement ! 🙂