测试发送没有电子邮件服务器

时间:2011-01-09 21:40:43

标签: django mail-server

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

6 个答案:

答案 0 :(得分:123)

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

更改您的settings.py以包含此行:

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

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

答案 1 :(得分:71)

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

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

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

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

EMAIL_HOST = 'localhost'
EMAIL_PORT = 1025

答案 2 :(得分:37)

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

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

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

答案 3 :(得分:32)

如果您的测试来自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测试。

答案 4 :(得分:11)

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'

快乐的编码......

答案 5 :(得分:10)

这详细阐述了本杰明的答案。我测试电子邮件的一种方法是,如果我没有像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 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)进行进一步测试。