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

asa*_*ams 66 email django mail-server

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

Dan*_*per 126

您可以将应用程序配置为使用控制台后端发送电子邮件.它将电子邮件写入标准输出而不是发送它们.

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

EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
Run Code Online (Sandbox Code Playgroud)

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

  • 更好的是,将它放在开发设置文件中,不要将其添加到生产环境中. (18认同)
  • 或者甚至更好,[用环境变量做](http://12factor.net/config). (3认同)

Ben*_*end 75

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

python -m smtpd -n -c DebuggingServer localhost:1025
Run Code Online (Sandbox Code Playgroud)

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

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

EMAIL_HOST = 'localhost'
EMAIL_PORT = 1025
Run Code Online (Sandbox Code Playgroud)


Mat*_*kel 39

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

EMAIL_BACKEND = 'django.core.mail.backends.filebased.EmailBackend'
EMAIL_FILE_PATH = 'tmp/email-messages/'
Run Code Online (Sandbox Code Playgroud)

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


Jul*_*ier 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
Run Code Online (Sandbox Code Playgroud)

outbox对象是一个特殊的对象,在运行python manage.py测试时会被注入到邮件中.


Njo*_*bau 11

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

EMAIL_BACKEND = 'bandit.backends.smtp.HijackSMTPBackend'
BANDIT_EMAIL = 'your_email@example.com'
Run Code Online (Sandbox Code Playgroud)

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

快乐的编码......


rad*_*tek 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
Run Code Online (Sandbox Code Playgroud)

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

EMAIL_HOST, EMAIL_PORT, EMAIL_HOST_USER, EMAIL_HOST_PASSWORD = 'localhost', 1025, None, None
Run Code Online (Sandbox Code Playgroud)

现在测试你的电子邮件,或者你可以在另一个终端窗口中的./manage.py shell中执行此操作,如下所示:

python manage.py shell
Run Code Online (Sandbox Code Playgroud)

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

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

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