忘记密码电子邮件未在Django中发送

时间:2015-07-30 13:20:04

标签: python django

我正在尝试实施密码重置功能。<​​/ p>

我的网址包含:

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

网址路由工作正常,但不会发送电子邮件。

如果我尝试使用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)

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

检查send method source code

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

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

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

由于