testing没有电子邮件服务器发送电

我有一个Django应用程序发送电子邮件。 生产服务器有一个电子邮件服务器,但我的本地盒子没有。 我希望能够testing本地电子邮件的发送。 有没有什么办法,我可以让Django不通过电子邮件服务器发送,只是打印到文件或控制台?

您可以configuration您的应用程序以使用控制台后端发送电子邮件。 它将电子邮件写入标准输出而不是发送。

改变你的settings.py以包含这一行:

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

不要忘记删除它的生产。

Python有一个内置的小SMTP服务器。 您可以使用以下命令在第二个控制台中启动它:

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

这将简单地打印在控制台中发送到localhost:1025所有邮件。

您必须configurationDjango才能在settings.py使用此服务器:

 EMAIL_HOST = 'localhost' EMAIL_PORT = 1025 

您可以configuration您的应用程序将电子邮件写入临时文件而不是发送它们(类似于Daniel Hepper的答案)。

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

这将每个新消息保存为一个单独的文件。 如果您正在发送大量电子邮件,并且不想使用回滚,则这很有用。

如果你的testing从django.test.testcases.TestCase扩展,那么就不需要做任何事情。 Django会将EmailBackendreplace为“特殊”的。 那么你可以testing一下这样发送的内容:

 def testMethodThatSendAEmail(self): ... from django.core import mail object.method_that_send_email(to='me@example.com') self.assertEqual(len(mail.outbox), 1) self.assertEqual(mail.outbox[0].to, ['me@example.com']) ...#etc 

发件箱对象是一个特殊的对象,当python manage.pytesting运行时被注入邮件。

有一个很酷的应用程序为这个由caktus https://github.com/caktus/django-email-bandit只需将此添加到您的settings.py文件:;

 EMAIL_BACKEND = 'bandit.backends.smtp.HijackSMTPBackend' BANDIT_EMAIL = 'your_email@example.com' 

在您的电子邮件设置之上..所有电子邮件将被转移到“your_email@example.com”

快乐编码…

本杰明回答了这个问题。 我testing电子邮件的一种方法是,如果我没有像postfix,sendmail或exim这样的本地电子邮件服务器,那么运行python电子邮件服务器。 您可以使用sudo在端口25上运行它,或者使用端口> 1024(保留端口):

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

要使用当前的django应用程序代码进行testing,您可以暂时更改settings.py,以将其包含在本文中:

 EMAIL_HOST, EMAIL_PORT, EMAIL_HOST_USER, EMAIL_HOST_PASSWORD = 'localhost', 1025, None, None 

现在testing你的电子邮件,或者你可以在另一个terminal窗口的./manage.py shell中这样做:

 python manage.py shell 

并粘贴此代码发送电子邮件:

 from django.core.mail import send_mail​ send_mail('Subject here', 'Here is the message.', 'messanger@localhost.com',['any@email.com'], fail_silently=False) 

没有必要使用任何真正的电子邮件,因为你会看到你的terminal中的一切。 您可以将其转储到适当的容器,如.html进一步testing。