2010-09-16 3 views
56

Tipps zum Testen der E-Mail senden? Anders als vielleicht ein Google Mail-Konto zu erstellen, vor allem für den Empfang dieser E-Mails?Testen der E-Mail senden

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

+0

Moderatoren: Bitte diese Frage sperren. In den Antworten wird viel Spam hinzugefügt und Lösungen vorgeschlagen, die lächerlich komplex sind, um externe Dienste zu fördern. – nemesisdesign

Antwort

31

Sie können eine file backend for sending emails verwenden, die eine sehr handliche Lösung für Entwicklung und Test ist; E-Mails werden nicht gesendet, sondern in einem Ordner gespeichert, den Sie angeben können!

+1

Weitere Informationen zu E-Mail-Back-Ends: https://docs.djangoproject.com/en/dev/topics/email/#email-backends. Manchmal reicht sogar ein einfaches Konsolen-Backend. – Jeewes

4

Für jedes Projekt, das erfordert keine Anhänge zu senden, verwende ich django-mailer, die den Nutzen aller verschickten E-Mails haben in einer Warteschlange zu enden, bis ich ihre auslösen senden, und auch nach Sie wurden gesendet, sie werden dann protokolliert. All dies ist im Admin sichtbar, so dass Sie schnell überprüfen können, was Sie per E-Mail an die Intertubes senden.

+0

Darüber hinaus können die von django-mailer erstellten Nachrichtenobjekte auch in Komponententests angezeigt (und deren Inhalt überprüft) werden (ich weiß, dass es in der Testsuite Postausgangsunterstützung gibt) für ein Dummy-Postfach, aber die Verwendung von Django-Mailer sendet keine E-Mail, es sei denn, der Verwaltungsbefehl sendet es, was bedeutet, dass Sie dieses Postfach-Objekt nicht verwenden können) –

+0

Update, Alter von meiner ursprünglichen Antwort: https://github.com/SmileyChris/django-mailer-2 unterstützt auch Anhänge –

139

Django Test Framework hat einige eingebaute Helfer, die Ihnen beim Testen helfen e-mail service.

Beispiel von docs (Kurzfassung):

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 Gute Antwort. Aber es ist nicht nützlich für komplexe Fälle, wenn 'send_mail' nicht verwendet werden kann. – santiagobasulto

+2

Genauer gesagt ist das Dokument hier: https://docs.djangoproject.com/en/1.8/topics/email/#in-memory-backend – nimiq

+2

Wie würden Sie das tun, wenn Sie eine Funktion testen, die send_mail aufruft und Sie daher können Zugriff auf "Mail"? –

1

die Datei Backend funktioniert gut, aber ich finde es ein wenig ein mühsames um das Dateisystem stecken auf E-Mails zu suchen. Sie können den E-Mail-Absender https://github.com/sj26/mailcatcher verwenden, um E-Mails zu erfassen und sie in einer Webbenutzerschnittstelle anzuzeigen.

Um mailcatcher mit Django verwenden Sie so etwas wie die folgenden zu Ihrem settings.py hinzufügen müssen werden:

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 hat auch eine In-Memory-E-Mail-Backend. Weitere Details finden Sie in der Dokumentation unter In-memory backend. Dies ist in Django 1.6 nicht sicher, ob es in etwas früher vorhanden ist.

-1

Verwenden Sie Maildump.

https://github.com/ThiefMaster/maildump

MailDump ist ein Python-basierten Klon des ehrfürchtigen MailCatcher-Tool. Sein Zweck ist es, Entwicklern eine Möglichkeit zu geben, damit Anwendungen E-Mails senden können ohne tatsächliche E-Mails an niemanden gesendet werden. Zusätzlich faul Entwickler bevorzugen könnte dies über einen echten SMTP-Server einfach für die Willen es viel einfacher und schneller einzurichten.

Allerdings erfordert es Python 2.

6

Wenn Sie in Komponententests die beste Lösung sind, ist die In-memory backend von django zu verwenden.

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

Nehmen wir den Fall es als py verwenden. Prüfadapter

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

In jedem Test werden die mail.outbox Reset mit dem Server, so dass es keine Nebenwirkungen zwischen den Tests.

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

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

Andere Tipp: Sie können django email template editor verwenden, die Ihnen helfen können, Ihre E-Mail-Vorlage mit Null-Inline-CSS zu bearbeiten.

0

Verwenden MailHog

von MailCatcher inspiriert, einfacher zu installieren.

Gebaut mit Go - MailHog läuft ohne Installation auf mehreren Plattformen.


Auch hat es eine Komponente Jim, die MailHog Chaos Affe, genannt, die Sie E-Mails mit verschiedenen Problemen zu testen ermöglicht passiert:

Was kann Jim machen?

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

Lesen Sie mehr darüber here.


(Im Gegensatz zu ursprünglichen mailcatcher, die failed on me when sending emails with emoji, encoded in UTF-8 und es war nicht wirklich in der aktuellen Version behebt, arbeitet MailHog gerade.)

0

Warum nicht Ihren eigenen wirklich einfach SMTP Server von inherit starten 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 der SMTP-Server eine E-Mail Anfrage erhalten, können Sie tun, was Sie es wollen.

Im Testcode, tun Sie etwas wie folgt 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) 

zu close() Denken Sie daran, die asyncore.dispatcher von smtp_server.close() Aufruf der asyncore Schleife (stoppen Sie den Server aus hören) zu beenden.

0

Wenn Sie einen Tomcat-Server verfügbar ist, oder andere Servlet-Engine, dann ein schöner Ansatz ist „Post Hoc“, die ein kleiner Server, der genau wie ein SMTP-Server an die Anwendung aussieht, aber es enthält eine Benutzeroberfläche, die erlaubt Sie können die gesendeten E-Mail-Nachrichten anzeigen und überprüfen. Es ist Open Source und frei verfügbar.

Finden Sie unter: Post Hoc GitHub Site

den Blog-Beitrag ansehen: PostHoc: Testing Apps that Send Email

0

https://websocket.email bietet eine einfache Möglichkeit, E-Mail zu testen, mit minimalem Setup Senden (Sie brauchen nicht einmal ein Konto).