簡體   English   中英

django 1.7.8 不發送帶有密碼重置的電子郵件

[英]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注冊流程完美無缺。

有任何想法嗎?

我試圖重現您的情況,但我遇到了以下情況:

  1. 郵件僅發送給活動用戶。 與沒有用戶關聯的電子郵件將不會收到任何電子郵件(顯然)。
  2. 我在第 270 行為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 看看什么不起作用。

domtes回答為我解決了這個問題,但我想強調一下這個潛在的原因:

如果您嘗試重置的用戶當前(重置之前)密碼無效,Django 將不會發送重置電子郵件!

就我而言,我不小心覆蓋了管理員(自定義用戶模型 + LastPass)中的密碼字段,之后該用戶不再重置。

對於 mac 用戶,特別是如果您在普通Terminal旁邊有iTerm ,並且可能您已經在.bash_profile的環境變量之前設置,請在~/.zshrc上再次設置它們(如果您使用 iTerm 運行 Django 項目):

export EMAIL_USER='email@gmail.com'
export EMAIL_PASS='password'

重新加載文件~/.zshrcsource ~/.zshrc ,或者簡單地關閉並再次打開iTerm

當然,之前您已在電子郵件設置中打開了安全性較低的選項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM