Envoi de messages électroniques¶
Même si avec le module smtplib
de Python, il est relativement simple d’envoyer des courriels, Django propose quelques adaptateur légers supplémentaires. Ces adaptateurs sont fournis pour rendre encore plus direct l’envoi de courriels, pour faciliter le test d’envoi de courriels durant le développement et pour fournir la prise en charge sur les plates-formes qui ne peuvent pas utiliser SMTP.
Le code se trouve dans le module django.core.mail
.
Exemple rapide¶
En deux lignes :
from django.core.mail import send_mail
send_mail(
'Subject here',
'Here is the message.',
'from@example.com',
['to@example.com'],
fail_silently=False,
)
Les messages sont envoyés en utilisant l’hôte et le port indiqués dans les réglages EMAIL_HOST
et EMAIL_PORT
. Les réglages EMAIL_HOST_USER
et EMAIL_HOST_PASSWORD
, si définis, sont utilisés pour s’authentifier auprès du serveur SMTP, et les réglages EMAIL_USE_TLS
et EMAIL_USE_SSL
indiquent si l’utilisation d’une connexion sécurisée est nécessaire.
Note
Le jeu de caractères des messages envoyés par django.core.mail
est défini par la valeur du réglage DEFAULT_CHARSET
.
send_mail()
¶
-
send_mail
(subject, message, from_email, recipient_list, fail_silently=False, auth_user=None, auth_password=None, connection=None, html_message=None)[source]¶
La façon la plus simple d’envoyer des courriels est d’utiliser django.core.mail.send_mail()
.
Les paramètres subject
, message
, from_email
et recipient_list
sont obligatoires.
subject
: une chaîne de caractères.message
: une chaîne de caractères.from_email
: une chaîne de caractères.recipient_list
: une liste de chaînes de caractères, chacune étant une adresse électronique. Chaque personne dansrecipient_list
verra les autres destinataires dans le champ « To: » du courriel.fail_silently
: une valeur booléenne. Avec la valeurFalse
,send_mail
lève une exceptionsmtplib.SMTPException
en cas d’erreur. Consultez la liste des exceptions possibles dans la documentation desmtplib
; elles sont toutes des sous-classes deSMTPException
.auth_user
: le nom d’utilisateur facultatif utilisé pour s’authentifier auprès du serveur SMTP. Si ce paramètre est absent, c’est la valeur du réglageEMAIL_HOST_USER
qui sera utilisée.auth_password
: le mot de passe facultatif utilisé pour s’authentifier auprès du serveur SMTP. Si ce paramètre est absent, c’est la valeur du réglageEMAIL_HOST_PASSWORD
qui sera utilisée.connection
: le moteur de messagerie facultatif utilisé pour envoyer le message. Si ce paramètre est absent, c’est une instance du moteur par défaut qui sera utilisée. Consultez la documentation sur les moteurs de messagerie pour plus de détails.html_message
: sihtml_message
est indiqué, le courriel produit sera un courriel multipart/alternative, avecmessage
comme type de contenu text/plain ethtml_message
comme type de contenu text/html .
La valeur renvoyée correspond au nombre de messages livrés avec succès (qui ne peut être que 0
ou 1
puisqu’elle ne peut envoyer qu’un message).
send_mass_mail()
¶
-
send_mass_mail
(datatuple, fail_silently=False, auth_user=None, auth_password=None, connection=None)[source]¶
django.core.mail.send_mass_mail()
est prévu pour envoyer des courriels en masse.
datatuple
est un tuple dans lequel chaque élément suit le format suivant :
(subject, message, from_email, recipient_list)
fail_silently
, auth_user
et auth_password
jouent le même rôle que dans send_mail()
.
Chaque élément de datatuple
produit un courriel séparé. Comme dans send_mail()
, les destinataires de la même recipient_list
verront les autres adresses dans le champ « To: » des courriels.
Par exemple, le code suivant envoie deux messages différents à deux ensembles différents de destinataires ; cependant, une seule connexion est ouverte vers le serveur de messagerie :
message1 = ('Subject here', 'Here is the message', 'from@example.com', ['first@example.com', 'other@example.com'])
message2 = ('Another Subject', 'Here is another message', 'from@example.com', ['second@test.com'])
send_mass_mail((message1, message2), fail_silently=False)
La valeur renvoyée correspond au nombre de messages livrés avec succès.
send_mass_mail()
vs. send_mail()
¶
La différence principale entre send_mass_mail()
et send_mail()
est que send_mail()
ouvre une connexion vers le serveur de messagerie lors de chaque exécution, alors que send_mass_mail()
utilise une seule connexion pour tous ses messages. send_mass_mail()
est donc un peu plus efficace.
mail_admins()
¶
django.core.mail.mail_admins()
est un raccourci pour envoyer un courriel aux administrateurs du site, tels qu’ils apparaissent dans le réglage ADMINS
.
mail_admins()
préfixe le sujet avec la valeur du réglage EMAIL_SUBJECT_PREFIX
(« [Django] » par défaut).
L’en-tête « From: » du courriel correspond à la valeur du réglage SERVER_EMAIL
.
Cette méthode existe par commodité et pour une meilleure lisibilité.
Si html_message
est indiqué, le courriel produit sera un courriel multipart/alternative, avec message
comme type de contenu text/plain et html_message
comme type de contenu text/html .
mail_managers()
¶
django.core.mail.mail_managers()
est équivalent à mail_admins()
, excepté le fait qu’il envoie un courriel aux gestionnaires du site tels que définis dans le réglage MANAGERS
.
Exemples¶
Ceci envoie un courriel unique à john@example.com et jane@example.com, les deux apparaissant dans le champ « To: » :
send_mail(
'Subject',
'Message.',
'from@example.com',
['john@example.com', 'jane@example.com'],
)
Ceci envoie un courriel à john@example.com et jane@example.com, les deux recevant un courriel séparé :
datatuple = (
('Subject', 'Message.', 'from@example.com', ['john@example.com']),
('Subject', 'Message.', 'from@example.com', ['jane@example.com']),
)
send_mass_mail(datatuple)
Prévention de l’injection d’en-têtes¶
L”injection d’en-têtes est une faille de sécurité dans laquelle un attaquant insère des en-têtes de courriel supplémentaires pour contrôler les champs « To: » et « From: » des courriels que vos scripts produisent.
Les fonctions de messagerie de Django décrites ci-dessus protègent toutes contre l’injection d’en-têtes en interdisant les sauts de ligne dans les valeurs d’en-têtes. Si l’un des paramètres subject
, from_email
ou recipient_list
contient un saut de ligne (que ce soit du style Unix, Windows ou Mac), la fonction de messagerie (par ex. send_mail()
) lève une exception django.core.mail.BadHeaderError
(une sous-classe de ValueError
) et de ce fait, n’envoie pas le courriel. Il est de votre responsabilité de valider toutes les données avant de les transmettre aux fonctions de messagerie.
Si un message
contient des en-têtes en début de chaîne, les en-têtes seront simplement affichés en première partie du contenu du courriel.
Voici un exemple de vue qui récupère les valeurs subject
, message
et from_email
à partir de données POST de la requête, envoie cela à admin@example.com et redirige vers « /contact/thanks/ » quand c’est fait :
from django.core.mail import BadHeaderError, send_mail
from django.http import HttpResponse, HttpResponseRedirect
def send_email(request):
subject = request.POST.get('subject', '')
message = request.POST.get('message', '')
from_email = request.POST.get('from_email', '')
if subject and message and from_email:
try:
send_mail(subject, message, from_email, ['admin@example.com'])
except BadHeaderError:
return HttpResponse('Invalid header found.')
return HttpResponseRedirect('/contact/thanks/')
else:
# In reality we'd use a form class
# to get proper validation errors.
return HttpResponse('Make sure all fields are entered and valid.')
La classe EmailMessage
¶
Les fonctions send_mail()
et send_mass_mail()
de Django sont en réalité de légers adaptateurs qui utilisent la classe EmailMessage
.
Seule une partie des fonctionnalités de la classe EmailMessage
sont exposées par send_mail()
et les autres fonctions adaptatrices liées. Si vous voulez utiliser des fonctionnalités avancées, telles que les destinataires en copie cachée, les fichiers joints ou les courriels multi-parties, vous devrez créer directement des instances de EmailMessage
.
Note
Cette conception est volontaire. send_mail()
et les fonctions liées étaient au départ la seule interface proposée par Django. Cependant, la liste des paramètres acceptés ne cessait de s’accroître avec le temps. Il était donc logique de passer à un concept plus orienté objet pour les courriels et ne conserver les fonctions originales que par rétrocompatibilité.
EmailMessage
est responsable de créer le courriel lui-même. Le moteur de messagerie est ensuite responsable d’envoyer le courriel.
Par commodité, EmailMessage
propose une simple méthode send()
pour envoyer un courriel unique. Si vous devez envoyer plusieurs messages, l’API du moteur de messagerie offre une alternative.
Les objets EmailMessage
¶
La classe EmailMessage
est initialisée avec les paramètres suivants (dans l’ordre donné, si des paramètres positionnels sont utilisés). Tous les paramètres sont facultatifs et peuvent être définis à tout moment précédant l’appel à la méthode send()
.
subject
: la ligne sujet du courriel.body
: le texte du corps. Cela doit être un message texte brut.from_email
: l’adresse de l’expéditeur. Les deux formesfred@example.com
etFred <fred@example.com>
sont acceptées. Si le paramètre est absent, c’est le réglageDEFAULT_FROM_EMAIL
qui est utilisé.to
: une liste ou un tuple d’adresses de destination.bcc
: une liste ou un tuple d’adresses à placer dans l’en-tête « Bcc » au moment d’envoyer le courriel.connection
: une instance de moteur de messagerie. Utilisez ce paramètre si vous voulez utiliser la même connexion pour plusieurs messages. Si ce paramètre est absent, une nouvelle connexion est initiée lorsquesend()
est appelée.attachments
: une liste de pièces jointes à placer dans le message. Elles peuvent être soit des instances deMIMEBase
, soit des triplets(nom de fichier, contenu, type mime)
.headers
: un dictionnaire d’en-têtes à ajouter au message. Les clés sont les noms d’en-têtes, les valeurs sont les valeurs d’en-têtes. C’est à l’appelant de s’assurer que les noms et les valeurs d’en-têtes soient dans un format correct pour les courriels. L’attribut correspondant estextra_headers
.cc
: une liste ou un tuple d’adresses de destination utilisées dans l’en-tête « Cc » lors de l’envoi du courriel.reply_to
: une liste ou un tuple d’adresses de destination utilisées dans l’en-tête « reply_to » lors de l’envoi du courriel.
Par exemple :
from django.core.mail import EmailMessage
email = EmailMessage(
'Hello',
'Body goes here',
'from@example.com',
['to1@example.com', 'to2@example.com'],
['bcc@example.com'],
reply_to=['another@example.com'],
headers={'Message-ID': 'foo'},
)
La classe possède les méthodes suivantes :
send(fail_silently=False)
envoie le message. Si une connexion a été indiquée au moment où le courriel a été construit, c’est cette connexion qui sera utilisée. Sinon, c’est une instance du moteur par défaut qui sera utilisée. Si le paramètre nomméfail_silently
vautTrue
, les exceptions générées lors de l’envoi du message seront ignorées. Une liste de destinataires vide ne génère pas d’exception.message()
construit un objetdjango.core.mail.SafeMIMEText
(une sous-classe de la classe PythonMIMEText
) ou un objetdjango.core.mail.SafeMIMEMultipart
contenant le message à envoyer. S’il vous arrivait de devoir étendre la classeEmailMessage
, il sera probablement nécessaire de surcharger cette méthode pour pouvoir placer le contenu souhaité dans l’objet MIME.recipients()
renvoie une liste de tous les destinataires du message, quel que soit le champ où ils se trouvent (to
,cc
oubcc
). C’est aussi une méthode qu’il peut être utile de surcharger lors de l’écriture d’une sous-classe, car le serveur SMTP doit recevoir la liste complète des destinataires au moment de l’envoi du message. Si vous ajoutez une autre façon d’indiquer les destinataires dans votre classe, ceux-ci doivent aussi être renvoyés par cette méthode.attach()
crée une nouvelle pièce jointe et l’ajoute au message. Il y a deux façons d’appelerattach()
:Vous pouvez lui passer un seul paramètre qui est une instance de
MIMEBase
. Elle sera directement insérée dans le message résultant.Il est aussi possible de passer trois paramètres à
attach()
:filename
,content
etmimetype
.filename
est le nom de la pièce jointe tel qu’il apparaîtra dans le courriel,content
contient les données qui formeront la pièce jointe etmimetype
est le type MIME facultatif de la pièce jointe. Si vous omettezmimetype
, le type de contenu MIME sera déduit du nom de fichier de la pièce jointe.Par exemple :
message.attach('design.png', img_data, 'image/png')
Si vous indiquez
message/rfc822
commemimetype
, la méthode accepte aussi les classesdjango.core.mail.EmailMessage
etemail.message.Message
.Pour un
mimetype
commençant partext/
, le contenu attendu est une chaîne. Les données binaires sont décodées en utilisant UTF-8 et en cas d’échec, le type MIME sera transformé enapplication/octet-stream
et les données seront jointes telles quelles.De plus, les pièces jointes
message/rfc822
ne sont plus codées en base64, ce qui contrevient à la RFC 2046#section-5.2.1 et qui peut poser des problèmes d’affichage des pièces jointes dans Evolution et Thunderbird.
attach_file()
crée une nouvelle pièce jointe à partir d’un fichier du système de fichiers. Appelez-la avec le chemin du fichier à joindre et, facultativement, le type MIME à utiliser pour ce fichier. Si vous omettez le type MIME, il sera déduit du nom de fichier. L’utilisation la plus simple est :message.attach_file('/images/weather_map.png')
Pour les types MIME commençant par
text/
, les données binaires sont traitées comme pourattach()
.
Le repli sur le type MIME application/octet-stream
lorsque des données binaires d’une pièce jointe en text/*
ne peuvent être décodées a été ajouté.
Envoi d’autres types de contenus¶
Il peut être utile d’inclure plusieurs versions d’un contenu dans un courriel ; l’exemple classique est d’envoyer à la fois des versions texte brut et HTML d’un message. Avec la bibliothèque de messagerie de Django, vous pouvez le faire en utilisant la classe EmailMultiAlternatives
. Cette sous-classe de EmailMessage
possède une méthode attach_alternative()
pour inclure des versions supplémentaires du corps d’un message dans le courriel. Toutes les autres méthodes (y compris l’initialisation de la classe) sont directement héritées de EmailMessage
.
Pour envoyer une combinaison de texte et de HTML, vous pourriez écrire :
from django.core.mail import EmailMultiAlternatives
subject, from_email, to = 'hello', 'from@example.com', 'to@example.com'
text_content = 'This is an important message.'
html_content = '<p>This is an <strong>important</strong> message.</p>'
msg = EmailMultiAlternatives(subject, text_content, from_email, [to])
msg.attach_alternative(html_content, "text/html")
msg.send()
Par défaut, le type MIME du paramètre body
d’un EmailMessage
est "text/plain"
. Il est recommandé de le laisser tel quel, car il garantit que tout destinataire sera capable de lire le courriel, quel que soit son client de messagerie. Cependant, si vous savez que vos destinataires savent gérer un autre type de contenu, vous pouvez utiliser l’attribut content_subtype
de la classe EmailMessage
pour modifier le type de contenu principal. Le type primaire sera toujours "text"
, mais vous pouvez modifier le sous-type. Par exemple :
msg = EmailMessage(subject, html_content, from_email, [to])
msg.content_subtype = "html" # Main content is now text/html
msg.send()
Moteurs de messagerie¶
L’envoi réel d’un courriel est géré par le moteur de messagerie.
La classe du moteur de messagerie possède les méthodes suivantes :
open()
instancie une connexion persistante d’envoi de messages.close()
ferme la connexion actuelle vers le système d’envoi de messages.send_messages(email_messages)
envoie une liste d’objetsEmailMessage
. Si la connexion n’est pas ouverte, cet appel ouvrira implicitement la connexion, puis la fermera à la fin de l’opération. Si la connexion est déjà ouverte, elle sera conservée ouverte après l’envoi des messages.
Il peut aussi être utilisé comme gestionnaire de contexte, ce qui appellera automatiquement les méthodes open()
et close()
nécessaires :
from django.core import mail
with mail.get_connection() as connection:
mail.EmailMessage(
subject1, body1, from1, [to1],
connection=connection,
).send()
mail.EmailMessage(
subject2, body2, from2, [to2],
connection=connection,
).send()
Obtention d’une instance d’un moteur de messagerie¶
La fonction get_connection()
de django.core.mail
renvoie une instance utilisable du moteur de messagerie.
Par défaut, une appel à get_connection()
renvoie une instance du moteur de messagerie indiqué dans EMAIL_BACKEND
. Si vous indiquez le paramètre backend
, une instance de ce moteur sera créée.
Le paramètre fail_silently
contrôle la gestion d’erreurs dans le moteur. Si fail_silently
vaut True, les exceptions survenant durant le processus d’envoi de messages seront ignorées en silence.
Tous les autres paramètres sont directement transmis au constructeur du moteur de messagerie.
Django est livré avec plusieurs moteurs de messagerie. À l’exception du moteur SMTP (moteur par défaut), ces moteurs ne sont utiles que pour les tests et le développement. Si vous avez des contraintes particulières dans l’envoi de messages, vous pouvez écrire votre propre moteur de messagerie.
Le moteur SMTP¶
-
class
backends.smtp.
EmailBackend
(host=None, port=None, username=None, password=None, use_tls=None, fail_silently=False, use_ssl=None, timeout=None, ssl_keyfile=None, ssl_certfile=None, **kwargs)¶ C’est le moteur par défaut. Les courriels seront envoyés par un serveur SMTP.
La valeur de chaque paramètre est récupérée à partir du réglage correspondant si le paramètre vaut
None
:host
:EMAIL_HOST
port
:EMAIL_PORT
username
:EMAIL_HOST_USER
password
:EMAIL_HOST_PASSWORD
use_tls
:EMAIL_USE_TLS
use_ssl
:EMAIL_USE_SSL
timeout
:EMAIL_TIMEOUT
ssl_keyfile
:EMAIL_SSL_KEYFILE
ssl_certfile
:EMAIL_SSL_CERTFILE
Le moteur SMTP est la configuration par défaut héritée par Django. Si vous voulez la définir explicitement, mettez ce qui suit dans vos réglages :
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
Si elle n’est pas indiquée, la valeur par défaut de
timeout
correspondra à la valeur fournie parsocket.getdefaulttimeout()
dont la valeur par défaut estNone
(pas d’expiration).
Le moteur console¶
Au lieu d’envoyer vraiment des courriels, le moteur console ne fait qu’afficher sur la sortie standard les courriels qui auraient dû être envoyés. Par défaut, le moteur console écrit dans stdout
. Vous pouvez utiliser un autre objet de type flux en indiquant le paramètre stream
au moment de construire la connexion.
Pour utiliser ce moteur, mettez ce qui suit dans vos réglages :
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
Ce moteur n’est pas conçu pour être utilisé en production, il n’est fourni que par commodité et destiné à être utilisé durant le développement.
Le moteur fichier¶
Le moteur fichier écrit les courriels dans un fichier. Un nouveau fichier est créé pour chaque nouvelle session ouverte avec ce moteur. Le répertoire dans lequel les fichiers sont écrits correspond soit au réglage EMAIL_FILE_PATH
, soit au mot-clé file_path
transmis lors de la création de la connexion avec get_connection()
.
Pour utiliser ce moteur, mettez ce qui suit dans vos réglages :
EMAIL_BACKEND = 'django.core.mail.backends.filebased.EmailBackend'
EMAIL_FILE_PATH = '/tmp/app-messages' # change this to a proper location
Ce moteur n’est pas conçu pour être utilisé en production, il n’est fourni que par commodité et destiné à être utilisé durant le développement.
Le moteur mémoire¶
Le moteur 'locmem'
stocke les messages dans un attribut spécial du module django.core.mail
. L’attribut outbox
est créé au moment de l’envoi du premier message. C’est une liste contenant une instance de EmailMessage
pour chaque message qui aurait été envoyé.
Pour utiliser ce moteur, mettez ce qui suit dans vos réglages :
EMAIL_BACKEND = 'django.core.mail.backends.locmem.EmailBackend'
Ce moteur n’est pas conçu pour être utilisé en production, il n’est fourni que par commodité et destiné à être utilisé durant le développement et les tests.
Le moteur bidon¶
Comme son nom l’indique, le moteur bidon (« dummy ») ne fait rien des messages reçus. Pour définir ce moteur, mettez ce qui suit dans vos réglages :
EMAIL_BACKEND = 'django.core.mail.backends.dummy.EmailBackend'
Ce moteur n’est pas conçu pour être utilisé en production, il n’est fourni que par commodité et destiné à être utilisé durant le développement.
Définition d’un moteur de messagerie personnalisé¶
Si vous devez modifier la façon dont les courriels sont envoyés, vous pouvez écrire votre propre moteur de messagerie. Le réglage EMAIL_BACKEND
de votre fichier de réglages contiendra alors le chemin d’importation Python vers votre classe de moteur.
Les moteurs de messagerie personnalisés doivent hériter de BaseEmailBackend
qui se trouve dans le module django.core.mail.backends.base
. Un moteur de messagerie personnalisé doit implémenter la méthode send_messages(email_messages)
. Celle-ci reçoit une liste d’instances EmailMessage
et renvoie le nombre de message délivrés avec succès. Si votre moteur contient la notion de session ou connexion persistente, vous devriez aussi implémenter les méthodes open()
et close()
. Référez-vous à smtp.EmailBackend
pour une implémentation de référence.
Envoi de plusieurs courriels¶
L’établissement et la fermeture d’une connexion SMTP (ou de toute autre connexion réseau, en fait) est un processus coûteux. Si vous avez beaucoup de courriels à envoyer, il est logique de recycler une connexion SMTP plutôt que de créer puis détruire une connexion lors de chaque envoi de message.
Il existe deux manières d’indiquer à un moteur de messagerie qu’il doit réutiliser une connexion.
Premièrement, vous pouvez utiliser la méthode send_messages()
. Celle-ci accepte une liste d’instances EmailMessage
(ou de ses sous-classes) et les envoie tous en utilisant une même connexion.
Par exemple, si vous aviez une fonction appelée get_notification_email()
qui renvoie une liste d’objets EmailMessage
représentant des courriels que vous souhaitez envoyer périodiquement, vous pourriez envoyer ces courriels en utilisant un seul appel à send_messages
:
from django.core import mail
connection = mail.get_connection() # Use default email connection
messages = get_notification_email()
connection.send_messages(messages)
Dans cet exemple, l’appel à send_messages()
ouvre une connexion au moteur, envoie la liste des messages et ferme à nouveau la connexion.
La seconde approche est d’utiliser les méthodes open()
et close()
du moteur de messagerie pour contrôler manuellement la connexion. send_messages()
n’ouvre ou ne ferme pas manuellement de connexion si il y en a déjà une ouverte, ce qui fait qu’en ouvrant manuellement la connexion, vous contrôlez aussi quand elle sera fermée. Par exemple :
from django.core import mail
connection = mail.get_connection()
# Manually open the connection
connection.open()
# Construct an email message that uses the connection
email1 = mail.EmailMessage(
'Hello',
'Body goes here',
'from@example.com',
['to1@example.com'],
connection=connection,
)
email1.send() # Send the email
# Construct two more messages
email2 = mail.EmailMessage(
'Hello',
'Body goes here',
'from@example.com',
['to2@example.com'],
)
email3 = mail.EmailMessage(
'Hello',
'Body goes here',
'from@example.com',
['to3@example.com'],
)
# Send the two emails in a single call -
connection.send_messages([email2, email3])
# The connection was already open so send_messages() doesn't close it.
# We need to manually close the connection.
connection.close()
Configuration de la messagerie pour le développement¶
À certains moments, vous ne voulez absolument pas que que Django envoie des courriels. Par exemple, pendant le développement d’un site Web, vous ne voulez certainement pas envoyer des milliers de courriels, mais vous voulez peut-être valider que ces courriels seraient envoyés aux bonnes personnes et aux bonnes conditions, et que leur contenu est correct.
La manière la plus simple de configurer la messagerie électronique lors du développement local est d’utiliser le moteur de messagerie console. Ce moteur redirige tous les courriels vers la sortie standard stdout
, ce qui permet d’inspecter leur contenu.
Le moteur de messagerie fichier peut aussi être utile durant le développement ; ce moteur redirige le contenu de chaque connexion SMTP dans un fichier qui peut ensuite être examiné à souhait.
Une autre approche est d’utiliser un serveur SMTP « stupide » qui reçoit localement les courriels et les affiche dans le terminal, mais n’envoie rien plus loin. Python possède une manière intégrée de faire cela par une commande unique :
python -m smtpd -n -c DebuggingServer localhost:1025
Cette commande lance un serveur SMTP simple écoutant sur le port 1025 de localhost. Ce serveur ne fait qu’afficher dans la sortie standard tous les en-têtes des courriels ainsi que leur corps. Il ne vous reste plus qu’à définir adéquatement les réglages EMAIL_HOST
et EMAIL_PORT
. Pour une discussion plus détaillée au sujet des options de serveur SMTP, consultez la documentation Python du module smtpd
.
Pour plus d’informations sur les tests unitaires impliquant l’envoi de courriels par votre application, consultez la section Services de messagerie de la documentation sur les tests.