Probar el envío de correo electrónico sin servidor de correo electrónico


Tengo una aplicación Django que envía un correo electrónico. El servidor de producción tiene un servidor de correo electrónico, pero mi caja local no. Me gustaría poder probar el envío de correo electrónico localmente. ¿Hay alguna manera de que pueda hacer que django no lo envíe a través del servidor de correo electrónico y simplemente lo imprima en un archivo o consola?

Author: asawilliams, 2011-01-10

6 answers

Puede configurar su aplicación para usar el Backend de la consola para enviar correo electrónico. Escribe e-mails a standard out en lugar de enviarlos.

Cambie su settings.py para incluir esta línea:

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

No se olvide de quitarlo para la producción.

 118
Author: Daniel Hepper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-09 22:15:30

Python tiene un pequeño servidor SMTP incorporado. Puede iniciarlo en una segunda consola con este comando:

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

Esto simplemente imprimir todos los correos enviados a localhost:1025 en la consola.

Tienes que configurar Django para usar este servidor en tu settings.py:

EMAIL_HOST = 'localhost'
EMAIL_PORT = 1025
 66
Author: Benjamin Wohlwend,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-25 09:48:04

Puede configurar su aplicación para escribir correos electrónicos en archivos temporales en lugar de enviarlos (similar a la respuesta de Daniel Hepper).

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

Esto guarda cada mensaje nuevo como un archivo separado. Útil si está enviando un montón de correos electrónicos y no desea tener que usar el desplazamiento.

 34
Author: Matthew Schinckel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-09 23:35:39

Si sus pruebas se extienden desde django.prueba.testcases.TestCase entonces no hay nada que hacer. Django reemplazará el EmailBackend por uno "especial". Entonces usted puede probar lo que habría sido enviado de esta manera :

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

El objeto outbox es un objeto especial que se inyecta en el correo cuando python manage.py prueba ejecutada.

 27
Author: Julien Grenier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-12 01:51:28

Hay una aplicación genial para esto por caktus https://github.com/caktus/django-email-bandit Solo tiene que añadir esto a su settings.py archivo:

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

En la parte superior de sus ajustes de correo electrónico..Todos los correos electrónicos serán desviados a '[email protected]"

Feliz codificación...

 11
Author: Njogu Mbau,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-17 12:22:50

Esto desarrolla la respuesta de Benjamín. Una forma de probar correos electrónicos si no tengo un servidor de correo local como postfix, sendmail o exim instalado es ejecutar el servidor de correo electrónico python. Puede ejecutarlo en el puerto 25 con sudo, o simplemente usar un puerto > 1024 (puertos reservados):

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

Para probar con su código de aplicación django actual, puede cambiar settings.py temporalmente para incluir esto en el botom:

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

Ahora prueba tus correos electrónicos, o puedes hacerlo en ./manage.py shell en otra ventana de terminal como esta:

python manage.py shell

Y pegue este código para enviar un correo electrónico:

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

No es necesario utilizar ningún correo electrónico real, ya que verá todo en su terminal. Usted puede volcar al contenedor apropiado como .html para pruebas adicionales.

 8
Author: radtek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-13 17:12:14