it-swarm.com.de

Testen Sie das Senden von E-Mails ohne E-Mail-Server

Ich habe eine Django - Anwendung, die eine E-Mail sendet. Der Produktionsserver hat einen E-Mail-Server, meine lokale Box jedoch nicht. Ich möchte das Senden von E-Mails vor Ort testen können. Gibt es eine Möglichkeit? dass ich kann Django nicht über den E-Mail-Server senden und nur in eine Datei oder Konsole ausdrucken?

65
asawilliams

Sie können Konfigurieren Sie Ihre Anwendung für die Verwendung des Konsolen-Backends zum Senden von E-Mails. Es schreibt E-Mails nach Standard, anstatt sie zu versenden.

Ändern Sie Ihre settings.py, um diese Zeile einzuschließen:

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

Vergessen Sie nicht, es für die Produktion zu entfernen.

124
Daniel Hepper

Python hat einen kleinen SMTP-Server eingebaut . Sie können es in einer zweiten Konsole mit dem folgenden Befehl starten:

python -m smtpd -n -c DebuggingServer localhost:1025

Dadurch werden einfach alle an localhost:1025 In der Konsole gesendeten E-Mails gedruckt.

Sie müssen Django konfigurieren, um diesen Server in Ihrem settings.py Zu verwenden:

EMAIL_Host = 'localhost'
EMAIL_PORT = 1025
74

Sie können Ihre Anwendung so konfigurieren, dass E-Mails nicht gesendet, sondern in temporäre Dateien geschrieben werden (ähnlich der Antwort von Daniel Hepper).

EMAIL_BACKEND = 'Django.core.mail.backends.filebased.EmailBackend'
EMAIL_FILE_PATH = 'tmp/email-messages/'

Dadurch wird jede neue Nachricht als separate Datei gespeichert. Nützlich, wenn Sie viele E-Mails senden und nicht den Scrollback verwenden möchten.

38

Wenn sich Ihre Tests von Django.test.testcases.TestCase erstrecken, muss nichts getan werden. Django ersetzt das EmailBackend durch ein "spezielles". Dann können Sie testen, was so gesendet worden wäre:

def testMethodThatSendAEmail(self):
    ...
    from Django.core import mail
    object.method_that_send_email(to='[email protected]')
    self.assertEqual(len(mail.outbox), 1)
    self.assertEqual(mail.outbox[0].to, ['[email protected]'])
    ...#etc

Das Outbox-Objekt ist ein spezielles Objekt, das in Mail eingefügt wird, wenn python manage.py test ausgeführt wird.

32
Julien Grenier

Es gibt eine coole App von caktus https://github.com/caktus/Django-email-bandit Fügen Sie dies einfach zu Ihrer settings.py-Datei hinzu:

EMAIL_BACKEND = 'bandit.backends.smtp.HijackSMTPBackend'
BANDIT_EMAIL = '[email protected]'

Zusätzlich zu Ihren E-Mail-Einstellungen. Alle E-Mails werden an "[email protected]" umgeleitet.

Viel Spaß beim Codieren ...

11
Njogu Mbau

Dies geht auf die Antwort von Benjamin ein. Eine Möglichkeit, E-Mails zu testen, wenn kein lokaler E-Mail-Server wie Postfix, Sendmail oder Exim installiert ist, besteht darin, den E-Mail-Server python) auszuführen. Sie können ihn auf Port 25 mit Sudo ausführen. oder verwenden Sie einfach einen Port> 1024 (reservierte Ports):

python -m smtpd -n -c DebuggingServer localhost:1025
#Sudo python -m smtpd -n -c DebuggingServer localhost:25

Zum Testen mit Ihrem aktuellen Django App-Code können Sie settings.py vorübergehend ändern, um dies im Botom einzuschließen:

EMAIL_Host, EMAIL_PORT, EMAIL_Host_USER, EMAIL_Host_PASSWORD = 'localhost', 1025, None, None

Testen Sie jetzt Ihre E-Mails oder tun Sie dies in der ./manage.py-Shell in einem anderen Terminalfenster wie folgt:

python manage.py Shell

Und fügen Sie diesen Code ein, um eine E-Mail zu senden:

from Django.core.mail import send_mail​
send_mail('Subject here', 'Here is the message.', '[email protected]',['[email protected]'], fail_silently=False)

Sie müssen keine echten E-Mails verwenden, da Sie alles in Ihrem Terminal sehen. Sie können es für weitere Tests in den entsprechenden Container wie .html kopieren.

10
radtek