Site icon Mailtrap

Comment envoyer des emails en Python : méthodes SMTP et API expliquées

How to Send an Email in Python

Envoyer des emails en Python ? Pas de problème. Cet article couvre tout ce que vous devez savoir sur l’envoi d’emails en Python, y compris des exemples de code, la sécurité et le testing des emails.

Configuration de ‘smtplib

Le module smtplib de Python simplifie le processus d’envoi d’emails directement depuis vos applications, offrant une interface simple pour interagir avec les serveurs SMTP.

Cette section vous guide à travers l’importation de `smtplib`, la création d’un objet SMTP pour votre serveur et l’utilisation de ses fonctions principales pour envoyer des emails. Suivez ce guide pour apprendre à intégrer des fonctionnalités d’email dans vos scripts Python.

Le module intégré smtplib peut être importé en utilisant le code suivant :

import smtplib

Pour envoyer un email plus tard, créez un objet SMTP (Simple Mail Transfer Protocol) :

smtpObj = smtplib.SMTP( [host [, port]] )

Détails des paramètres :

Un objet SMTP possède une méthode d’instance appelée sendmail qui est utilisée pour envoyer un message et comporte trois paramètres :

smtpObj.sendmail(sender, receivers, message)

Pour vous assurer que le module d’email a été correctement importé et obtenir la description complète de ses classes et arguments, tapez dans une session interactive Python :

help(smtplib)

Consultez la documentation de Python pour examiner le reste des objets SMTP (par exemple, smtp.ehlo; smtp.send_message(msg), etc.) et comment les utiliser.

La section suivante explique comment envoyer des emails via Python en utilisant l’Email API/SMTP de Mailtrap, une fonctionnalité de la Plateforme de l’Email Delivery de Mailtrap. D’abord, je couvrirai la méthode SMTP et ensuite, je vous montrerai comment le faire avec notre SDK Python.

Envoyer des emails en utilisant SMTP

La méthode est très similaire à celle couverte dans la section smtplib ci-dessus, cependant, vous devez configurer des informations d’identification SMTP personnalisées. Ici, je suppose que vous êtes déjà inscrit sur Mailtrap et que vous avez vérifié votre domaine.

Si ce n’est pas le cas, consultez notre guide détaillé.

Assurez-vous également de consulter nos instructions vidéo sur comment envoyer des emails en Python avec Mailtrap en utilisant smtplib.

Note : Le code ci-dessous contient des informations d’identification fictives de Mailtrap (à l’exception de l’endpoint du serveur). Assurez-vous de les remplacer par vos véritables informations d’identification.

Voici un script de base pour envoyer des emails ‘plaintext’ avec Python en utilisant le SMTP de Mailtrap.

import smtplib
from email.mime.text import MIMEText

# Configuration
port = 587
smtp_server = "live.smtp.mailtrap.io"
login = "api"  # Votre identifiant généré par Mailtrap
password = "1a2b3c4d5e6f7g"  # Votre mot de passe généré par Mailtrap

sender_email = "mailtrap@exemple.com"
receiver_email = "nouveau@exemple.com"

# Contenu en texte brut
text = """\
Salut,
Consultez le nouvel article sur le blog de Mailtrap :
Serveur SMTP pour le testing : basé sur le cloud ou local ?
https://blog.mailtrap.io/2018/09/27/cloud-or-local-smtp-server/
N'hésitez pas à nous dire quel contenu vous serait utile !
"""

# Créer un objet MIMEText
message = MIMEText(text, "plain")
message["Subject"] = "Email en texte brut""
message["From"] = sender_email
message["To"] = receiver_email

# Envoyer l'email
with smtplib.SMTP(smtp_server, port) as server:
    server.starttls()  # Sécuriser la connexion
    server.login(login, password)
    server.sendmail(sender_email, receiver_email, message.as_string())

print('Envoyé')

Explication rapide :

Astuce bonus : Le hardcoding de données sensibles telles que les informations d’identification et les informations du serveur dans votre script peut représenter un risque pour la sécurité. C’est pourquoi je recommande d’utiliser des variables d’environnement pour stocker des informations sensibles. Cela rend votre code plus sécurisé et flexible lors du passage entre différents environnements (développement, testing, production).

Envoyer un email HTML

Si vous souhaitez en savoir plus sur l’envoi d’emails HTML en Python, consultez notre tutoriel dédié.

Pour modifier le script afin d’envoyer des emails HTML (tout en incluant plusieurs destinataires), je vais ajuster la façon dont le corps de l’email est créé et attaché. Voici le script révisé :

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

# Configuration
port = 587
smtp_server = "live.smtp.mailtrap.io"
login = "api"  # Votre identifiant généré par Mailtrap
password = "1a2b3c4d5e6f7g"  # Votre mot de passe généré par Mailtrap

sender_email = "mailtrap@exemple.com"
receiver_email = "nouveau1@exemple.com"

# Contenu de l'email
subject = "Email HTML Sans Pièce Jointe"
html = """\
<html>
  <body>
    <p>Salut,<br>
    Ceci est un email <b>de test</b> sans pièce jointe envoyé en utilisant <a href="https://www.python.org">Python</a>.</p>
  </body>
</html>
"""

# Créer un message multipart et définir les en-têtes
message = MIMEMultipart()
message["From"] = sender_email
message["To"] = receiver_email
message["Subject"] = subject

# Joindre la partie HTML
message.attach(MIMEText(html, "html"))

# Envoyer l'email
with smtplib.SMTP(smtp_server, port) as server:
    server.starttls()
    server.login(login, password)
    server.sendmail(sender_email, receiver_email, message.as_string())

print('Envoyé')

Explication rapide :

Envoyer un email à plusieurs destinataires

Ici, je vais réutiliser le script ci-dessus et ajuster la gestion des adresses des destinataires.

import smtplib
from email.mime.text import MIMEText

# Configuration
port = 587
smtp_server = "live.smtp.mailtrap.io"
login = "api"  # Votre identifiant généré par Mailtrap
password = "1a2b3c4d5e6f7g"  # Votre mot de passe généré par Mailtrap

sender_email = "mailtrap@exemple.com"
# Liste des adresses email des destinataires
receiver_emails = ["nouveau1@exemple.com", "nouveau2@exemple.com", "nouveau3@exemple.com"]

# Contenu en texte brut
text = """\
Salut,
Consultez le nouvel article sur le blog de Mailtrap :
Serveur SMTP pour le testing : basé sur le cloud ou local ?
https://blog.mailtrap.io/2018/09/27/cloud-or-local-smtp-server/
N'hésitez pas à nous dire quel contenu vous serait utile !
"""

# Créer un objet MIMEText
message = MIMEText(text, "plain")
message["Subject"] = "Email en texte brut"
message["From"] = sender_email
# Joindre la liste des emails des destinataires en une chaîne séparée par des virgules
message["To"] = ", ".join(receiver_emails)

# Envoyer l'email
with smtplib.SMTP(smtp_server, port) as server:
    server.starttls()  # Sécuriser la connexion
    server.login(login, password)
    # Boucler à travers chaque destinataire et envoyer l'email individuellement
    for recipient in receiver_emails:
        server.sendmail(sender_email, recipient, message.as_string())

print('Envoyé')

Explication rapide de ce qui est différent par rapport au script original plaintext :

Astuce pro : ⬆️ Cette approche fonctionne bien pour un petit nombre de destinataires. Cependant, pour envoyer des emails à un grand nombre de destinataires, il pourrait être plus efficace d’utiliser la capacité du serveur SMTP à gérer plusieurs destinataires en une seule opération d’envoi, selon les limitations et politiques du serveur.

Envoyer un email avec des pièces jointes

Je vais utiliser MIMEMultipart car les pièces jointes nécessitent un email multipart. De plus, j’utiliserai la classe MIMEBase pour joindre des fichiers. Voici le script mis à jour :

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders

# Configuration
port = 587
smtp_server = "live.smtp.mailtrap.io"
login = "api"  # Votre identifiant généré par Mailtrap
password = "1a2b3c4d5e6f7g"  # Votre mot de passe généré par Mailtrap

sender_email = "mailtrap@exemple.com"
receiver_email = "nouveau@exemple.com"  # Un seul destinataire

# Contenu de l'email
subject = "Email avec pièce jointe"
body = "Salut,\nCeci est un email de test avec une pièce jointe."

# Créer un message multipart et définir les en-têtes
message = MIMEMultipart()
message["From"] = sender_email
message["To"] = receiver_email
message["Subject"] = subject

# Ajouter le corps à l'email
message.attach(MIMEText(body, "plain"))

# Spécifier le chemin du fichier à joindre
filename = "path/to/votre/fichier.pdf"  # Modifiez cela avec le bon chemin

# Ouvrir le fichier en mode binaire
with open(filename, "rb") as attachment:
    part = MIMEBase("application", "octet-stream")
    part.set_payload(attachment.read())

# Encoder le fichier en caractères ASCII pour l'envoyer par email
encoders.encode_base64(part)

# Ajouter un en-tête en tant que paire clé/valeur à la partie pièce jointe
part.add_header("Content-Disposition", f"attachment; filename= {filename}")

# Ajouter la pièce jointe au message
message.attach(part)

# Envoyer l'email
with smtplib.SMTP(smtp_server, port) as server:
    server.starttls()
    server.login(login, password)
    server.sendmail(sender_email, receiver_email, message.as_string())

print('Envoyé')

Explication rapide :

Envoyer un email avec une image intégrée

Pour envoyer des emails avec une image intégrée (dans le contenu HTML), j’utiliserai la classe MIMEImage.

Intégrer une image directement dans l’email permet de l’afficher comme partie intégrante du contenu de l’email plutôt que comme une pièce jointe séparée. Voici comment vous pouvez le faire :

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
from email.mime.base import MIMEBase
from email import encoders
import os

# Configuration
port = 587
smtp_server = "live.smtp.mailtrap.io"
login = "api"  # Votre identifiant généré par Mailtrap
password = "1a2b3c4d5e6f7g"  # Votre mot de passe généré par Mailtrap

sender_email = "mailtrap@exemple.com"
receiver_email = "noveau1@exemple.com"

# Contenu HTML avec une image intégrée
html = """\
<html>
  <body>
    <p>Salut,<br>
    Ceci est un email <b>de test</b> avec une image intégrée.<br>
    Voici une image : <img src="cid:image1">.</p>
  </body>
</html>
"""

# Créer un message multipart et définir les en-têtes
message = MIMEMultipart()
message["From"] = sender_email
message["To"] = receiver_email
message["Subject"] = "Email HTML avec image intégrée"

# Attacher la partie HTML
message.attach(MIMEText(html, "html"))

# Spécifier le chemin de votre image
image_path = "path/to/votre/image.jpg"  # Modifiez cela avec le bon chemin

# Ouvrir le fichier image en mode binaire
with open(image_path, 'rb') as img:
    # Joindre le fichier image
    msg_img = MIMEImage(img.read(), name=os.path.basename(image_path))
    # Définir l'en-tête Content-ID à utiliser dans le corps HTML
    msg_img.add_header('Content-ID', '<image1>')
    # Joindre l'image au message
    message.attach(msg_img)

# Envoyer l'email
with smtplib.SMTP(smtp_server, port) as server:
    server.starttls()
    server.login(login, password)
    server.sendmail(sender_email, receiver_email, message.as_string())

print('Envoyé')

Explication rapide :

Envoi asynchrone d’emails

Pour l’envoi asynchrone d’emails, vous devez utiliser la bibliothèque asyncio de Python avec aiosmtplib, un client SMTP asynchrone.

Cette modification permet à votre script d’envoyer des emails sans bloquer l’exécution de votre programme, le rendant plus efficace, en particulier lors de l’envoi de plusieurs emails ou de l’exécution d’autres tâches simultanément.

Par souci de simplicité, j’enverrai un email texte/brut à un seul destinataire sans pièces jointes ni images intégrées. Voici comment cela fonctionne.

Tout d’abord, assurez-vous d’installer aiosmtplib.

pip install aiosmtplib

Maintenant, voici le script :

import asyncio
from email.mime.text import MIMEText
from aiosmtplib import SMTP

async def send_email_async(sender_email, receiver_email, smtp_server, port, login, password, subject, body):
    message = MIMEText(body)
    message["From"] = sender_email
    message["To"] = receiver_email
    message["Subject"] = subject
    
    async with SMTP(hostname=smtp_server, port=port) as smtp:
        await smtp.connect()
        await smtp.starttls()
        await smtp.login(login, password)
        await smtp.send_message(message)

async def main():
    # Configuration de l'email
    smtp_server = "live.smtp.mailtrap.io"
    port = 587
    sender_email = "mailtrap@exemple.com"
    receiver_email = "noveau@exemple.com"  # Un seul destinataire
    login = "api"  # Votre identifiant généré par Mailtrap
    password = "1a2b3c4d5e6f7g"  # Votre mot de passe généré par Mailtrap
    subject = "Test d'Email Asynchrone"
    body = "Ceci est un email en texte brut envoyé de manière asynchrone."
    
    await send_email_async(sender_email=sender_email, receiver_email=receiver_email, smtp_server=smtp_server, port=port, login=login, password=password, subject=subject, body=body)
    print("Email envoyé de manière asynchrone.")

if __name__ == "__main__":
    asyncio.run(main())

Explication rapide :

Envoi d’emails en masse

Le code ci-dessus utilise live.smtp.mailtrap.io qui est l’endpoint pour les emails transactionnels. Le package de la Plateforme d’Email Delivery de Mailtrap permet d’envoyer des emails en masse via un stream séparé bulk.smtp.mailtrap.io sous le même plan.

Maintenant, la seule chose différente est l’Hôte (endpoint), et vous devez ajuster votre script en conséquence. Mais gardez en tête que les emails Transactionnels et en Masse ont des infrastructures séparées, même si vos informations d’identification sont presque les mêmes. Cela aide à améliorer la délivrabilité et la gestion des emails.

Pour illustrer les changements, j’ai créé un script simple en utilisant l’endpoint SMTP fourni.

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

# Configuration pour le serveur SMTP Bulk de Mailtrap
smtp_server = "bulk.smtp.mailtrap.io"
port = 587
login = "api"  # Votre identifiant Mailtrap
password = "1a2b3c4d5e6f7g"  # Votre mot de passe Mailtrap

sender_email = "mailtrap@exemple.com"
receiver_email = "noveau@exemple.com"  # Un seul destinataire

# Créer un message MIMEText pour du texte brut
subject = "Email en texte brut via SMTP Bulk"
body = "Ceci est un email en texte brut envoyé via le serveur SMTP Bulk de Mailtrap."

# Créer un message MIMEMultipart et définir les en-têtes
message = MIMEMultipart()
message["From"] = sender_email
message["To"] = receiver_email
message["Subject"] = subject

# Joindre la partie texte
message.attach(MIMEText(body, "plain"))

# Envoyer l'email
with smtplib.SMTP(smtp_server, port) as server:
    server.starttls()  # Sécuriser la connexion
    server.login(login, password)  # Se connecter au serveur SMTP
    server.sendmail(sender_email, receiver_email, message.as_string())  # Envoyer l'email

print('Email envoyé avec succès.')

Explication rapide :

Astuce Pro : Si vous utilisez des variables d’environnement ou un fichier de configuration externe pour les informations d’identification SMTP, il est préférable d’avoir des fichiers séparés pour la configuration Transactionnelle et Bulk.

Envoyer des emails en utilisant l’API

Pour simplifier votre intégration, Mailtrap dispose d’un SDK Python officiel (consultez le lien GitHub ◀️). Je l’utiliserai pour vous montrer comment envoyer un email en texte brut, l’envoyer à plusieurs destinataires, envoyer des emails en masse, etc.

Ici, je ne couvrirai pas la méthode d’envoi d’emails asynchrone car Mailtrap ne la prend pas en charge, et cela n’a pas beaucoup de sens dans les contextes API.

Pour rappel, vous devrez connecter et vérifier votre domaine avec Mailtrap. Consultez notre guide détaillé et une vidéo bonus pour vous montrer comment faire.

Une fois cela fait, retournez à votre application Python et installez le SDK Python officiel de Mailtrap avec la commande suivante :

pip install mailtrap

Note : assurez-vous que la version du package est 3.6 ou plus.

Ensuite, vous devez créer l’objet d’email et remplir les variables (comme l’email et le nom) avec vos informations d’identification Mailtrap. Gardez en tête que vous devez indiquer l’adresse du domaine d’envoi vérifié.

import mailtrap as mt

# Créer un objet Mail
mail = mt.Mail(
    sender=mt.Address(email="mailtrap@exemple.com", name="Test de Mailtrap"),
    to=[mt.Address(email="votre@email.com")],
    subject="Vous êtes génial !",
    text="Félicitations pour l’envoi d'un email de test avec Mailtrap !",
)

# Créer un client et envoyer
client = mt.MailtrapClient(token="votre-clé-api")
client.send(mail)

Vous devrez également créer le client avec votre jeton API. Allez dans votre compte Mailtrap en ouvrant le menu déroulant ‘Settings’, puis choisissez l’onglet “API Token”. Copiez les informations d’identification en appuyant sur ‘Copy’ à côté de votre jeton.

Ensuite, vous pouvez utiliser la commande ci-dessous pour envoyer l’email.

# Créer un client et envoyer
client = mt.MailtrapClient(token="votre-clé-api")
client.send(mail)

Ceci étant fait, je vais vous montrer comment utiliser le SDK pour différents cas d’utilisation.

Voici un script de base pour envoyer un email en texte brut :

from mailtrap import Mail, Address, MailtrapClient

# Créer un objet Mail avec les détails de base pour un email en texte brut
mail = Mail(
    # Spécifiez l'adresse email de l'expéditeur et un nom optionnel
    sender=Address(email="mailtrap@exemple.com", name="Test de Mailtrap"),
    # Spécifiez un ou plusieurs destinataires ; ici, nous utilisons une liste avec un seul destinataire
    to=[Address(email="votre@email.com", name="Votre Nom")],
    # Objet de l'email
    subject="Email en texte brut simple",
    # Le contenu en texte brut de l'email
    text="Ceci est un email en texte brut envoyé en utilisant le SDK Mailtrap. Simple et direct.",
    # Optionnel : catégoriser cet email pour faciliter le tri ou la gestion dans le service Mailtrap
    category="Test",
    # Optionnel : des en-têtes supplémentaires peuvent être spécifiés, mais ne sont pas nécessaires pour les emails en texte brut
    headers={"X-Example-Header": "HeaderValue"}
)

# Initialiser le MailtrapClient avec votre clé API
client = MailtrapClient(token="votre-clé-api")

# Envoyer l'email en utilisant la méthode send du client
client.send(mail)

print("Email en texte brut envoyé avec succès.")

Explication rapide :

Envoyer un email HTML

Je vais ajuster le script en spécifiant le paramètre html dans l’objet Mail avec le contenu HTML.

from mailtrap import Mail, Address, MailtrapClient

# Créer un objet Mail pour envoyer un email HTML
mail = Mail(
    sender=Address(email="mailtrap@exemple.com", name="Test de Mailtrap"),
    to=[Address(email="destinataire@email.com", name="Nom du Destinataire")],
    subject="Votre Objet d'Email HTML Ici",
    text="Ceci est un texte de secours pour les fournisseurs de messagerie qui ne supportent pas l’HTML",
    html="""
    <!DOCTYPE html>
    <html>
        <head>
            <title>Titre de l'Email</title>
        </head>
        <body>
            <h1>Hello, World !</h1>
            <p>Ceci est un email <strong>HTML</strong> envoyé depuis le SDK Python de Mailtrap.</p>
            <p>Voici un lien : <a href="https://example.com">Visitez Exemple.com</a></p>
        </body>
    </html>
    """,
    # Vous pouvez catégoriser cet email ou ajouter des en-têtes personnalisés si nécessaire
    category="Email HTML",
    headers={"X-Custom-Header": "Valeur"}
)

# Initialiser le MailtrapClient avec votre clé API
client = MailtrapClient(token="votre-clé-api")

# Envoyer l'email
client.send(mail)

print("Email HTML envoyé avec succès.")

Explication rapide :

Envoyer un email à plusieurs destinataires

Je vais modifier la partie destinataires de la configuration de l’email pour inclure plusieurs destinataires.

Il y a des commentaires tout au long du script pour expliquer comment gérer plusieurs destinataires pour le champ To et ajouter des destinataires Cc (Copie Carbone) et Bcc (Copie Carbone Invisible). Je n’ajouterai donc pas la section Explication rapide dans ce cas car la méthode est simple et la logique est évidente dans le script.

from mailtrap import Mail, Address, MailtrapClient

# Créer un objet Mail visant plusieurs destinataires, y compris les adresses Cc et Bcc
mail = Mail(
    # Spécifiez l'adresse email de l'expéditeur et un nom optionnel
    sender=Address(email="mailtrap@exemple.com", name="Test de Mailtrap"),
    # Spécifiez plusieurs destinataires dans le champ "A"
    to=[
        Address(email="destinataire1@email.com", name="Destinataire Un"),
        Address(email="destinataire2@email.com", name="Destinataire Deux"),
    ],
    # De plus, spécifiez des destinataires dans le champ "Cc"
    cc=[
        Address(email="cc1@email.com", name="Cc Destinataire Un"),
        Address(email="cc2@email.com", name="Cc Destinataire Deux"),
    ],
    # Et des destinataires dans le champ "Bcc" pour des copies cachées
    bcc=[
        Address(email="bcc1@email.com", name="Bcc Destinataire Un"),
        Address(email="bcc2@email.com", name="Bcc Destinataire Deux"),
    ],
    # Objet de l'email
    subject="Email à Plusieurs Destinataires",
    # Le contenu de l’email en texte brut
    text="Cet email est envoyé à plusieurs destinataires, y compris les adresses Cc et Bcc.",
    # Optionnel : catégoriser cet email ou ajouter des en-têtes personnalisés si nécessaire
    category="Email en masse",
    headers={"X-Custom-Header": "Valeur"}
)

# Initialiser le MailtrapClient avec votre clé API
client = MailtrapClient(token="votre-clé-api")

# Envoyer l'email en utilisant la méthode send du client
client.send(mail)

print("Email envoyé à plusieurs destinataires avec succès.")

Envoyer un email avec des pièces jointes

Ici, je vais principalement me concentrer sur la manière dont la classe Attachment est utilisée pour inclure des fichiers dans votre email. Cet exemple démontrera comment joindre un fichier générique, mais l’approche est similaire pour tout type de fichier.

from mailtrap import Mail, Address, MailtrapClient, Attachment, Disposition
import base64
from pathlib import Path

# Préparer le fichier que vous souhaitez joindre
file_path = Path("path/to/votre/fichier.pdf")  # Remplacez ceci avec le chemin de votre fichier
file_content = file_path.read_bytes()  # Lire le contenu du fichier en tant que bytes

# Encoder le contenu du fichier en base64
encoded_content = base64.b64encode(file_content)

# Créer un objet Mail avec une pièce jointe
mail = Mail(
    sender=Address(email="mailtrap@exemple.com", name="Test de Mailtrap"),
    to=[Address(email="destinataire@email.com", name="Nom du Destinataire")],
    subject="Email avec pièce jointe",
    text="Cet email contient une pièce jointe. Ouvrez-la !",
    # Définir la pièce jointe
    attachments=[
        Attachment(
            content=encoded_content,  # Le contenu encodé en base64 du fichier
            filename=file_path.name,  # Le nom du fichier tel qu'il doit apparaître dans l'email
            disposition=Disposition.ATTACHMENT,  # Indique que le fichier est une pièce jointe
            mimetype="application/pdf",  # Le type MIME du fichier
            # `content_id` est optionnel et généralement utilisé pour intégrer des images directement dans le corps HTML
        )
    ],
)

# Initialiser le MailtrapClient avec votre clé API
client = MailtrapClient(token="votre-clé-api")

# Envoyer l'email
client.send(mail)

print("Email avec pièce jointe envoyé avec succès.")

Explication rapide :

Envoyer un email avec une image intégrée

Ici, je vais joindre l’image pour qu’elle puisse être affichée directement dans le contenu HTML de l’email. Cela est généralement réalisé en joignant l’image avec un Content-ID (cid) qui peut être référencé dans le HTML. Voici comment le faire :

from mailtrap import Mail, Address, MailtrapClient, Attachment, Disposition
import base64
from pathlib import Path

# Spécifiez le chemin de votre image
image_path = Path("path/to/votre/image.jpg")
image_content = image_path.read_bytes()  # Lire le contenu de l'image en tant que bytes

# Encoder le contenu de l'image en base64
encoded_image = base64.b64encode(image_content)

# Créer un objet Mail avec du contenu HTML et une image intégrée
mail = Mail(
    sender=Address(email="mailtrap@exemple.com", name="Test de Mailtrap"),
    to=[Address(email="destinataire@email.com", name="Nom du Destinataire")],
    subject="Email avec image intégrée",
    text="Ceci est un texte de secours pour les fournisseurs de messagerie qui ne supportent pas l’HTML.",
    html="""
    <!DOCTYPE html>
    <html>
        <body>
            <h1>Hello, World !</h1>
            <p>Cet email contient une image intégrée.</p>
            <!-- Utilisez 'cid:image_cid' dans l\'attribut src pour intégrer l\'image -->
            <img src="cid:image_cid">
        </body>
    </html>
    """,
    attachments=[
        Attachment(
            content=encoded_image,
            filename=image_path.name,
            disposition=Disposition.INLINE,  # Marquez la pièce jointe comme intégrée
            mimetype="image/jpeg",  # Le type MIME de l'image
            content_id="image_cid",  # Content-ID utilisé pour référencer l'image dans l'attribut src HTML
        )
    ],
)

# Initialiser le MailtrapClient avec votre clé API
client = MailtrapClient(token="votre-clé-api")

# Envoyer l'email
client.send(mail)

print("Email avec une image intégrée envoyé avec succès.")

Explication rapide :

Envoi d’emails en masse

Petit rappel, la Plateforme d’Email Delivery de Mailtrap vous permet d’envoyer des emails en masse en plus des emails transactionnels, sous le même plan. Vous devez sélectionner le stream, cliquer sur le bouton API, et choisir l’intégration Python.

Ceci étant fait, voici ce que vous devez faire d’autre.

  1. Assurez-vous d’avoir installé la bibliothèque requests. Si ce n’est pas le cas, vous pouvez l’installer en utilisant pip :
pip install requests
  1. Construisez un payload JSON qui spécifie les détails de l’email et ajustez le champ to pour inclure plusieurs destinataires.
  1. En utilisant la bibliothèque requests, faites une requête POST à l’endpoint de l’API Bulk de Mailtrap, en fournissant les en-têtes nécessaires (y compris l’autorisation) et le payload. Consultez le script exemplaire ci-dessous.
import requests
import json

def send_mailtrap_email(payload):
    url = "https://bulk.api.mailtrap.io/api/send"
    headers = {
      "Authorization": "Bearer votre_clé_api",  # Remplacez par votre clé API Mailtrap
      "Content-Type": "application/json"
    }

    response = requests.post(url, headers=headers, data=json.dumps(payload))
    return response.text

payload = {
    "from": {"email": "mailtrap@mailtrapdemo.com", "nom": "Test de Mailtrap"},
    "to": [{"email": "destinataire@exemple.com"}],  # Ajoutez d'autres destinataires si nécessaire
    "subject": "Vous êtes génial !",
    "text": "Félicitations pour l'envoi d'un email de test avec Mailtrap !",
    "category": "Test d'intégration"
}

response_text = send_mailtrap_email(payload)
print(response_text)

Explication rapide :

Considérations de sécurité lors de l’envoi d’emails

Si vous envisagez d’automatiser l’envoi d’emails et de les envoyer à un grand nombre de destinataires de manière régulière, il est préférable de prendre des précautions supplémentaires. (Surtout en ce qui concerne la méthode SMTP.)

Ici, je vais couvrir quelques méthodes éprouvées pour éviter de coder trop d’informations d’identification dans vos scripts et gérer les erreurs. Notez que les conseils ci-dessous s’appliquent quel que soit le fournisseur de services de messagerie que vous utilisez (SendGrid, SES, compte Gmail, etc.)

Utilisation des variables d’environnement pour les informations sensibles

Les variables d’environnement sont un moyen sûr de gérer les paramètres de configuration et les informations sensibles en dehors de votre code source.

En Python, vous pouvez utiliser le module os pour accéder aux variables d’environnement.

import os

smtp_server = os.getenv("SMTP_SERVER", "default.smtp.server")
login = os.getenv("SMTP_LOGIN")
password = os.getenv("SMTP_PASSWORD")

# Exemple d'utilisation dans une configuration de connexion SMTP
# smtp.login(login, password)

Avant d’exécuter votre script, définissez les variables d’environnement dans votre système d’exploitation. Par exemple, dans un terminal Linux ou macOS, vous pouvez les définir temporairement comme ceci :

export SMTP_SERVER=live.smtp.mailtrap.io
export SMTP_LOGIN=votre_identifiant
export SMTP_PASSWORD=votre_mot_de_passe

Sous Windows, vous pouvez les définir via la ligne de commande comme suit :

set SMTP_SERVER=live.smtp.mailtrap.io
set SMTP_LOGIN=votre_identifiant
set SMTP_PASSWORD=votre_mot_de_passe

Gestion des erreurs

Voici comment gérer les erreurs inattendues, telles que les erreurs réseau, les problèmes d’authentification ou d’autres exceptions pouvant survenir lors de l’envoi de l’email.

try:
    # Tentative d’envoi d’un email
    server.sendmail(sender_email, recipient_email, message.as_string())
except smtplib.SMTPException as e:
    print(f"Une erreur SMTP s'est produite : {e}")
except Exception as e:
    print(f"Une erreur s'est produite : {e}")

Utilisation de SSL

Voici un aperçu de base de la façon dont vous pourriez utiliser smtplib.SMTP_SSL dans un script pour envoyer un email :

import smtplib
from email.mime.text import MIMEText


# Configuration
port = 465
smtp_server = "live.smtp.mailtrap.io"
login = "identifiant"
password = "mot de passe"


sender_email = "expediteur@domaine_enregistre.com"
receiver_email = "destinataire@gmail.com"


text = """\
Bonjour,
N'hésitez pas à nous dire quel contenu vous serait utile !
"""


message = MIMEText(text, "plain")
message["Subject"] = "Email en texte brut"
message["From"] = sender_email
message["To"] = receiver_email




with smtplib.SMTP_SSL(smtp_server, port) as server:
    server.login(login, password)
    server.sendmail(sender_email, receiver_email, message.as_string())
    print("Email envoyé avec succès !")

Configuration externe

Stocker les données de configuration (comme les détails du serveur SMTP et les adresses email) dans des fichiers externes ou des variables d’environnement améliore la sécurité et la flexibilité de votre script. Pour des configurations plus complexes, vous pourriez envisager d’utiliser un fichier JSON ou similaire.

{
    "smtp_server": "live.smtp.mailtrap.io",
    "smtp_port": 587,
    "login": "votre_identifiant",
    "password": "votre_mot_de_passe"
}
import json

with open('config.json', 'r') as config_file:
    config = json.load(config_file)

smtp_server = config.get('smtp_server')
smtp_port = config.get('smtp_port')
login = config.get('login')
password = config.get('password')

Conseil : Si vous souhaitez envoyer des emails depuis votre compte Google et utiliser le serveur SMTP de Gmail (smtp.gmail.com), nous avons déjà écrit un article à ce sujet. Consultez l’article ici.

Tester les emails et l’envoi d’emails dans un environnement de test

Lors de la création d’une nouvelle application ou de l’ajout de fonctionnalités, en particulier lorsqu’il s’agit de la première fois, il est essentiel d’expérimenter sur un serveur de test. Voici une liste rapide des raisons :

  1. Vous n’enverrez pas d’emails à vos amis et clients, ce qui est crucial lorsque vous testez l’envoi d’emails en masse ou travaillez avec une base de données d’emails.
  2. Vous ne spammerez pas votre boîte de récéption d’emails de test.
  3. Votre domaine ne sera pas mis sur liste noire pour spam.

Un serveur SMTP de test imite le travail d’un serveur web tiers réel. Dans les exemples suivants, j’utiliserai l’Email Testing de Mailtrap, qui permet aux développeurs de capturer le trafic SMTP depuis le staging et d’inspecter et de déboguer les emails avant qu’ils ne soient réellement envoyés aux destinataires.

En plus de cela, l’Email Testing peut aider à valider votre HTML/CSS, analyser le contenu de l’email, prévisualiser le `txt` et le contenu, et donner un score de spam pertinent. L’outil est facile à configurer ; tout ce que vous avez à faire est de copier les informations d’identification générées par l’application et de les coller dans votre code.

Note : Je couvrirai les méthodes SMTP et API séparément. Et si vous voulez un tutoriel approfondi sur les tests avec Python, consultez cet article.

SMTP

Allez sur Mailtrap, sélectionnez Email Testing, puis My Inbox. Sous l’onglet SMTP Settings, cliquez sur “Afficher les informations d’identification” pour révéler les informations d’identification de test.

Voici à quoi cela ressemble en pratique :

import smtplib
port = 2525 
smtp_server = "sandbox.smtp.mailtrap.io"
login = "1b2c3d4e5d66f" # votre identifiant généré par Mailtrap
password = "1b2c3d4e5d66f" # votre mot de passe généré par Mailtrap

Mailtrap simplifie encore les choses. Allez dans la section Integrations dans l’onglet SMTP Settings et obtenez le modèle prêt à l’emploi du message texte simple grâce à vos informations d’identification Mailtrap.

Note importante : Les extraits utilisent des informations d’identification fictives pour des raisons de sécurité, assurez-vous de copier-coller vos vraies informations d’identification dans le code.

L’option la plus basique pour instruire votre code Python sur qui envoie quoi à qui est la méthode d’instance sendmail(), que j’utiliserai ici. Mais nous avons également des intégrations exemplaires pour Django et Flask.

Regardons de plus près l’exemple et ajoutons une gestion des erreurs (voir les #explications entre les lignes). Pour capturer les erreurs, nous utilisons les blocs try et except. Référez-vous à la documentation pour la liste des exceptions ici.

# la première étape est toujours la même : importer tous les composants nécessaires :
import smtplib
from socket import gaierror

# maintenant, vous pouvez jouer avec votre code. Définissons le serveur SMTP séparément ici :
port = 2525 
smtp_server = "sandbox.smtp.mailtrap.io"
login = "1b2c3d4e5d66f" # collez votre identifiant généré par Mailtrap
password = "1b2c3d4e5d66f" # collez votre mot de passe généré par Mailtrap
# spécifiez les adresses email de l'expéditeur et du destinataire
sender = "de@exemple.com"
receiver = "mailtrap@exemple.com"
# tapez votre message : utilisez deux nouvelles lignes (\n) pour séparer l’objet du corps du message, et utilisez 'f' pour insérer automatiquement des variables dans le texte
message = f"""\
Subject: Bonjour Mailtrap
To: {receiver}
From: {sender}

Ceci est mon premier message avec Python."""

try:
    # envoyez votre message avec les informations d'identification spécifiées ci-dessus
    with smtplib.SMTP(smtp_server, port) as server:
        server.login(login, password)
        server.sendmail(sender, receiver, message)
    # indiquez au script de vous informer si votre message a été envoyé ou les erreurs qui doivent être corrigées
    print('Envoyé')
except (gaierror, ConnectionRefusedError):
    print('Échec de la connexion au serveur. Mauvais paramètres de connexion ?')
except smtplib.SMTPServerDisconnected:
    print('Échec de la connexion au serveur. Mauvais identifiant/mot de passe ?')
except smtplib.SMTPException as e:
    print('Une erreur SMTP s\'est produite : ' + str(e))

Une fois que vous obtenez le résultat “Envoyé” dans Shell, vous devriez voir votre message dans votre boîte de réception Mailtrap :

Si vous préférez travailler dans l’environnement local, le serveur de débogage SMTP local peut être une option. À cette fin, Python propose un module smtpd. Il dispose d’une fonctionnalité DebuggingServer, qui rejettera les messages que vous envoyez et les imprimera dans stdout. Il est compatible avec tous les systèmes d’exploitation.

Définissez votre serveur SMTP sur localhost:1025

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

Pour exécuter un serveur de messagerie SMTP sur le port 25, vous aurez besoin des permissions root :

sudo python -m smtpd -n -c DebuggingServer localhost:25

Cela vous aidera à vérifier si votre code fonctionne et à identifier les problèmes potentiels. Cependant, cela ne vous permettra pas de vérifier à quoi ressemble votre modèle d’email HTML.

API

Vous pouvez consulter notre documentation API pour tous les détails sur les tests API. J’utiliserai Python 3 pour vous montrer la méthode, et vous guider étape par étape.

  1. Établissez une connexion avec l’endpoint API d’Email Testing de Mailtrap en utilisant http.client.HTTPSConnection.
  2. Définissez le contenu de votre email, y compris les destinataires (to, cc, bcc), l’expéditeur (from), l’objet, le contenu du texte et toute pièce jointe ou variable personnalisée sous forme de payload JSON.
  3. Faites une requête POST à l’API de Email Testing de Mailtrap avec votre payload et les en-têtes nécessaires, y compris votre jeton API pour l’autorisation. Voici un exemple :
import http.client
import json

def test_send_email():
    conn = http.client.HTTPSConnection("sandbox.api.mailtrap.io")
    
    payload = {
        "to": [{"email": "john_doe@exemple.com", "name": "John Doe"}],
        "cc": [{"email": "jane_doe@exemple.com", "name": "Jane Doe"}],
        "bcc": [{"email": "james_doe@exemple.com", "name": "Jim Doe"}],
        "from": {"email": "ventes@exemple.com", "name": "Exemple d’Équipe de vente"},
        "attachments": [
            {
                "content": "base64_encoded_content_here",
                "filename": "index.html",
                "type": "text/html",
                "disposition": "attachment"
            }
        ],
        "custom_variables": {"user_id": "45982", "batch_id": "PSJ-12"},
        "headers": {"X-Message-Source": "dev.mondomaine.com"},
        "subject": "Votre exemple de confirmation de commande",
        "text": "Félicitations pour votre commande n°1234",
        "category": "Test API"
    }

    headers = {
        'Content-Type': "application/json",
        'Accept': "application/json",
        'Api-Token': "votre_jeton_api_ici"  # Remplacez par votre vrai jeton API

    # Convertir le payload en chaîne JSON
    json_payload = json.dumps(payload)

    # Faire la requête POST
    conn.request("POST", "/api/send/inbox_id", json_payload, headers)  # Remplacez 'inbox_id' par votre véritable ID de boîte de réception

    # Obtenir la réponse
    response = conn.getresponse()
    data = response.read()

    print(data.decode("utf-8"))

if __name__ == "__main__":
    test_send_email()

Notes:

Prochaines étapes avec les emails en Python

J’ai démontré les options d’envoi d’emails avec Python pour décrire la logique et l’éventail de ses capacités. Mais je recommande de consulter la documentation de Python et de tester votre propre code pour obtenir de bons résultats !

Il existe de nombreux frameworks et bibliothèques Python qui rendent la création d’applications plus élégante et dédiée. De plus, certains d’entre eux peuvent améliorer votre expérience en termes de construction de fonctionnalités d’envoi d’emails :

Les frameworks les plus populaires sont :

  1. Flask, qui offre une interface simple pour l’envoi d’emails — Flask Mail. N’hésitez pas à en apprendre davantage dans notre guide sur comment envoyer des emails avec Flask.
  2. Django peut être une excellente option pour créer des modèles HTML. Consultez également notre tutoriel sur l’envoi d’emails avec Django.
  3. Zope est utile pour le développement de sites Web.
  4. Marrow Mailer est un framework dédié à la livraison d’emails, offrant diverses configurations utiles.
  5. Plotly et son Dash peuvent aider à envoyer des graphiques et des rapports par email.

Bonne chance, et n’oubliez pas de rester prudent lorsque vous envoyez vos emails !

Quitter la version mobile