我有一个发送电子邮件的Django应用程序。生产服务器具有电子邮件服务器,但是我的本地邮箱没有。我希望能够在本地测试电子邮件的发送。有什么办法可以让django不通过电子邮件服务器发送它,而仅将其打印到文件或控制台上?
我有一个发送电子邮件的Django应用程序。生产服务器具有电子邮件服务器,但是我的本地邮箱没有。我希望能够在本地测试电子邮件的发送。有什么办法可以让django不通过电子邮件服务器发送它,而仅将其打印到文件或控制台上?
Answers:
您可以将应用程序配置为使用控制台后端发送电子邮件。它以标准格式写电子邮件,而不是发送电子邮件。
更改您的settings.py以包括以下行:
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
不要忘记将其删除以进行生产。
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
。
如果您的测试来自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时会注入到邮件中。
这详细说明了本杰明的答案。如果我没有安装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)中,以进行进一步测试。
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”
祝您编程愉快...