[英]django 1.7.8 not sending emails with password reset
項目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'),
)
根據要求,這是密碼重置表格:
{% 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 %}
但是每當我導航到/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
我知道電子郵件有效,因為我使用django-registration-redux
注冊流程完美無缺。
有任何想法嗎?
我試圖重現您的情況,但我遇到了以下情況:
email = loader.render_to_string(email_template_name, c)
得到了一個錯誤表單的保存方法:NoReverseMatch at /accounts/password/reset/ Reverse for 'password_reset_confirm' with arguments '()' and keyword arguments '{'token': '42h-4e68c02f920d69a82fbf', 'uidb64': b'Mg'}' not found。 嘗試了 0 個模式:[]
您的 urls.py 似乎不包含任何名為“password_reset_confirm”的 url。 所以你應該改變你的網址:
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/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'),
如果您完美地設置了電子郵件配置,那么您應該可以毫無問題地收到電子郵件。 如果您仍然遇到此問題,請使用調試器檢查它在哪里獲得異常。
PS:我已經用 django 1.7.8 測試過,模板位於: Python34\\Lib\\site-packages\\django\\contrib\\admin\\templates\\registration
。 使用您在問題中所寫的網址和視圖。
當您 POST 到^accounts/password/reset/$
, django.contrib.auth.views.password_reset函數會運行。 這將使用默認的django.contrib.auth.forms.PasswordResetForm類來驗證電子郵件。
您應該注意到電子郵件僅發送給與提供的電子郵件匹配的活動用戶,並且僅當他們擁有可用密碼時。
嘗試在 Django 管理 shell 中使用以下函數:
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()
您的templates
文件夾中有電子郵件模板嗎?
registration/password_reset_email.html
registration/password_reset_subject.txt
好的,很可能是表單清理方法失敗了,並且您沒有捕獲該錯誤。 所以你只是在不發送郵件的情況下獲得重定向,並且不知道為什么。 在 clean() 中拋出的任何驗證錯誤都將顯示在 non_field_errors 中。 您需要將 {{form.non_field_errors}} 添加到您的頁面中才能看到它們。 嘗試這個:
<form method="post">{% csrf_token %}
{{{form.non_field_errors}}
{{ form.email.errors }}
<p><label for="id_email">E-mail address:</label> {{ form.email }} <input type="submit" value="Reset password" /></p>
</form>
我肯定會檢查垃圾郵件文件夾。 因為有時一些電子郵件過濾器會非常嚴厲地對待帶有鏈接的文本電子郵件。
我建議使用(一些帶有)python 調試器的 IDE,並在 pdb(python 調試器)的幫助下遍歷 django.contrib.auth.form.PasswordResetForm.save 和 django.contrib.auth.views.password_reset 看看什么不起作用。
對於 mac 用戶,特別是如果您在普通Terminal
旁邊有iTerm
,並且可能您已經在.bash_profile
的環境變量之前設置,請在~/.zshrc
上再次設置它們(如果您使用 iTerm 運行 Django 項目):
export EMAIL_USER='email@gmail.com'
export EMAIL_PASS='password'
重新加載文件~/.zshrc
, source ~/.zshrc
,或者簡單地關閉並再次打開iTerm
。
當然,之前您已在電子郵件設置中打開了安全性較低的選項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.