Ich muss testen, ob meine Django-Anwendung E-Mails mit korrektem Inhalt sendet. Ich möchte mich nicht auf externe Systeme verlassen (wie ein Ad-hoc- Google Mail- Konto), da ich den eigentlichen E-Mail-Dienst nicht teste ...
Ich möchte die E-Mails möglicherweise lokal in einem Ordner speichern, während sie gesendet werden. Irgendwelche Tipps, wie man es erreicht?
Antworten:
Sie können ein Datei-Backend zum Senden 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 gespeichert, den Sie angeben können!
quelle
Das Django-Testframework verfügt über einige integrierte Hilfsprogramme, die Sie beim Testen des E-Mail-Dienstes unterstützen .
Beispiel aus Dokumenten (Kurzversion):
quelle
send_mail
nicht verwendet werden kann.mail
?mail.outbox
wennsend_mail
es in einer anderen Funktion aufgerufen wird.mail.outbox[0].body
E- Mails aus dem Core importieren, wird Ihnen die gesendete E- Mail angezeigt, auch wenn diese an einersend_mail
anderen Stelle ausgeführt wird.Wenn Sie sich für Unit-Tests interessieren, ist die beste Lösung die Verwendung des von django bereitgestellten In-Memory-Backends .
Nehmen Sie den Fall der Verwendung als py.test- Vorrichtung
Bei jedem Test wird das
mail.outbox
mit dem Server zurückgesetzt, sodass zwischen den Tests keine Nebenwirkungen auftreten.quelle
Verwenden Sie MailHog
Außerdem enthält es eine Komponente namens Jim , den MailHog Chaos Monkey , mit der Sie das Senden von E-Mails mit verschiedenen Problemen testen können:
Lesen Sie hier mehr darüber .
(Im Gegensatz zum ursprünglichen Mailcatcher, der beim Senden von E-Mails mit Emoji fehlgeschlagen ist, in UTF-8 codiert und in der aktuellen Version NICHT wirklich behoben wurde, funktioniert MailHog einfach.)
quelle
Für jedes Projekt, bei dem keine Anhänge gesendet werden müssen, verwende ich gesendet werden müssen django-mailer. Dies hat den Vorteil, dass alle ausgehenden E-Mails in einer Warteschlange landen, bis ich sie sende, und selbst nachdem sie gesendet wurden, werden sie protokolliert. All dies ist im Admin sichtbar, sodass Sie schnell überprüfen können, welchen E-Mail-Code Sie in die Intertubes abfeuern möchten.
quelle
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.
quelle
Durch das Patchen von SMTPLib zu Testzwecken können Sie das Senden von E-Mails testen, ohne sie zu senden.
quelle
Wenn Sie einige der Teile hier zusammenbinden, finden Sie hier ein einfaches Setup, das auf basiert
filebased.EmailBackend
. Dadurch wird eine Listenansicht erstellt, die mit den einzelnen Protokolldateien verknüpft ist, deren Dateinamen bequem mit einem Zeitstempel versehen sind. Durch Klicken auf einen Link in der Liste wird diese Meldung im Browser angezeigt (roh):die Einstellungen
Aussicht
Vorlage
URLs
quelle
Warum starten Sie nicht Ihren eigenen wirklich einfachen SMTP-Server, indem Sie von
smtpd.SMTPServer
und erbenthreading.Thread
:process_message wird immer dann aufgerufen, wenn Ihr SMTP-Server eine E-Mail-Anfrage erhält. Sie können dort tun, was Sie wollen.
Gehen Sie im Testcode folgendermaßen vor:
Denken Sie daran,
close()
dieasyncore.dispatcher
durch den Aufrufsmtp_server.close()
der asyncore Schleife zu beenden (stoppen Sie den Server von Hören).quelle
Wenn Sie einen TomCat-Server oder eine andere Servlet-Engine zur Verfügung haben, ist "Post Hoc" ein guter Ansatz, bei dem es sich um einen kleinen Server handelt, der für die Anwendung genau wie ein SMTP-Server aussieht, der jedoch eine Benutzeroberfläche enthält, mit der Sie und anzeigen können Überprüfen Sie die gesendeten E-Mail-Nachrichten. Es ist Open Source und frei verfügbar.
Finden Sie es unter: Post Hoc GitHub Site
Siehe den Blog-Beitrag: PostHoc: Testen von Apps, die E-Mails senden
quelle