web-dev-qa-db-fra.com

Tester l'envoi d'e-mails sans serveur de messagerie

J'ai une application Django qui envoie un e-mail. Le serveur de production a un serveur de messagerie mais pas ma boîte locale. Je voudrais pouvoir tester l'envoi d'e-mails localement. Y a-t-il un moyen que je peux avoir Django ne pas l'envoyer via le serveur de messagerie et simplement l'imprimer dans un fichier ou une console?

65
asawilliams

Vous pouvez configurer votre application pour utiliser le backend de la console pour envoyer des e-mails. Il écrit des e-mails en standard au lieu de les envoyer.

Modifiez votre settings.py pour inclure cette ligne:

EMAIL_BACKEND = 'Django.core.mail.backends.console.EmailBackend'

N'oubliez pas de le retirer pour la production.

124
Daniel Hepper

Python a un petit serveur SMTP intégré . Vous pouvez le démarrer dans une deuxième console avec cette commande:

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

Cela imprimera simplement tous les e-mails envoyés à localhost:1025 dans la console.

Vous devez configurer Django pour utiliser ce serveur dans votre settings.py:

EMAIL_Host = 'localhost'
EMAIL_PORT = 1025
74
Benjamin Wohlwend

Vous pouvez configurer votre application pour écrire des e-mails dans des fichiers temporaires au lieu de les envoyer (similaire à la réponse de Daniel Hepper).

EMAIL_BACKEND = 'Django.core.mail.backends.filebased.EmailBackend'
EMAIL_FILE_PATH = 'tmp/email-messages/'

Cela enregistre chaque nouveau message dans un fichier distinct. Utile si vous envoyez des tas d'e-mails et que vous ne voulez pas avoir à utiliser le scrollback.

38
Matthew Schinckel

Si vos tests s'étendent de Django.test.testcases.TestCase alors rien ne doit être fait. Django remplacera l'EmailBackend par un "spécial". Ensuite, vous pouvez tester ce qui aurait été envoyé comme ceci:

def testMethodThatSendAEmail(self):
    ...
    from Django.core import mail
    object.method_that_send_email(to='[email protected]')
    self.assertEqual(len(mail.outbox), 1)
    self.assertEqual(mail.outbox[0].to, ['[email protected]'])
    ...#etc

L'objet de boîte d'envoi est un objet spécial qui est injecté dans le courrier lorsque le test python manage.py est exécuté.

32
Julien Grenier

Il y a une application sympa pour cela par caktus https://github.com/caktus/Django-email-bandit Ajoutez simplement ceci à votre fichier settings.py:

EMAIL_BACKEND = 'bandit.backends.smtp.HijackSMTPBackend'
BANDIT_EMAIL = '[email protected]'

En plus de vos paramètres de messagerie, tous les e-mails seront détournés vers "[email protected]".

Bon codage ...

11
Njogu Mbau

Cela développe la réponse de Benjamin. Une façon de tester les e-mails si je n'ai pas de serveur de messagerie local comme postfix, sendmail ou exim installé est d'exécuter le serveur de messagerie python. Vous pouvez l'exécuter sur le port 25 avec Sudo, ou utilisez simplement un port> 1024 (ports réservés):

python -m smtpd -n -c DebuggingServer localhost:1025
#Sudo python -m smtpd -n -c DebuggingServer localhost:25

Pour tester avec votre code d'application Django actuel, vous pouvez modifier temporairement settings.py pour l'inclure au bas:

EMAIL_Host, EMAIL_PORT, EMAIL_Host_USER, EMAIL_Host_PASSWORD = 'localhost', 1025, None, None

Testez maintenant vos e-mails, ou vous pouvez le faire dans ./manage.py Shell dans une autre fenêtre de terminal comme ceci:

python manage.py Shell

Et collez ce code pour envoyer un email:

from Django.core.mail import send_mail​
send_mail('Subject here', 'Here is the message.', '[email protected]',['[email protected]'], fail_silently=False)

Pas besoin d'utiliser de vrais e-mails car vous verrez tout dans votre terminal. Vous pouvez le vider dans le conteneur approprié comme .html pour des tests supplémentaires.

10
radtek