2010-09-16 22 views
56

algún consejo sobre las pruebas de envío de correo electrónico? ¿Además de tal vez crear una cuenta de Gmail, especialmente para recibir esos correos electrónicos?Probar el envío de correos electrónicos

Me gustaría, tal vez, almacenar los correos electrónicos localmente, dentro de una carpeta a medida que se envían.

+0

Moderadores: por favor, bloquee esta pregunta. Se agrega mucho spam en las respuestas, proponiendo soluciones que son ridículamente complejas solo para promover servicios externos. – nemesisdesign

Respuesta

31

Puede usar un file backend for sending emails que es una solución muy útil para el desarrollo y las pruebas; ¡los correos electrónicos no se envían sino que se almacenan en una carpeta que puede especificar!

+1

Más información sobre los servidores de correo electrónico: https://docs.djangoproject.com/en/dev/topics/email/#email-backends. A veces, incluso el backend de consola simple es suficiente. – Jeewes

4

Para cualquier proyecto que no requiere el envío de archivos adjuntos, utilizo django-mailer, que tiene el beneficio de todos los correos electrónicos salientes que terminan en una cola hasta que provoquen sus enviando, e incluso después de han sido enviados, luego se registran, todo lo cual es visible en el Administrador, lo que facilita el control rápido de lo que el código de correo electrónico está intentando disparar a los intertubos.

+0

Además, los objetos de mensaje creados por django-mailer significan que puedes pincharlos (e inspeccionar su contenido) en pruebas unitarias también (sé que hay soporte de buzón de salida en el banco de pruebas para un buzón ficticio, pero el uso de django-mailer no envía correo a menos que el comando de administración lo envíe, lo que significa que no puede usar ese objeto de buzón) –

+0

Actualización, a partir de la fecha de mi respuesta original: https://github.com/SmileyChris/django-mailer-2 admite archivos adjuntos, también –

139

Django test framework tiene algunos ayudantes incorporados para ayudarle con la prueba e-mail service.

Ejemplo de documentos (versión corta):

from django.core import mail 
from django.test import TestCase 

class EmailTest(TestCase): 
    def test_send_email(self): 
     mail.send_mail('Subject here', 'Here is the message.', 
      '[email protected]', ['[email protected]'], 
      fail_silently=False) 
     self.assertEqual(len(mail.outbox), 1) 
     self.assertEqual(mail.outbox[0].subject, 'Subject here') 
+3

+1 Buena respuesta. Pero no es útil para casos complejos, cuando 'send_mail' no se puede usar. – santiagobasulto

+2

Más precisamente, el documento está aquí: https://docs.djangoproject.com/en/1.8/topics/email/#in-memory-backend – nimiq

+2

¿Cómo harías esto si pruebas una función que llama a send_mail y por lo tanto puedes ¿'acceder' al correo '? –

1

Usando el servidor de archivos funciona bien, pero me parece que es un poco de un engorroso para empujar todo el sistema de archivos para mirar a mensajes de correo electrónico. Puede usar mailcatcher, https://github.com/sj26/mailcatcher, para capturar correos electrónicos y mostrarlos en una interfaz de usuario web.

Para utilizar mailcatcher con Django tendrá que añadir algo como lo siguiente a su settings.py:

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' 
EMAIL_HOST = '127.0.0.1' 
EMAIL_HOST_USER = '' 
EMAIL_HOST_PASSWORD = '' 
EMAIL_PORT = 1025 
EMAIL_USE_TLS = False 
4

Django también tiene un backend de correo electrónico en memoria. Más detalles en los documentos bajo In-memory backend. Esto está presente en Django 1.6 no estoy seguro de si está presente en algo anterior.

-1

Usar Maildump.

https://github.com/ThiefMaster/maildump

MailDump es un clon basado en Python de la herramienta MailCatcher impresionante. Su propósito es proporcionar a los desarrolladores una forma de permitir a las aplicaciones enviar correos electrónicos sin que se envíen correos electrónicos reales a nadie. Además, los desarrolladores perezosos pueden preferir esto a un servidor SMTP real simplemente por el porque es mucho más fácil y más rápido de configurar.

sin embargo, requiere Python 2.

6

Si usted está en la unidad de pruebas de la mejor solución es utilizar el In-memory backend proporcionada por Django.

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

Tomemos el caso de utilizarlo como py .prueba accesorio

@pytest.fixture(autouse=True) 
def email_backend_setup(self, settings): 
    settings.EMAIL_BACKEND = 'django.core.mail.backends.locmem.EmailBackend' 

En cada prueba, el mail.outbox se restablece con el servidor, por lo que no hay efectos secundarios entre pruebas.

from django.core import mail 

def test_send(self): 
    mail.send_mail('subject', 'body.', '[email protected]', ['[email protected]']) 
    assert len(mail.outbox) == 1 

def test_send_again(self): 
    mail.send_mail('subject', 'body.', '[email protected]', ['[email protected]']) 
    assert len(mail.outbox) == 1 
0

Mi solución es escribir contenido en un archivo html. De esta manera puede ayudarlo a ver cómo se ve el correo electrónico. Lo dejo aquí htmlfilebased.EmailBackend.

Otro consejo: Puede usar django email template editor que puede ayudarlo a editar su plantilla de correo electrónico con cero css en línea.

0

Uso MailHog

Inspirado por MailCatcher, más fácil de instalar.

Construido con Go - MailHog se ejecuta sin instalación en múltiples plataformas.


Además, tiene un componente llamado Jim, la MailHog Caos Mono, lo que le permite probar envío de correos electrónicos con diversos problemas sucediendo:

¿Qué puede Jim ¿hacer?

  • rechazar las conexiones
  • conexiones margen de límite
  • rechazan la autenticación
  • Rechazar remitentes
  • Rechazar destinatarios

Lea más sobre esto here.


(diferencia de mailcatcher original, que failed on me when sending emails with emoji, encoded in UTF-8 y en realidad no era fijo en la versión actual, MailHog simplemente funciona.)

0

por qué no empezar su propio servidor SMTP muy simple por Heredar del smtpd.SMTPServer y threading.Thread:

class TestingSMTPServer(smtpd.SMTPServer, threading.Thread): 
    def __init__(self, port=25): 
     smtpd.SMTPServer.__init__(
      self, 
      ('localhost', port), 
      ('localhost', port), 
      decode_data=False 
     ) 
     threading.Thread.__init__(self) 

    def process_message(self, peer, mailfrom, rcpttos, data, **kwargs): 
     self.received_peer = peer 
     self.received_mailfrom = mailfrom 
     self.received_rcpttos = rcpttos 
     self.received_data = data 

    def run(self): 
     asyncore.loop() 

process_message se llama cada vez que el servidor SMTP recibe una solicitud de correo, puede hacer lo que quiera allí.

En el código de prueba, hacer algo como esto:

smtp_server = TestingSMTPServer() 
smtp_server.start() 
do_thing_that_would_send_a_mail() 
smtp_server.close() 
self.assertIn(b'hello', smtp_server.received_data) 

Sólo recuerde a close() la asyncore.dispatcher llamando smtp_server.close() para terminar el bucle asyncore (detener el servidor de la escucha).

0

Si tiene un servidor TomCat disponible u otro servlet engine, entonces un buen enfoque es "Post Hoc", que es un pequeño servidor que mira a la aplicación exactamente como un servidor SMTP, pero incluye una interfaz de usuario que permite para ver e inspeccionar los mensajes de correo electrónico que se enviaron. Es de código abierto y de libre acceso.

encontrar en: Post Hoc GitHub Site

Ver el blog: PostHoc: Testing Apps that Send Email

0

https://websocket.email proporciona una manera simple de probar el envío de correo electrónico con una configuración mínima (que ni siquiera necesita una cuenta).

Cuestiones relacionadas