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?
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.
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
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.
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é.
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 ...
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.