wake-up-neo.net

E-Mail-Versand testen

Tipps zum Testen der E-Mail-Versendung? Anders als möglicherweise ein gmail Konto erstellen, insbesondere für das Empfangen dieser E-Mails?

Ich möchte vielleicht die E-Mails lokal in einem Ordner speichern, sobald sie gesendet werden.

67
RadiantHex

Sie können ein file-Backend zum Versenden von E-Mails verwenden. Dies ist eine sehr praktische Lösung für die Entwicklung und das Testen. E-Mails werden nicht gesendet, sondern in einem Ordner abgelegt, den Sie angeben können!

34

Das Django-Test-Framework verfügt über einige integrierte Helfer, die Sie beim Testen des E-Mail-Dienstes unterstützen.

Beispiel aus docs (kurze Version):

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')
154
Davor Lucic

Wenn Sie sich mit Unit-Tests befassen, ist die beste Lösung die Verwendung des In-Memory-Backends von Django.

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

Nehmen Sie den Fall der Verwendung als py.test -Einrichtung

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

Bei jedem Test wird der mail.outbox mit dem Server zurückgesetzt, so dass zwischen den Tests keine Nebenwirkungen auftreten.

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
11
kiril

Für jedes Projekt, für das keine Anhänge gesendet werden müssen, verwende ich Django-mailer . Dies hat den Vorteil, dass alle ausgehenden E-Mails in einer Warteschlange enden, bis ich ihre Versendung auslöse und sogar nachdem sie gesendet wurden Anschließend werden alle Daten protokolliert, die im Admin sichtbar sind. So können Sie schnell überprüfen, was Ihr E-Mail-Code in die Intertubes abfeuern soll.

5
Steve Jalim

Django hat auch ein In-Memory-E-Mail-Backend. Weitere Details finden Sie in den Dokumenten unter In-Memory Backend . Dies ist in Django 1.6 nicht sicher, ob es in etwas früher vorhanden ist.

4
Josh K

Durch das Patchen von SMTPLib zu Testzwecken können Sie das Senden von E-Mails testen, ohne sie zu senden.

3
pyfunc

Verwenden Sie MAILHOG

Inspiriert von MailCatcher, einfacher zu installieren.

Mit Go gebaut - MailHog läuft ohne Installation auf mehreren Plattformen.


Außerdem gibt es eine Komponente namens Jim, MailHog Chaos Monkey, mit der Sie das Senden von E-Mails mit verschiedenen Problemen testen können:

Was kann Jim tun?

  • Verbindungen ablehnen
  • Rate Limit Verbindungen
  • Authentifizierung ablehnen
  • Absender ablehnen
  • Empfänger abweisen

Lesen Sie mehr darüber hier .


(Im Gegensatz zum ursprünglichen Mailcatcher, der bei mir fehlgeschlagen ist, wenn E-Mails mit Emoji gesendet wurden, in UTF-8 kodiert und er in der aktuellen Version NICHT wirklich behoben wurde, funktioniert MailHog einfach.

2
Greg Dubicki

Die Verwendung des Datei-Backends funktioniert gut, aber ich finde es etwas umständlich, sich das Dateisystem anzusehen, um E-Mails anzusehen. Mit dem Mailcatcher https://github.com/sj26/mailcatcher können Sie E-Mails erfassen und in einer Web-Benutzeroberfläche anzeigen.

Um Mailcatcher mit Django zu verwenden, müssen Sie Ihrer settings.py Folgendes hinzufügen:

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
1
Marc

Starten Sie Ihren eigenen wirklich einfachen SMTP-Server durch Erben von smtpd.SMTPServer und 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 wird aufgerufen, wenn Ihr SMTP-Server eine E-Mail-Anforderung erhält. Sie können dort alles tun, was Sie möchten.

Führen Sie im Testcode Folgendes aus:

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

Denken Sie nur an close() the asyncore.dispatcher , indem Sie smtp_server.close() aufrufen, um die Asyncore-Schleife zu beenden (stoppen Sie den Server nicht).

1
frogcoder

Meine Lösung ist das Schreiben von Inhalten in eine HTML-Datei. Auf diese Weise können Sie sehen, wie E-Mails aussehen. Ich lasse es hier htmlfilebased.EmailBackend .

Anderer Tipp: Sie können Django E-Mail-Vorlageneditor verwenden, mit dem Sie Ihre E-Mail-Vorlage ohne Inline-CSS bearbeiten können.

0
Phuong Vu

Wenn Sie einen Tomcat-Server oder eine andere Servlet-Engine zur Verfügung haben, ist der Ansatz von Nizza "Post Hoc". Hierbei handelt es sich um einen kleinen Server, der die Anwendung genau wie ein SMTP-Server darstellt, aber eine Benutzeroberfläche enthält, mit der Sie und anzeigen können Überprüfen Sie die E-Mail-Nachrichten, die gesendet wurden. Es ist Open Source und frei verfügbar. 

Finden Sie es unter: Post Hoc GitHub Site

Siehe den Blogeintrag: PostHoc: Testen von Apps, die E-Mails senden

0
AgilePro

https://websocket.email bietet eine einfache Möglichkeit, das Senden von E-Mails mit minimalem Setup zu testen (Sie benötigen nicht einmal einen Account).

0
Andrew Chambers

Hier sind ein paar der Teile zusammengefügt. Hier ist ein einfaches Setup basierend auf filebased.EmailBackend. Dadurch wird eine Listenansicht erstellt, die mit den einzelnen Protokolldateien verknüpft ist, deren Dateinamen mit einem Zeitstempel versehen sind. Wenn Sie auf einen Link in der Liste klicken, wird diese Nachricht im Browser angezeigt (RAW):

Die Einstellungen

EMAIL_BACKEND = "Django.core.mail.backends.filebased.EmailBackend"
EMAIL_FILE_PATH = f"{MEDIA_ROOT}/email_out"

Aussicht

import os

from Django.conf import settings
from Django.shortcuts import render

def mailcheck(request):

    path = f"{settings.MEDIA_ROOT}/email_out"
    mail_list = os.listdir(path)

    return render(request, "mailcheck.html", context={"mail_list": mail_list})

Vorlage

{% if mail_list %}
  <ul>
  {% for msg in mail_list %}
    <li>
      <a href="{{ MEDIA_URL }}email_out/{{msg}}">{{ msg }}</a>
    </li>
  {% endfor %}
  </ul>
{% else %}
  No messages found.
{% endif %}

URLs

path("mailcheck/", view=mailcheck, name="mailcheck"),
0
shacker