---
title: "Envoi de messages électroniques"
version: 5.0
locale: fr
source: https://docs.djangoproject.com/fr/5.0/topics/email/
canonical: https://djangodocs.dev/fr/5.0/topics/email/
---
# Envoi de messages électroniques

Même si Python fournit une interface d’envoi de courriels via le module [`smtplib`](https://docs.python.org/3/library/smtplib.html#module-smtplib), 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`](/fr/5.0/ref/settings/#std-setting-EMAIL_HOST) et [`EMAIL_PORT`](/fr/5.0/ref/settings/#std-setting-EMAIL_PORT). Les réglages [`EMAIL_HOST_USER`](/fr/5.0/ref/settings/#std-setting-EMAIL_HOST_USER) et [`EMAIL_HOST_PASSWORD`](/fr/5.0/ref/settings/#std-setting-EMAIL_HOST_PASSWORD), si définis, sont utilisés pour s’authentifier auprès du serveur SMTP, et les réglages [`EMAIL_USE_TLS`](/fr/5.0/ref/settings/#std-setting-EMAIL_USE_TLS) et [`EMAIL_USE_SSL`](/fr/5.0/ref/settings/#std-setting-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`](/fr/5.0/ref/settings/#std-setting-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)`

Dans la plupart des cas, vous pouvez envoyer des courriels avec `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. Si `None`, Django utilise la valeur du réglage [`DEFAULT_FROM_EMAIL`](/fr/5.0/ref/settings/#std-setting-DEFAULT_FROM_EMAIL).
- `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`](https://docs.python.org/3/library/smtplib.html#smtplib.SMTPException) en cas d’erreur. Consultez la liste des exceptions possibles dans la documentation de [`smtplib`](https://docs.python.org/3/library/smtplib.html#module-smtplib); elles sont toutes des sous-classes de [`SMTPException`](https://docs.python.org/3/library/smtplib.html#smtplib.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`](/fr/5.0/ref/settings/#std-setting-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`](/fr/5.0/ref/settings/#std-setting-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](#topic-email-backends) 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)`

`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()`](#django.core.mail.send_mail).

Chaque élément de `datatuple` produit un courriel séparé. Comme dans [`send_mail()`](#django.core.mail.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()`](#django.core.mail.send_mass_mail) et [`send_mail()`](#django.core.mail.send_mail) est que [`send_mail()`](#django.core.mail.send_mail) ouvre une connexion vers le serveur de messagerie lors de chaque exécution, alors que [`send_mass_mail()`](#django.core.mail.send_mass_mail) utilise une seule connexion pour tous ses messages. [`send_mass_mail()`](#django.core.mail.send_mass_mail) est donc un peu plus efficace.

## `mail_admins()`

#### `mail_admins(subject, message, fail_silently=False, connection=None, html_message=None)`

`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`](/fr/5.0/ref/settings/#std-setting-ADMINS).

`mail_admins()` préfixe le sujet avec la valeur du réglage [`EMAIL_SUBJECT_PREFIX`](/fr/5.0/ref/settings/#std-setting-EMAIL_SUBJECT_PREFIX) (« \[Django\] » par défaut).

L’en-tête « From: » du courriel correspond à la valeur du réglage [`SERVER_EMAIL`](/fr/5.0/ref/settings/#std-setting-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)`

`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`](/fr/5.0/ref/settings/#std-setting-MANAGERS).

## Exemples

Ceci envoie un courriel unique à [john@example.com](mailto:john@example.com) et [jane@example.com](mailto: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](mailto:john@example.com) et [jane@example.com](mailto: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](http://www.nyphp.org/phundamentals/8_Preventing-Email-Header-Injection.html) 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()`](#django.core.mail.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 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](mailto: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()`](#django.core.mail.send_mail) et [`send_mass_mail()`](#django.core.mail.send_mass_mail) de Django sont en réalité de légers adaptateurs qui utilisent la classe [`EmailMessage`](#django.core.mail.EmailMessage).

Seule une partie des fonctionnalités de la classe [`EmailMessage`](#django.core.mail.EmailMessage) sont exposées par [`send_mail()`](#django.core.mail.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`](#django.core.mail.EmailMessage).

> **Note**
>
> Cette conception est volontaire. [`send_mail()`](#django.core.mail.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`](#django.core.mail.EmailMessage) est responsable de créer le courriel lui-même. Le [moteur de messagerie](#topic-email-backends) est ensuite responsable d’envoyer le courriel.

Par commodité, [`EmailMessage`](#django.core.mail.EmailMessage) propose une méthode `send()` pour envoyer un courriel unique. Si vous devez envoyer plusieurs messages, l’API du moteur de messagerie [offre une alternative](#topics-sending-multiple-emails).

### Les objets `EmailMessage`

#### `class EmailMessage`

La classe [`EmailMessage`](#django.core.mail.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`](/fr/5.0/ref/settings/#std-setting-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`](https://docs.python.org/3/library/email.mime.html#email.mime.base.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. Cette fonction renvoie `1` si le message a été envoyé avec succès, sinon `0`.
- `message()` construit un objet `django.core.mail.SafeMIMEText` (une sous-classe de la classe Python [`MIMEText`](https://docs.python.org/3/library/email.mime.html#email.mime.text.MIMEText)) ou un objet `django.core.mail.SafeMIMEMultipart` contenant le message à envoyer. S’il vous arrivait de devoir étendre la classe [`EmailMessage`](#django.core.mail.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`](https://docs.python.org/3/library/email.mime.html#email.mime.base.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`](#django.core.mail.EmailMessage) et [`email.message.Message`](https://docs.python.org/3/library/email.compat32-message.html#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**](https://datatracker.ietf.org/doc/html/rfc2046.html#section-5.2.1) et qui peut poser des problèmes d’affichage des pièces jointes dans [Evolution](https://bugzilla.gnome.org/show_bug.cgi?id=651197) et [Thunderbird](https://bugzilla.mozilla.org/show_bug.cgi?id=333880).
- `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. Voici comment l’utiliser :

  ```
  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`](#django.core.mail.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`](#django.core.mail.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`](#django.core.mail.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`](#django.core.mail.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`](#django.core.mail.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()`](#django.core.mail.get_connection) de `django.core.mail` renvoie une instance utilisable du moteur de messagerie.

#### `get_connection(backend=None, fail_silently=False, *args, **kwargs)`

Par défaut, une appel à `get_connection()` renvoie une instance du moteur de messagerie indiqué dans [`EMAIL_BACKEND`](/fr/5.0/ref/settings/#std-setting-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](#topic-custom-email-backend).

#### 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`](/fr/5.0/ref/settings/#std-setting-EMAIL_HOST)
- `port`: [`EMAIL_PORT`](/fr/5.0/ref/settings/#std-setting-EMAIL_PORT)
- `username`: [`EMAIL_HOST_USER`](/fr/5.0/ref/settings/#std-setting-EMAIL_HOST_USER)
- `password`: [`EMAIL_HOST_PASSWORD`](/fr/5.0/ref/settings/#std-setting-EMAIL_HOST_PASSWORD)
- `use_tls`: [`EMAIL_USE_TLS`](/fr/5.0/ref/settings/#std-setting-EMAIL_USE_TLS)
- `use_ssl`: [`EMAIL_USE_SSL`](/fr/5.0/ref/settings/#std-setting-EMAIL_USE_SSL)
- `timeout`: [`EMAIL_TIMEOUT`](/fr/5.0/ref/settings/#std-setting-EMAIL_TIMEOUT)
- `ssl_keyfile`: [`EMAIL_SSL_KEYFILE`](/fr/5.0/ref/settings/#std-setting-EMAIL_SSL_KEYFILE)
- `ssl_certfile`: [`EMAIL_SSL_CERTFILE`](/fr/5.0/ref/settings/#std-setting-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 par [`socket.getdefaulttimeout()`](https://docs.python.org/3/library/socket.html#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`](/fr/5.0/ref/settings/#std-setting-EMAIL_FILE_PATH), soit au mot-clé `file_path` transmis lors de la création de la connexion avec [`get_connection()`](#django.core.mail.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`](#django.core.mail.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.

L’exécuteur de tests de Django [utilise automatiquement ce moteur pour les tests](/fr/5.0/topics/testing/tools/#topics-testing-email).

#### 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`](/fr/5.0/ref/settings/#std-setting-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`](#django.core.mail.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`](#django.core.mail.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`](#django.core.mail.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](#topic-email-console-backend). Ce moteur redirige tous les courriels vers la sortie standard `stdout`, ce qui permet d’inspecter leur contenu.

Le moteur de messagerie [fichier](#topic-email-file-backend) 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. Le paquet [aiosmtpd](https://aiosmtpd.readthedocs.io/en/latest/) propose une manière de faire cela :

```shell
python -m pip install aiosmtpd

python -m aiosmtpd -n -l localhost:8025
```

Cette commande lance un serveur SMTP minimal écoutant sur le port 8025 de localhost. Ce serveur affiche sur 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`](/fr/5.0/ref/settings/#std-setting-EMAIL_HOST) et [`EMAIL_PORT`](/fr/5.0/ref/settings/#std-setting-EMAIL_PORT). Pour une discussion plus détaillée au sujet des options de serveur SMTP, consultez la documentation du module [aiosmtpd](https://aiosmtpd.readthedocs.io/en/latest/).

Pour plus d’informations sur les tests unitaires impliquant l’envoi de courriels par votre application, consultez la section [Services de messagerie](/fr/5.0/topics/testing/tools/#topics-testing-email) de la documentation sur les tests.
