2011-01-09 210 views
60

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

+0

您的本地盒子的操作系统在这里可能是一个有用的东西......您实际上并不需要电子邮件服务器,只需要通过SMTP端口连接到电子邮件服务器...和可能的用户/密码。 – Spacedman 2011-01-09 22:21:52

+0

[虚拟SMTP服务器用于测试发送电子邮件的应用程序]的可能的重复(http://stackoverflow.com/questions/1006650/dummy-smtp-server-for-testing-apps-that-send-email) – 2011-04-07 18:23:36

回答

113

您可以configure your application to use the Console Backend发送电子邮件。它将电子邮件写入标准输出而不是发送。

更改您的settings.py来加入这一行:

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

不要忘记删除它的生产。

58

Python有一个小小的SMTP服务器built-in。您可以在第二个控制台使用此命令启动它:

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

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

你必须Django的配置您的settings.py使用此服务器:

EMAIL_HOST = 'localhost' 
EMAIL_PORT = 1025 
+0

请注意,您的如果电子邮件服务器未启动时它尝试发送电子邮件,则可能会引发异常。 `fail_silently = False`是`send_mail`的默认值。 – 2013-03-26 04:16:11

+0

尽管Daniel Hepper的回答无疑是对于所提问题的正确答案,但我更喜欢这个答案,因为这是一个通用的解决方案,无论环境如何都能正常工作。 (当然,Upvotes也是如此。) – Teekin 2017-05-09 10:20:58

29

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

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

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

27

如果您的测试从django.test.testcases.TestCase扩展,则不需要做任何事情。 Django会将EmailBackend替换为“特殊”的。然后,你可以测试你会一直这样发:

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 

发件箱目标是当运行 蟒蛇manage.py测试获得注入到邮件的特殊对象。

11

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

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

您的电子邮件setttings..All电子邮件的顶部将被转移到“your_email例如@ .COM”

快乐编码...

7

这阐述了从本杰明答案。如果我没有像安装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包括此项, botom:

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

现在测试您的电子邮件,或者您可以在./manage中执行此操作。PY壳像这样另一个终端窗口:

python manage.py shell 

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

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

无需使用任何真正的电子邮件,因为你会在你的终端看到的一切。您可以将其转储到适当的容器,如.html进行进一步测试。