0% ont trouvé ce document utile (0 vote)
1 vues13 pages

Guide Python Smtplib

Le document traite du module smtplib en Python, qui permet d'interagir avec des serveurs de messagerie via le protocole SMTP. Il décrit l'architecture du module, les classes disponibles, les méthodes d'envoi de messages, ainsi que des exemples pratiques d'implémentation. L'analyse comparative des paradigmes d'envoi met en lumière les avantages et inconvénients de smtplib par rapport à d'autres solutions comme les API HTTP et les appels CLI.

Transféré par

jordanbh2103
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
1 vues13 pages

Guide Python Smtplib

Le document traite du module smtplib en Python, qui permet d'interagir avec des serveurs de messagerie via le protocole SMTP. Il décrit l'architecture du module, les classes disponibles, les méthodes d'envoi de messages, ainsi que des exemples pratiques d'implémentation. L'analyse comparative des paradigmes d'envoi met en lumière les avantages et inconvénients de smtplib par rapport à d'autres solutions comme les API HTTP et les appels CLI.

Transféré par

jordanbh2103
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Tab 1

Traité technique du module smtplib en


Python : Architecture des protocoles de
messagerie, sécurité des transports et
ingénierie logicielle
Le transfert des courriers électroniques sur les réseaux IP repose historiquement sur le
protocole SMTP (Simple Mail Transfer Protocol) et ses extensions ESMTP (Extended SMTP).
Au sein de l'écosystème Python, le module standard smtplib propose une abstraction de bas
niveau de type client, facilitant les interactions bidirectionnelles avec les serveurs de
messagerie distants.
L'intégration d'une telle bibliothèque dans des applications d'entreprise exige une
compréhension approfondie de ses composants architecturaux, de la négociation des couches
de sécurité et des alternatives de transport modernes.

Architecture réseau et classes fondamentales du


module
La bibliothèque standard smtplib encapsule les sockets de communication TCP et fournit des
interfaces dédiées pour chaque variante du protocole de transfert de courriers. Le choix de la
classe d'initialisation dépend des exigences de sécurité de l'infrastructure cible.
Classe de Port standard Mécanisme de Type de transport Portabilité et
connexion sécurité initial réseau sockets
spécifiques
[Link] 25 ou 587 Connexion initiale Socket TCP IPv4 Liaison d'interface
en clair (mise à ou IPv6 standard possible via le
niveau facultative paramètre
via STARTTLS) source_address.
smtplib.SMTP_SS 465 Chiffrement Socket sécurisé Utilisation
L SSL/TLS implicite via la bibliothèque recommandée du
dès la poignée de système OpenSSL paramètre context
main initiale pour configurer un
objet SSLContext
personnalisé.
[Link] Spécifique Aucun chiffrement Sockets réseau ou Activation des
initial (transfert sockets de sockets Unix lors
réseau local domaine Unix de la transmission
sécurisé) locaux d'un chemin
d'accès absolu
commençant par
un caractère /.
L'instanciation de l'objet principal SMTP s'exécute selon une signature de méthode offrant un
contrôle granulaire sur les interfaces réseau :
SMTP(host='', port=0,
loc[span_10](start_span)[span_10](end_span)al_hostname=None, [timeout,
]source_address=None)​

Le paramètre local_hostname définit l'identité (FQDN) transmise lors des salutations HELO ou
EHLO. En l'absence de valeur explicite, le module interroge le système d'exploitation par le
biais de la fonction [Link](). Si la résolution échoue, le client utilise une adresse
d'interface locale entre crochets.
Le paramètre source_address accepte un tuple composé d'une adresse hôte et d'un port,
contraignant le socket sortant à se lier à une carte réseau spécifique, une option indispensable
pour la conformité avec les enregistrements SPF (Sender Policy Framework) lors d'un
déploiement sur un serveur multi-hébergé.
Il convient de noter que depuis la publication de Python 3.12, les anciens paramètres dépréciés
keyfile et certfile ont été supprimés de la classe SMTP_SSL, imposant l'usage exclusif du
paramètre context pour toute configuration avancée des clés de chiffrement.

Évaluation comparative des paradigmes d'envoi en


Python
L'ingénierie applicative moderne confronte l'usage classique de smtplib à d'autres architectures
de transport, notamment les API HTTP REST propriétaires et les appels de sous-processus par
interface de ligne de commande (CLI).
Indicateur de Module standard API de services tiers Appels CLI
performance smtplib (ex. Gmail API) (Subprocess)
Temps moyen de Environ 5 minutes Environ 20 minutes Environ 2 minutes
configuration
Mécanisme Mot de passe Protocole d'autorisation Clé d'API ou jeton
d'authentification d'application ou OAuth 2.0 complet d'accès encapsulé
d'administration
Dépendances Aucune (Inclus dans la Plusieurs packages Binaire ou client CLI
logicielles bibliothèque standard tiers requis (ex. SDK externe installé sur
Python) Google) l'hôte
Complexité de Faible à moyenne Élevée (Mises à jour Très faible (Abstraction
maintenance (Nécessite la gestion fréquentes des totale des protocoles
des sockets et du bibliothèques et des réseau)
protocole) jetons d'accès)
La pertinence d'une méthode dépend des contraintes d'infrastructure et du niveau de résilience
attendu pour l'application en cours de développement.
Contexte d'intégration système Choix d'implémentation Fondement technique et
recommandé architectural
Script à usage unique ou Module standard smtplib Solution légère, sans aucune
tâche de maintenance simple dépendance externe,
nécessitant moins de quinze
lignes de code.
Application de production API native (ex. Gmail API) Gestion native des flux OAuth
ciblant un unique fournisseur 2.0 avec renouvellement
Contexte d'intégration système Choix d'implémentation Fondement technique et
recommandé architectural
automatique des jetons
d'accès, supprimant le besoin
de stocker des mots de passe
d'application statiques.
Conteneurs légers et Interface de ligne de Idéal lorsque les règles de
pipelines de déploiement commande (CLI via sécurité réseau bloquent les
(CI/CD) subprocess) ports sortants standards (25,
465, 587). Les requêtes
s'exécutent via des flux HTTPS
standards sur le port 443.
Automatisation Interface CLI ou protocole MCP Uniformise l'envoi de messages
multi-fournisseurs ou agents (Model Context Protocol) vers plusieurs services de
d'intelligence artificielle messagerie sans nécessiter
l'écriture de code de transport
spécifique.
Cycle de vie d'une transaction SMTP et protocole
d'échange
Le transfert d'un courriel via smtplib s'articule autour d'un protocole transactionnel rigoureux. Le
client initie, configure, sécurise et ferme la liaison à l'aide d'une série de commandes
spécifiques.
# Représentation du cycle transactionnel d'une session SMTP standard​

Établissement de la liaison et salutations


La connexion physique s'ouvre par l'entremise de la méthode connect(host, port). Cette
dernière retourne un tuple constitué du code de réponse numérique renvoyé par le serveur
(généralement 220) et de son message de salutation. C'est à ce stade qu'un événement d'audit
système [Link] est levé.
L'identification du client s'effectue ensuite via la méthode ehlo(name='') (ou helo() si le serveur
cible ne supporte pas l'extension ESMTP). La méthode
ehlo_or_helo_if_needed([span_16](start_span)[span_16](end_span)) est utile dans ce contexte
: elle vérifie de manière autonome l'état de la session et envoie la commande appropriée
uniquement si aucune salutation n'a été enregistrée auparavant.
L'exécution de ehlo() peuple plusieurs variables d'état internes au client SMTP :
●​ ehlo_resp : Conserve la réponse brute du serveur de messagerie.
●​ does_esmtp : Variable booléenne qui bascule à True si le serveur accepte les extensions
ESMTP.
●​ esmtp_fea[span_18](start_span)[span_18](end_span)tures : Dictionnaire contenant les
extensions documentées par le serveur, telles que la taille limite des messages ou les
méthodes d'authentification autorisées.
Sécurisation opportuniste et vérification
Sur les liaisons initiées sur le port 587, le chiffrement s'établit de manière dynamique à l'aide de
la méthode starttls(). Le client vérifie la présence de cette extension dans le dictionnaire
esmtp_features via l'appel has_extn('starttls').
Une fois la commande starttls acceptée par le serveur distant, le socket TCP d'origine est
encapsulé dans une couche SSL. Cette modification d'état invalide les anciennes capacités
ESMTP négociées en clair, obligeant le client à émettre une nouvelle commande ehlo() afin de
s'identifier à l'intérieur du canal chiffré avant toute tentative d'authentification.
# Exemple d'appel bas
[span_50](start_span)[span_50](end_span)[span_53](start_span)[span_53]
(end_span)niveau via l'interrogation générique​
code, message = [Link]("VRFY", "utilisateur@[Link]")​

La méthode docmd(cmd, args='') permet d'envoyer des commandes brutes au serveur et de


récupérer un tuple contenant le code de statut et le message associé.
Il est également possible de tester l'existence d'une boîte aux lettres distante grâce à la
méthode verify(address) (qui s'appuie sur la commande SMTP VRFY). Un retour de code
250[span_20](start_span)[span_20](end_span) valide la présence de l'adresse. Toutefois, la
majorité des serveurs de messagerie modernes désactivent ou altèrent délibérément le
comportement de cette commande afin d'empêcher les spammeurs de collecter des adresses
valides.
## Construction de messages : sendmail contre send_message
La transmission effective des données de messagerie s'effectue via deux paradigmes distincts
au sein du module smtplib.

La méthode historique sendmail


La commande sendmail(from_addr, to_addrs, msg, mail_options=(), rcpt_options=()) interagit
directement avec l'enveloppe de transport. Le paramètre msg doit consister en une chaîne de
caractères brute ou en un flux d'octets respectant scrupuleusement la structure imposée par la
norme RFC 2882. Le client SMTP ne réalise aucune modification des en-têtes présents dans la
charge utile.
Cette séparation entre l'enveloppe réseau et les en-têtes logiques offre une grande flexibilité
opérationnelle. Par exemple, pour envoyer une copie carbone invisible (BCC), il suffit d'inclure
l'adresse du destinataire caché dans l'argument to_addrs de la méthode sendmail, tout en
omettant cette adresse des en-têtes To ou Cc du message textuel transmis.

La méthode moderne send_message


La méthode send_message(msg, from_addr=None, to_addrs=None, mail_options=(),
rcpt_options=()) prend en charge un objet conforme à l'API [Link] de
Python. Elle simplifie grandement le processus d'envoi en automatisant plusieurs tâches
fastidieuses :
●​ Elle extrait automatiquement les adresses d'expédition et de réception à partir des
en-têtes du message si les paramètres from_addr et to_addrs ne sont pas renseignés.
●​ Elle gère la sérialisation de l'objet message en un flux d'octets à l'aide de la classe
système BytesGenerator.
●​ Elle supprime automatiquement les en-têtes de confidentialité critiques, tels que Bcc et
[span_27](start_span)[span_27](end_span)Resent-Bcc, de la charge utile transmise au
serveur de messagerie, évitant ainsi la divulgation involontaire de ces informations aux
autres destinataires du message.

Exemples pratiques d'implémentation


Les cas d'usage suivants illustrent différentes stratégies de mise en œuvre, allant des
approches standards de la bibliothèque Python aux solutions tierces simplifiées.

Exemple 1 : Transmission de texte brut avec STARTTLS (Port 587)


L'implémentation suivante applique les meilleures pratiques industrielles en utilisant des
gestionnaires de contexte pour garantir la bonne fermeture de la session, tout en chargeant les
identifiants d'accès depuis les variables d'environnement du système.
import os​
import smtplib​
from [Link] import EmailMessage​

def acheminer_message_standard():​
# Récupération sécurisée des paramètres d'accès réseau​
hote_smtp = [Link]("SMTP_HOST",
"[Link]")[span_102](start_span)[span_102](end_span)​
port_smtp = int([Link]("SMTP_PORT",
"587"))[span_103](start_span)[span_103](end_span)​
compte_utilisateur =
[Link]("SMTP_USER")[span_104](start_span)[span_104](end_span)​
secret_connexion =
[Link]("SMTP_PASS")[span_105](start_span)[span_105](end_span)​

# Construction du message à l'aide de l'interface moderne
EmailMessage​
courriel =
EmailMessage()[span_108](start_span)[span_108](end_span)[span_109](sta
rt_span)[span_109](end_span)​
courriel["Subject"] = "Rapport technique d'exécution"​
courriel["From"] = "superviseur@[Link]"​
courriel[span_106](start_span)[span_106](end_span)["To"] =
"administrateur@[Link]"​
courriel[span_107](start_span)[span_107](end_span).set_content(​
"L'exécution du traitement de
d[span_79](start_span)[span_79](end_span)onnées s'est achevée
correctement.\n"​
"Aucune anomalie n'a été détectée par le superviseur système."​
)​

# Établissement de la session avec gestion de contexte​
try:​
with [Link](hote_smtp, port_smtp) as client:​
# Salutation initiale pour découvrir les
capacités[span_80](start_span)[span_80](end_span) du serveur​

[Link]()[span_110](start_span)[span_110](end_span)[span_112](star
t_span)[span_112](end_span)​

# Élévation sécurisée si l'extension STARTTLS est
disponible​
if client.has_extn("STARTTLS"):​

[Link]()[span_111](start_span)[span_111](end_span)[span_113](
start_span)[span_113](end_span)​
# Obligation de répéter les salutations après
le[span_97](start_span)[span_97](end_span) chiffrement​

[Link]()[span_114](start_span)[span_114](end_span)[span_115](star
t_span)[span_115](end_span)​

# Authentification et transmission du message​
[Link](compte_utilisateur,
secret_conn[span_31](start_span)[span_31](end_span)exion)​
client.send_message(courriel)​

print("La transmission du message s'est
déroulée[span_99](start_span)[span_99](end_span)[span_101](start_span)
[span_101](end_span) avec succès.")​
except [Link] as anomalie:​
print(f"Échec de l'opération de transport : {anomalie}")​

if __name__ == "__main__":​
acheminer_message_standard()​

Exemple 2 : Message HTML multipart avec pièce jointe (Port 465)


Cet exemple illustre la construction d'un message complexe contenant une alternative textuelle
de secours, un corps enrichi en HTML, ainsi qu'une pièce jointe au format PDF.
import os​
import smtplib​
import mimetypes​
fro[span_32](start_span)[span_32](end_span)m [Link] import
EmailMessage​

def acheminer_message_enrichi():​
hote_smtp = [Link]("SMTP_HOST", "[Link]")​
[span_33](start_span)[span_33](end_span) port_smtp =
int([Link]("SMTP_PORT", "465"))​
compte_utilisateur = [Link]("SMTP_USER")​
secret_connexion = [Link]("SMTP_PASS")​

courriel =
EmailMessage()[span_119](start_span)[span_119](end_span)[span_122](sta
rt_span)[span_122](end_span)​
courriel["Subject"] = "Synthèse d'activité
hebdomadaire"[span_120](start_span)[span_120](end_span)[span_123](star
t_span)[span_123](end_span)​
courriel["From"] =
"analyse@[Link]"[span_125](start_span)[span_125](end_span)​
courriel["To"] =
"direction@[Link]"[span_126](start_span)[span_126](end_span)​

# Définition de l'alternative de secours en texte brut​
courriel.set_content(​
"Veuillez prendre connaissance du rapport consolidé
ci-joint.\n"​
"Si ce texte s'affiche, votre client ne supporte pas le format
HTML."​
)[span_127](start_span)[span_127](end_span)​

# Ajout du corps de message structuré au format HTML​
structure_html = """​
<html>​
<body style="font-family: Calibri, sans-serif; line-height: 1.5;
color: #2C3E50;">​
<h2 style="color: #2980B9;">Indicateurs Clés de
Performance</h2>​
<p>Les indicateurs de la semaine ont été compilés et intégrés
au rapport PDF joint.</p>​
<p style="background-color: #F8F9F9; padding: 10px;
border-left: 4px solid #2980B9;">​
<strong>Note :</strong> Ce document contient des
informations confidentielles destinées à la direction.​
</p>​
</body>​
</html>​
"""​
courriel.add_alternative(structure_html,
subtype="html")[span_129](start_span)[span_129](end_span)​

# Chargement et liaison de la pièce jointe​
document_path =
"[Link]"[span_131](start_span)[span_131](end_span)[span_134](sta
rt_span)[span_134](end_span)​
if [Link](document_path):​
# Détermination
[span_128](start_span)[span_128](end_span)dynamique du type de contenu
MIME​
type_contenu, _ =
mimetypes.guess_type(document_path)[span_137](start_span)[span_137](en
d_span)​
if type_contenu is None:​
type_contenu =
"application/octet-stream"[span_139](start_span)[span_139](end_span)​

categorie_principale, sous_categorie = type_contenu.split("/",
1)​

w[span_138](start_span)[span_138](end_span)ith
open(document_path, "rb") as flux_fichier:​
donnees_binaires =
f[span_132](start_span)[span_132](end_span)[span_135](start_span)[span
_135](end_span)lux_fichier.read()​

courriel.add_attachm[span_133](start_span)[span_133](end_span)[span_13
6](start_span)[span_136](end_span)ent(​
donnees_binaires,​
maintype=categorie_principale,​
subtype=sous_categorie,​
filename=[Link](document_path)​
)​

# Transmission via connexion SSL/TLS implicite dès le départ​
try:​
with smtplib.SMTP_SSL(hote_smtp,
p[span_121](start_span)[span_121](end_span)[span_124](start_span)[span
_124](end_span)ort_smtp) as
client_ssl:[span_140](start_span)[span_140](end_span)[span_141](start_
span)[span_141](end_span)​
client_ssl.login(compte_utilisateur,
secret_connexion)[span_142](start_span)[span_142](end_span)[span_143](
start_span)[span_143](end_span)​
client_ssl.send_message(courriel)​
print("Le message multipart a été transmis de manière
sécurisée.")​
except
[Link][span_130](start_span)[span_130](end_span)n as
anomalie:​
print(f"Erreur lors de la transmission SSL : {anomalie}")​

if __name__ == "__main__":​
acheminer_message_enrichi()​
Exemple 3 : Simplification de l'implémentation via yagmail
Pour les projets dont les contraintes imposent une réduction drastique de la taille du code
source, l'utilisation de bibliothèques tierces comme yagmail permet de simplifier grandement la
création de messages complexes. Celle-ci automatise l'analyse des pièces jointes et la
génération des structures de données MIME complexes :
import yagmail[span_146](start_span)[span_146](end_span)​

def acheminer_via_yagmail():​
# Initialisation simplifiée du client​
client_yag = [Link]("utilisateur@[Link]",
"mot_de_passe_application")[span_147](start_span)[span_147](end_span)​

# Définition des contenus mélangés (texte, liens et chemins de
fichiers)​
[span_34](start_span)[span_34](end_span) elements_message = [​
"Bonjour, veuillez examiner les fichiers d'analyse
ci-dessous.",​
"Consulter la documentation complète :
[Link]
"/chemins/locaux/donnees_analyse.txt"​
][span_148](start_span)[span_148](end_span)​

# Envoi direct avec construction MIME implicite​
client_yag.send("destinataire@[Link]", "Rapport simplifié",
elements_message)[span_149](start_span)[span_149](end_span)​

if __name__ == "__main__":​
acheminer_via_yagmail()​

Résolution des incidents et gestion des exceptions


Le développement d'applications de messagerie robustes nécessite une gestion rigoureuse des
erreurs réseau. Le module smtplib expose une hiérarchie d'exceptions précises pour faciliter le
diagnostic et la résolution des incidents.
Classe d'exception Attributs spécifiques Cause opérationnelle Solution technique et
classique correction
SMTPConnectError Aucun Impossible d'établir la Vérifier la configuration
connexion TCP initiale du pare-feu, l'adresse
sur le port spécifié. de l'hôte et s'assurer
que le port cible n'est
pas bloqué par le
fournisseur
d'infrastructure réseau.
Classe d'exception Attributs spécifiques Cause opérationnelle Solution technique et
classique correction
SMTPServerDisconnec Aucun Le serveur a fermé le S'assurer que le port
ted socket de manière est correct (le port 587
inopinée, ou le client requiert STARTTLS,
tente d'interagir avec tandis que le port 465
une session non nécessite une
connectée. connexion SSL
d'emblée).
SMTPAuthenticationErr smtp_code Les identifiants fournis Vérifier les identifiants
or (généralement 535), ont été rejetés par le de connexion. Si le
smtp_error serveur distant. fournisseur impose une
authentification
multifacteur, générer et
utiliser un mot de passe
d'application dédié.
SMTPSenderRefused sender (chaîne de Le serveur de S'assurer que l'adresse
caractères contenant messagerie refuse d'expédition est
l'adresse refusée) l'adresse de autorisée pour le
l'expéditeur spécifiée compte connecté et
dans l'enveloppe. qu'elle respecte les
politiques de sécurité
(SPF/DKIM) de
l'organisation.
SMTPRecipientsRefus recipients (dictionnaire L'ensemble des Valider la syntaxe des
ed contenant les erreurs adresses de destination adresses de destination
par destinataire) spécifiées ont été ou vérifier si elles n'ont
rejetées par le serveur. pas été bloquées par
les règles antispam du
serveur de réception.
SMTPDataError smtp_code, smtp_error Le contenu du Vérifier que la taille
message (corps ou totale du message ne
pièces jointes) a été dépasse pas la limite
rejeté par le serveur. autorisée par le serveur
et s'assurer que le
contenu n'est pas
bloqué par les filtres
antispam.
La gestion des erreurs doit être structurée afin d'intercepter les exceptions de manière
ordonnée, en allant du cas le plus spécifique au plus général :
import smtplib​

try:​
with [Link]("[Link]", 587) as serveur:​
[Link]("utilisateur", "mot_de_passe")​
# Tentative de transmission...​
except [Link] as erreur_auth:​
# Traitement spécifique d'une erreur d'authentification (ex:
renouveler les clés d'accès)​
print(f"Échec de l'authentification ({erreur_auth.smtp_code}) :
{erreur_auth.smtp_error}")​
except [Link] as erreur_recipients:​
# Traitement d'un refus de destinataire​
print(f"Destinataires refusés : {erreur_recipients.recipients}")​
except [Link] as erreur_generique:​

#[span_159](start_span)[span_159](end_span)[span_167](start_span)[span
_167](end_span) Traitement des autres anomalies SMTP​
print(f"Une erreur protocolaire SMTP est survenue :
{erreur_generique}")​
except OSError as erreur_reseau:​
# Traitement des coupures réseau ou erreurs de socket système​
print(f"Erreur de connexion physique : {erreur_reseau}")​

Concurrence et performances : Le paradigme


asynchrone
La bibliothèque standard smtplib repose sur un modèle d'exécution synchrone et bloquant. Lors
de l'envoi de messages volumineux ou de campagnes d'envoi en masse, le thread d'exécution
principal reste bloqué en attente des réponses du serveur de messagerie distant. Pour
maintenir de bonnes performances dans les applications Web modernes à haut débit, il est
préférable d'adopter un modèle d'exécution asynchrone.
Le package tiers aiosmtplib propose une réécriture asynchrone complète du protocole SMTP,
parfaitement compatible avec le framework natif asyncio de Python.
import asyncio​
from [Link] import EmailMessage​
import aiosmtplib​

async def
acheminer_message_asynchron[span_178](start_span)[span_178](end_span)e
():​
# Construction du message à envoyer​
[span_40](start_span)[span_40](end_span) message =
EmailMessage()[span_186](start_span)[span_186](end_span)[span_192](sta
rt_span)[span_192](end_span)​
message["From"] =
"expediteur@[Link]"[span_187](start_span)[span_187](end_span)[spa
n_193](start_span)[span_193](end_span)​
message["To"] =
"destinataire@[Link]"[span_188](start_span)[span_188](end_span)[s
pan_194](start_span)[span_194](end_span)​
message["Subject"] =
"Notif[span_41](start_span)[span_41](end_span)ication de traitement
non
bloquant"[span_189](start_span)[span_189](end_span)[span_195](start_sp
an)[span_195](end_span)​
message.set_content("Message envoyé de manière asynchrone à l'aide
d'aiosmtplib.")[span_190](start_span)[span_190](end_span)[span_196](st
art_span)[span_196](end_span)​

# Configuration de la connexion asynchrone​
configuration = {​
"hostname": "[Link]",​
"port": 587,​
"use_tls": False, # Connexion initiale en clair (STARTTLS par
défaut)[span_198](start_span)[span_198](end_span)​
"start_tls": True # Permet la mise à niveau sécurisée
automatique[span_199](start_span)[span_199](end_span)​
}​

try:​
# Utilisation du gestionnaire de contexte asynchrone pour
l'ouverture et la fermeture non bloquantes du socket​
async with [Link](**configuration) as client_async:​
await client_async.login("identifiant", "mot_de_passe")​
# Envoi du message via une coroutine non bloquante​
[span_179](start_span)[span_179](end_span) await
client_async.send_message(message)​
print("Le courriel a été transmis avec succès par le client
asynchrone.")​
except [Link] as
anomalie_async[span_180](start_span)[span_180](end_span):​
print(f"Erreur lors du traitement asynchrone :
{anomalie_async}")​

if __name__ == "__main__":​
# Démarrage de la boucle d'événements asynchrone​
[Link](acheminer_message_asynchrone())​

L'implémentation asynchrone permet à l'application de continuer à traiter d'autres tâches


(comme répondre à des requêtes HTTP ou mettre à jour une base de données) pendant que
les données du message sont transmises sur le réseau. Cela améliore considérablement la
réactivité et la capacité de montée en charge globale du système.

Vous aimerez peut-être aussi