76 votes

Tester l'envoi de messagerie sans serveur de messagerie

J'ai une application Django qui envoie un e-mail. Le serveur de production dispose d'un serveur de messagerie, mais ma boîte locale ne fonctionne pas. Je voudrais être en mesure de tester l'envoi de mail en local. Est-il possible que je peux avoir django ne pas l'envoyer par le serveur de messagerie et il suffit d'imprimer vers un fichier ou une console?

140voto

Daniel Hepper Points 4992

Vous pouvez configurer votre application pour utiliser la Console de Backend pour l'envoi d'e-mail. Il écrit des e-mails standard au lieu de les envoyer.

Changer votre settings.py pour inclure cette ligne:

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

N'oubliez pas de l'enlever pour la production.

85voto

Benjamin Wohlwend Points 14976

Python a un peu de serveur SMTP intégré. Vous pouvez commencer à vous dans une seconde console avec cette commande:

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

Ce sera tout simplement l'impression de tous les mails envoyés à l' localhost:1025 dans la console.

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

EMAIL_HOST = 'localhost'
EMAIL_PORT = 1025

42voto

Matthew Schinckel Points 15596

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

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

Cela permet d'économiser chaque nouveau message dans un fichier distinct. Utile si vous envoyez des tas d'e-mails, et ne veulent pas avoir à utiliser le scrollback.

35voto

Julien Grenier Points 1980

Si vos tests s'étend de django.test.cas de tests.Cas de test, puis rien ne doit être fait. Django va remplacer le EmailBackend pour une "spéciale" un. Ensuite, vous pouvez tester ce qui avait été envoyé comme ceci :

def testMethodThatSendAEmail(self):
    ...
    from django.core import mail
    object.method_that_send_email(to='me@example.com')
    self.assertEqual(len(mail.outbox), 1)
    self.assertEqual(mail.outbox[0].to, ['me@example.com'])
    ...#etc

La boîte d'envoi de l'objet est un objet spécial qui sont alors injectés dans le courrier quand python manage.py test est exécuté.

11voto

Benarito Points 46

Il est cool app pour cette par caktus https://github.com/caktus/django-email-bandit Juste ajouter ceci à votre settings.py fichier:

EMAIL_BACKEND = 'bandit.backends.smtp.HijackSMTPBackend'
BANDIT_EMAIL = 'your_email@example.com'

Sur le dessus de votre e-mail paramètres..Tous les e-mails seront détournés vers 'your_email@example.com'

Heureux de codage...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X