在没有电子邮件服务器的情况下测试发送电子邮件


73

我有一个发送电子邮件的Django应用程序。生产服务器具有电子邮件服务器,但是我的本地邮箱没有。我希望能够在本地测试电子邮件的发送。有什么办法可以让django不通过电子邮件服务器发送它,而仅将其打印到文件或控制台上?


您可能需要在此处了解本地邮箱的操作系统...无论如何,实际上您不需要邮箱上的电子邮件服务器,您所需要的只是通过SMTP端口通过网络连接到电子邮件服务器...以及可能的用户名/密码。
Spacedman 2011年

Answers:


135

您可以将应用程序配置为使用控制台后端发送电子邮件。它以标准格式写电子邮件,而不是发送电子邮件。

更改您的settings.py以包括以下行:

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

不要忘记将其删除以进行生产。


20
更好的是,将其放在开发设置文件中,不要将其添加到生产中。
ech

3
甚至更好的是,使用环境变量来实现
网状网2015年

1
如果您使用mail_admins,请记住设置ADMINS为其他内容,否则什么都不会打印到stdout。同样适用于mail_managers
Flimm

82

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

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

这将仅打印localhost:1025控制台中发送到的所有邮件。

您必须将Django配置为在您的服务器中使用此服务器settings.py

EMAIL_HOST = 'localhost'
EMAIL_PORT = 1025

请注意,如果您的应用在电子邮件服务器未启动时尝试发送电子邮件,则可能会引发异常。fail_silently=False是的默认设置send_mail
蒂姆·弗莱彻

尽管对于提出的问题,丹尼尔·赫珀的答案无疑是正确的,但我更喜欢这个答案,因为它是一个通用的解决方案,无论环境如何,都可以使用。(当然,两者都支持。)
Teekin

41

您可以将应用程序配置为将电子邮件写到临时文件中,而不是发送它们(类似于Daniel Hepper的回答)。

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

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


34

如果您的测试来自django.test.testcases.TestCase,则无需执行任何操作。Django会将EmailBackend替换为“特殊”电子邮件。然后,您可以测试发送的内容,如下所示:

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.py test时会注入到邮件中。


13

这详细说明了本杰明的答案。如果我没有安装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应用代码进行测试,您可以临时更改settings.py使其包含在底部:

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

现在测试一下您的电子邮件,或者您可以在另一个终端窗口的./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)

无需使用任何真实的电子邮件,因为您将在终端中看到所有内容。您可以将其转储到适当的容器(如.html)中,以进行进一步测试。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.