Tester l’envoi de courrier électronique sans serveur de messagerie

J’ai une application Django qui envoie un email. Le serveur de production a un serveur de messagerie, mais pas ma boîte locale. Je voudrais pouvoir tester l’envoi de courriels localement. Y a-t-il un moyen de faire en sorte que Django ne l’envoie pas via le serveur de messagerie et qu’il s’imprime simplement dans un fichier ou une console?

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

Changez vos parameters.py pour inclure cette ligne:

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

N’oubliez pas de le retirer pour la production.

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

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

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

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

 EMAIL_HOST = 'localhost' EMAIL_PORT = 1025 

Vous pouvez configurer votre application pour écrire des e-mails sur 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 séparé. Utile si vous envoyez des tas d’emails et que vous ne voulez pas utiliser le défilement.

Si vos tests s’étendent de django.test.testcases.TestCase alors rien ne doit être fait. Django remplacera EmailBackend par une version “spéciale”. 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’object outbox est un object spécial qui est injecté dans le courrier lorsque le test python manage.py est exécuté.

Il y a une application intéressante pour cela par caktus https://github.com/caktus/django-email-bandit Ajoutez ceci à votre fichier settings.py:

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

En plus de vos réglages d’e-mail, tous les e-mails seront redirigés vers “[email protected]”.

Heureux codage …

Ceci élabore la réponse de Benjamin. Une façon de tester les e-mails si je n’ai pas de serveur de messagerie local tel que postfix, sendmail ou exim est d’exécuter le serveur de messagerie python. Vous pouvez l’exécuter sur le port 25 avec sudo, ou simplement utiliser 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 le code de votre application django actuelle, vous pouvez modifier settings.py temporairement pour l’inclure dans le botom:

 EMAIL_HOST, EMAIL_PORT, EMAIL_HOST_USER, EMAIL_HOST_PASSWORD = 'localhost', 1025, None, None 

Maintenant, testez vos emails, 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 emails car vous verrez tout dans votre terminal. Vous pouvez le vider dans le conteneur approprié, tel que .html, pour des tests supplémentaires.