django 1.7.8不发送密码重置的电子邮件

lol*_*ter 16 python email django

urls.py该项目的相关部分:

from django.conf.urls import include, url, patterns
urlpatterns = patterns('',

  # other ones ...

  url(r'^accounts/password/reset/$', 
  'django.contrib.auth.views.password_reset',
 {'post_reset_redirect' : '/accounts/password/reset/done/'}),

  url(r'^accounts/password/reset/done/$', 
  'django.contrib.auth.views.password_reset_done'),

  url(r'^accounts/password/reset/(?P<uidb64>[0-9A-Za-z]+)-(?P<token>.+)/$', 
  'django.contrib.auth.views.password_reset_confirm',
 {'post_reset_redirect' : '/accounts/password/done/'}),

  url(r'^accounts/password/done/$', 
  'django.contrib.auth.views.password_reset_complete'),

)
Run Code Online (Sandbox Code Playgroud)

根据要求,这是密码重置形式:

{% extends "site_base.html" %}

{% block title %}Reset Password{% endblock %}

{% block content %}
<p>Please specify your email address to receive instructions for resetting it.</p>

<form action="" method="post">
    <div style="display:none">
        <input type="hidden" value="{{ csrf_token }}" name="csrfmiddlewaretoken">
    </div>
     {{ form.email.errors }}
    <p><label for="id_email">E-mail address:</label> {{ form.email }} <input type="submit" value="Reset password" /></p>
</form>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)

但每当我导航到/accounts/password/reset/页面并填写电子邮件并单击进入页面时,会立即重定向到/accounts/password/reset/done/并且不会发送电子邮件.

我的相关settings.py变量:

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'XXX@gmail.com'
EMAIL_HOST_PASSWORD = 'XXXXXX' 
EMAIL_PORT = 587

DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
SERVER_EMAIL = EMAIL_HOST_USER
Run Code Online (Sandbox Code Playgroud)

我知道电子邮件是有效的,因为我的注册流程django-registration-redux完美无瑕.

有任何想法吗?

rud*_*dra 14

我试图重新创建你的情况,我遇到了以下情况:

  1. 邮件仅发送给活动用户.与没有用户关联的电子邮件将不会收到任何电子邮件(显然).
  2. 我在第270行得到了一个错误表单的保存方法email = loader.render_to_string(email_template_name, c):

NoReverseMatch at/accounts/password/reset /反向'password_reset_confirm',带参数'()'和关键字参数'{'token':'42h-4e68c02f920d69a82fbf','uidb64':b'Mg'}'找不到.尝试过0种模式:[]

您的urls.py似乎不包含任何名为"password_reset_confirm"的网址.所以你应该改变你的网址:

url(r'^accounts/password/reset/(?P<uidb64>[0-9A-Za-z]+)-(?P<token>.+)/$',
  'django.contrib.auth.views.password_reset_confirm',
 {'post_reset_redirect': '/accounts/password/done/'},),
Run Code Online (Sandbox Code Playgroud)

至:

url(r'^accounts/password/reset/(?P<uidb64>[0-9A-Za-z]+)-(?P<token>.+)/$',
  'django.contrib.auth.views.password_reset_confirm',
 {'post_reset_redirect': '/accounts/password/done/'}, name='password_reset_confirm'),
Run Code Online (Sandbox Code Playgroud)

如果您完全设置了电子邮件配置,那么您应该收到没有问题的电子邮件.如果您仍然遇到此问题,请使用调试器检查其获取异常的位置.

PS:我已经使用django 1.7.8进行了测试,模板位于:Python34\Lib\site-packages\django\contrib\admin\templates\registration.正如您在问题中所写的那样使用了网址和视图.


小智 5

当你邮寄到^accounts/password/reset/$django.contrib.auth.views.password_reset功能运行。这将使用默认的django.contrib.auth.forms.PasswordResetForm类来验证电子邮件。

您应该注意到,只有与提供的电子邮件匹配的活动用户,并且只有具有可用密码的活动用户才会发送电子邮件。

尝试在Django命令行管理程序中使用以下功能:

from django.contrib.auth.models import get_user_model

def check_password_reset_cond(email):
     for u in get_user_model().objects.filter(email__iexact=email):
         assert u.is_active
         assert u.has_usable_password()
Run Code Online (Sandbox Code Playgroud)