Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 测试在没有电子邮件服务器的情况下发送电子邮件_Django_Email_Mail Server - Fatal编程技术网

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

Django 测试在没有电子邮件服务器的情况下发送电子邮件,django,email,mail-server,Django,Email,Mail Server,我有一个Django应用程序可以发送电子邮件。生产服务器有一个电子邮件服务器,但我的本地邮箱没有。我想能够在本地测试发送电子邮件。有没有办法让django不通过电子邮件服务器发送它,而直接打印到文件或控制台?Python有一个小型SMTP服务器。您可以使用以下命令在第二个控制台中启动它: python -m smtpd -n -c DebuggingServer localhost:1025 这将在控制台中简单地打印发送到localhost:1025的所有邮件 您必须将Django配置为在设置

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

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

python -m smtpd -n -c DebuggingServer localhost:1025
这将在控制台中简单地打印发送到
localhost:1025
的所有邮件

您必须将Django配置为在
设置中使用此服务器。py

EMAIL_HOST = 'localhost'
EMAIL_PORT = 1025
您可以选择发送电子邮件。它向standard out发送电子邮件,而不是发送

更改settings.py以包括此行:

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

不要忘记在生产时删除它。

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


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

如果您的测试扩展自django.test.testcases.TestCase,则无需执行任何操作。Django将把EmailBackend替换为“特殊”的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测试正在运行。

caktus为此提供了一个很酷的应用程序 只需将其添加到settings.py文件:

EMAIL_BACKEND = 'bandit.backends.smtp.HijackSMTPBackend'
BANDIT_EMAIL = 'your_email@example.com'
在您的电子邮件设置之上..所有电子邮件将转移到“您的_email@example.com"


快乐编码…

这详细阐述了本杰明的答案。如果没有安装postfix、sendmail或exim等本地电子邮件服务器,我测试电子邮件的一种方法是运行python电子邮件服务器。您可以使用sudo在端口25上运行它,或者只使用>1024的端口(保留端口):

要使用当前的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)中进行进一步测试。

在这里,您可以了解本地设备的操作系统。。。无论如何,你实际上并不需要邮箱服务器,你所需要的只是通过SMTP端口与邮箱服务器建立网络连接。。。和可能的用户/密码。注意:如果您的应用在电子邮件服务器未启动时尝试发送电子邮件,则可能会引发异常
fail\u silent=False
send\u mail
的默认值。尽管Daniel Hepper的答案对于提出的问题无疑是正确的,但我更喜欢这个答案,因为它是一个通用的解决方案,无论环境如何,都能正常工作。(当然,这两个选项都要向上投票。)更好的是,将其放入开发设置文件中,不要将其添加到生产中。或者更好的是,。如果使用,请记住设置为某个值,否则任何内容都无法打印到标准输出。同样,对于
邮件管理者来说
。伙计,这太棒了。
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)