2011-01-09 19 views
60

Tengo una aplicación de 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 correos electrónicos localmente. ¿Hay alguna forma de que pueda hacer que django no lo envíe a través del servidor de correo electrónico y simplemente imprimir en un archivo o consola?Prueba de envío de correo electrónico sin servidor de correo electrónico

+0

Puede ser útil saber el sistema operativo de su caja local ... En realidad, no necesita un servidor de correo electrónico en la caja, todo lo que necesita es una conexión de red a un servidor de correo electrónico a través del puerto SMTP ... y posible usuario/contraseña. – Spacedman

+0

posible duplicado de [Servidor Dummy SMTP para probar aplicaciones que envían correo electrónico] (http://stackoverflow.com/questions/1006650/dummy-smtp-server-for-testing-apps-that-send-email) –

Respuesta

113

Puede configure your application to use the Console Backend para el envío de correo electrónico. Escribe los correos electrónicos a la salida estándar en lugar de enviarlos.

Cambiar la settings.py para incluir esta línea:

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

No se olvide de quitarlo para la producción.

+18

Mejor aún, colóquelo en un archivo de configuración de desarrollo y no lo agregue a la producción. – leech

+2

O mejor aún, [hágalo con variables de entorno] (http://12factor.net/config). – meshy

+1

Si está utilizando ['mail_admins'] (https://docs.djangoproject.com/en/stable/topics/email/#mail-admins), recuerde configurar [' ADMINS'] (https: // docs .djangoproject.com/es/stable/ref/settings/# std: setting-ADMINS) a algo, de lo contrario, nada se imprimirá en stdout. Del mismo modo para 'mail_managers'. – Flimm

58

Python tiene un pequeño servidor SMTP built-in. 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.

tiene que configurar Django para utilizar este servidor en su settings.py:

EMAIL_HOST = 'localhost' 
EMAIL_PORT = 1025 
+0

Tenga en cuenta que su la aplicación puede lanzar una excepción si intenta enviar un correo electrónico cuando el servidor de correo electrónico no se inicia. 'fail_silently = False' es el valor predeterminado para' send_mail'. –

+0

Si bien la respuesta de Daniel Hepper es indudablemente la correcta con respecto a la pregunta planteada, me gusta más esta respuesta porque es una solución general que funciona independientemente del entorno. (Por supuesto, en ambos casos, por supuesto.) – Teekin

29

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 nuevo mensaje como un archivo separado. Útil si está enviando montones de correos electrónicos, y no quiere tener que usar la función scrollback.

+0

Eso es realmente increíble de saber. Gracias. – Teekin

27

Si sus pruebas se extienden desde django.test.testcases.TestCase, entonces no es necesario hacer nada. Django reemplazará el EmailBackend por uno "especial". A continuación, puede probar lo que había sido enviado como esto:

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 buzón de salida es un objeto especial que consiguen inyecta en el correo cuando se ejecuta la prueba manage.py pitón.

11

Hay una aplicación de frío para este Caktus por https://github.com/caktus/django-email-bandit Sólo añadir esto a su archivo settings.py:

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

En la parte superior de su correo electrónico mensajes de correo electrónico setttings..All se desviarán a '@ your_email ejemplo .com'

feliz codificación ...

7

Este elabora sobre la respuesta de Benjamin. Una forma de probar los 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 de python. Se puede ejecutar en el puerto 25 con sudo, o simplemente utilizar un puerto> 1024 (puertos reservados):

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

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

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

Ahora pruebe sus correos electrónicos, o puede hacerlo en ./manage.shell py en otra ventana de terminal, así:

python manage.py shell 

y pegar en 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 hay necesidad de utilizar ningún correo electrónico reales desde verá todo en su terminal. Puede volcarlo en el contenedor apropiado como .html para realizar más pruebas.

Cuestiones relacionadas