【问题标题】:Forgot password emails not sending in Django忘记密码电子邮件不在 Django 中发送
【发布时间】:2015-10-21 21:09:40
【问题描述】:

我正在尝试实现密码重置功能。

我的网址包含:

url(r'^password_reset/$','django.contrib.auth.views.password_reset', {'template_name': 'resetpassword.html', 'post_reset_redirect' : '/password_reset/mailed/'},
name="password_reset"),

url(r'^password_reset/mailed/$',
'django.contrib.auth.views.password_reset_done',{'template_name': 'resetpassword_mailed.html'}),

url(r'^password_reset/(?P<uidb36>[0-9A-Za-z]{1,13})-(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$',
'django.contrib.auth.views.password_reset_confirm', 
{'post_reset_redirect' : '/password_reset/complete/'}),

url(r'^password_reset/complete/$', 
'django.contrib.auth.views.password_reset_complete',{'template_name': 'resetpassword_complete.html'}),

和 settings.py:

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.mail.ru'
EMAIL_HOST_USER = 'noreply@mysite.com'
DEFAULT_FROM_EMAIL = 'noreply@mysite.com'
EMAIL_HOST_PASSWORD = 'password'
EMAIL_PORT = 587    
EMAIL_USE_TLS = True

URL 路由工作正常,但是没有发送电子邮件。

如果我尝试使用 Django shell 并测试发送:

email = EmailMessage('Subject', 'Body', to=['test@email.com'])
email.send()

而且效果也很好。

我该如何解决这个问题?我没有收到任何错误消息,也不知道如何调试。

UPD 我发现在 django/contrib/auth/views.py: password_reset 方法中我总是去

else:
    post_reset_redirect = resolve_url(post_reset_redirect)

部分并且从不实际发送电子邮件。怎么样?

if post_reset_redirect is None:
    post_reset_redirect = reverse('password_reset_done')
else:
    post_reset_redirect = resolve_url(post_reset_redirect)
if request.method == "POST":
    form = password_reset_form(request.POST)
    if form.is_valid():
        print 'reset form valid'
        opts = {
            'use_https': request.is_secure(),
            'token_generator': token_generator,
            'from_email': from_email,
            'email_template_name': email_template_name,
            'subject_template_name': subject_template_name,
            'request': request,
            'html_email_template_name': html_email_template_name,
        }
        if is_admin_site:
            opts = dict(opts, domain_override=request.get_host())
        form.save(**opts)
        return HttpResponseRedirect(post_reset_redirect)

【问题讨论】:

  • 你在用manage.py runserver吗?
  • @Anentropic 是的,为什么?
  • 尝试email.send(fail_silently=False) 并在此处发布错误。
  • @Leistungsabfall email.send 没有错误(fail_silently=False)。从 shell 发送电子邮件工作正常
  • 在 django/contrib/auth/forms.PasswordResetForm send_mail 方法设置断点并检查那里是否一切顺利。

标签: python django


【解决方案1】:

如果用户没有密码(例如使用create_user() 创建),密码重置将不会发送任何内容!确保您也通过以下方式创建密码: password = User.objects.make_random_password()

然后,还需要设置密码并保存,例如

user.set_password(password)
user.save()

【讨论】:

    【解决方案2】:

    这可能是一个微不足道的问题,但您用来测试的用户具有有效的电子邮件集?如果为空,则不会发送电子邮件,也不会引发异常。

    检查send method source code

    查看是否正在生成电子邮件的其他方法是使用控制台后端:

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

    然后查看控制台,因为电子邮件应该出现在那里。

    谢谢

    【讨论】:

    • 谢谢。是的,用户有一个有效的电子邮件。我已经尝试了您对 EMAIL_BACKEND 的建议,但没有任何改变,控制台中也没有出现任何内容。
    • @seledkalebedka,您是否通过 POST 将数据提交到“password_reset”网址? Django 只会在 "method == 'POST'" 和 "form.is_valid()" 时发送邮件 你已经解决了吗?谢谢
    猜你喜欢
    • 1970-01-01
    • 2016-08-31
    • 2011-02-19
    • 2012-02-29
    • 1970-01-01
    • 2015-06-22
    • 2013-06-13
    • 2013-03-04
    • 2014-08-11
    相关资源
    最近更新 更多