python - 为什么 Django 的 send_mail 在测试时不起作用?

标签 python django email

我有一个应用程序可以导入多个用户电子邮件地址并为他们创建帐户。为了让他们设置自己的密码,我尝试使用 django 的 PasswordResetForm(在 django.contrib.auth.forms 中)。一旦创建了用户帐户,就会调用密码重置:

def reset_password(person):
    form = PasswordResetForm({'email': person.email})
    if form.is_valid():
        form.save(from_email='myname@myserver.com')

除了包含执行此操作的单元测试之外,我没有进一步进行测试:

import password_reset_module
class TestPasswordReset(TestCase):
     def setUp(self):
         p = Person(email='test@test.com')
     def test_send(self):
         password_reset_module.reset_password(p)

没有断言,现在我只想通过监视我运行的控制台来查看是否有邮件发送:

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

保存表单调用django的send_mail。运行测试用例时,send_mail 方法返回 1。但是,控制台中没有显示任何邮件。奇怪的是,从 django 的交互式 shell 调用 send_mail:

python manage.py shell

工作正常。邮件显示在控制台中。在浏览器中单击忘记密码链接也会导致发送邮件。

我也尝试过基于文件的电子邮件后端,但无济于事。 当前 settings.py 电子邮件设置:

EMAIL_USE_TLS = False
EMAIL_HOST = 'localhost'
DEFAULT_FROM_EMAIL = 'myname@myserver.com'
EMAIL_HOST_USER = ''
EMAIL_HOST_PASSWORD = ''
EMAIL_PORT = 1025

现在想知道我在调用密码重置时是否遗漏了什么,或者手头是否存在邮件服务器配置问题?

最佳答案

您的配置被否决

在“电子邮件服务”部分, Django testing documentation说:

Django's test runner automatically redirects all Django-sent email to a dummy outbox. [...] During test running, each outgoing email is saved in django.core.mail.outbox. This is a simple list of all EmailMessage instances that have been sent.

嗯?

Django 测试运行器实际上会为您配置不同的电子邮件后端(称为 locmem )。 如果你只想做单元测试就很方便 (没有与实际的电子邮件服务器集成),但是 如果您不知道,那将是非常令人惊讶的。

(我没有使用 Django 测试运行器 manage.py test, 但无论如何它都会发生,大概是因为我有 pytest-django 安装后神奇地修改了我的 py.test。)

如果你想覆盖覆盖并使用电子邮件配置 在您的 settings 模块中给出,您需要重新设置的是 电子邮件后端的设置,例如像这样:

@django.test.utils.override_settings(
    EMAIL_BACKEND='django.core.mail.backends.smtp.EmailBackend')
def test_send_email_with_real_SMTP(self):
   ...

关于python - 为什么 Django 的 send_mail 在测试时不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17171406/

相关文章:

ruby-on-rails - 带有内联附件的 Rails 邮件程序错误

javascript - jQuery 选择器检查特定文本(域扩展)

Python比较操作,if和None

python - Scraper 不断抓取相同的链接

python - GridSearchCV - 错误 : The truth value of an array with more than one element is ambiguous. 使用 a.any() 或 a.all()

python - django.core.exceptions.FieldError : Cannot resolve keyword 'timestamp' into field

Django 休息框架和外部 api

python - 为什么 django 提示我还没有设置我的引擎?

python - 在 python 中运行一个子进程,并在 "real time"中显示输出并将其保存到变量中

php - 当新产品添加到数据库时如何自动向用户发送电子邮件?