我有一个发送电子邮件的 Django 应用程序。生产服务器有一个电子邮件服务器,但我的本地盒子没有。我希望能够在本地测试发送电子邮件。有什么方法可以让 django 不通过电子邮件服务器发送它而只打印到文件或控制台?
6 回答
您可以将应用程序配置为使用控制台后端发送电子邮件。它将电子邮件写入标准输出而不是发送它们。
更改您的 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
您可以将您的应用程序配置为将电子邮件写入临时文件而不是发送它们(类似于 Daniel Hepper 的回答)。
EMAIL_BACKEND = 'django.core.mail.backends.filebased.EmailBackend'
EMAIL_FILE_PATH = 'tmp/email-messages/'
这会将每条新消息保存为单独的文件。如果您要发送大量电子邮件,并且不想使用回滚,这很有用。
如果您的测试从 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 测试时会被注入到邮件中。
这详细说明了本杰明的回答。如果我没有安装 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”
快乐的编码...