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).
Aplicar parches a SMTPLib con fines de prueba puede ayudar a probar el envío de correos sin enviarlos.
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'')
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 en htmlfilebased.EmailBackend .
Otro consejo: puede usar el editor de plantilla de correo django, que puede ayudarlo a editar su plantilla de correo electrónico con cero CSS en línea.
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.
Puede utilizar un backend de archivos para enviar correos electrónicos, 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!
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).