sent sending script raspberry para mail library from enviar electronico desde correo python django email smtp django-testing

script - sending email from python



Probar el envío de correo electrónico (13)

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

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


¿Por qué no iniciar su propio servidor SMTP realmente simple heredando de 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()

Se llama a process_message siempre que su servidor SMTP reciba una solicitud de correo, puede hacer lo que quiera allí.

En el código de prueba, haz 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)

Simplemente recuerde close() asyncore.dispatcher llamando a smtp_server.close() para finalizar el ciclo asyncore (detenga la escucha del servidor).



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


El marco de prueba de Django tiene algunos ayudantes incorporados para ayudarlo a probar el servicio de correo electrónico .

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'')



Para cualquier proyecto que no requiera el envío de archivos adjuntos, uso django-mailer , que tiene el beneficio de que todos los correos salientes terminen en una cola hasta que active su envío, e incluso después de que hayan sido enviados, se registran. todo lo cual es visible en el administrador, lo que facilita la verificación rápida de lo que el código de correo electrónico está intentando disparar a los intertubos.



Si te gustan las pruebas unitarias, la mejor solución es usar el back-end en memoria proporcionado por django.

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

Tomemos el caso de usarlo como un accesorio py.test

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

En cada prueba, mail.outbox se restablece con el servidor, por lo que no hay efectos secundarios entre las 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


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 le permite ver y inspeccionar los mensajes de correo electrónico que se enviaron. Es de código abierto y de libre acceso.

Encuéntrelo en: Sitio Post Goc de GitHub

Vea la publicación del blog: PostHoc: pruebas de aplicaciones que envían correos electrónicos


Usar el back-end de archivos funciona bien, pero me resulta un poco engorroso hurgar en el sistema de archivos para mirar los correos electrónicos. Puede usar mailcatcher, https://github.com/sj26/mailcatcher , para capturar correos electrónicos y mostrarlos en una interfaz de usuario web.

Para usar mailcatcher con Django, deberás agregar algo como lo siguiente a tu 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


Use 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 , el MailHog Chaos Monkey , que le permite probar el envío de correos electrónicos con varios problemas que suceden:

¿Qué puede hacer Jim?

  • Rechazar conexiones
  • Conexiones de límite de velocidad
  • Rechazar autenticación
  • Rechazar a los remitentes
  • Rechazar destinatarios

Lea más sobre esto here .


(A diferencia del cartero original, que me falló cuando enviaba correos electrónicos con emoji, codificado en UTF-8 y NO FUE realmente reparado en la versión actual, MailHog simplemente funciona).


Use Maildump.

https://github.com/ThiefMaster/maildump

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

Sin embargo, requiere Python 2.


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