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 dans recipient_list verra les autres destinataires dans le champ « To: » du courriel.
  • fail_silently: une valeur booléenne. Avec la valeur False, send_mail() lève une exception smtplib.SMTPException en cas d’erreur. Consultez la liste des exceptions possibles dans la documentation de smtplib; elles sont toutes des sous-classes de SMTPException.
  • 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églage EMAIL_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églage EMAIL_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: 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 .

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()

mail_admins(subject, message, fail_silently=False, connection=None, html_message=None)[source]

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()

mail_managers(subject, message, fail_silently=False, connection=None, html_message=None)[source]

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

class EmailMessage[source]

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 formes fred@example.com et Fred <fred@example.com> sont acceptées. Si le paramètre est absent, c’est le réglage DEFAULT_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 lorsque send() est appelée.
  • attachments: une liste de pièces jointes à placer dans le message. Elles peuvent être soit des instances de MIMEBase, 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 est extra_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 vaut True, 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 objet django.core.mail.SafeMIMEText (une sous-classe de la classe Python MIMEText) ou un objet django.core.mail.SafeMIMEMultipart contenant le message à envoyer. S’il vous arrivait de devoir étendre la classe EmailMessage, 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 ou bcc). 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’appeler attach():

    • 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 et mimetype. 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 et mimetype est le type MIME facultatif de la pièce jointe. Si vous omettez mimetype, 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 comme mimetype, la méthode accepte aussi les classes django.core.mail.EmailMessage et email.message.Message.

      Pour un mimetype commençant par text/, 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é en application/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 pour attach().

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’objets EmailMessage. 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.

get_connection(backend=None, fail_silently=False, *args, **kwargs)[source]

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:

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 par socket.getdefaulttimeout() dont la valeur par défaut est None (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.

Back to Top