簡體   English   中英

如何使用 Django 發送電子郵件以重置密碼?

[英]How to send emails with Django for Password Reset?

我正在嘗試將password change link發送到用戶將鍵入的電子郵件地址。 我輸入了我的電子郵件,但它沒有向我發送任何鏈接。 如何解決這個問題?

網址

urlpatterns = [
    path('password_reset/',auth_views.PasswordResetView.as_view
    (template_name='users/password_reset.html'),
     name='password_reset'),
    path('password_reset_done/',auth_views.PasswordResetDoneView.as_view
    (template_name='users/password_reset_done.html'),
     name='password_reset_done'),
    path('password_reset_confirm/',auth_views.PasswordResetConfirmView.as_view
     (template_name='users/password_reset_confirm.html'),
      name='password_reset_confirm')]

設置.py

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = os.environ.get('EMAIL_USER')
EMAIL_HOST_PASSWORD = os.environ.get('EMAIL_PASS')

我用這些作為我的網址。 我立即發現與您的主要區別在於密碼重置確認。 確保您傳遞令牌。

from django.contrib.auth import views as auth_views


path('password-reset/', auth_views.PasswordResetView.as_view(template_name='users/password_reset.html'), name='password_reset'),
path('password-reset-confirm/<uidb64>/<token>/', auth_views.PasswordResetConfirmView.as_view(template_name='users/password_reset_confirm.html'), name='password_reset_confirm'),
path('password-reset/done/', auth_views.PasswordResetDoneView.as_view(template_name='users/password_reset_done.html'), name='password_reset_done'),
path('password-reset-complete/', auth_views.PasswordResetCompleteView.as_view(template_name='users/password_reset_complete.html'),

我的設置如下所示

EMAIL_HOST = 'smtp.gmail.com'
EMAIL_POST = 587
EMAIL_USE_TLS = True


EMAIL_HOST_USER = os.environ.get('traces_email')
EMAIL_HOST_PASSWORD = os.environ.get('traces_email_password')

另外請注意,您需要設置一個g-mail帳戶,以允許Django或任何其他應用程序訪問它,該帳戶無法自動運行。 執行此操作后收到的密碼與通常登錄時使用的密碼不同。 這可能是導致您出現問題的原因。

正如我看到的那樣,您在密碼重置確認URL中缺少令牌,這也許也是您沒有令牌生成器的問題。

from django.contrib.auth.tokens import PasswordResetTokenGenerator
from django.utils import six


class TokenGenerator(PasswordResetTokenGenerator):
    def _make_hash_value(self, user, timestamp):
        return (
            six.text_type(user.pk) + six.text_type(timestamp) + six.text_type(user.is_active)
        )
account_activation_token = TokenGenerator()

我是在名為token_generator.py的文件中創建的。

在密碼重置網址內添加email_template_name參數,如下所示:

path('password_reset/',auth_views.PasswordResetView.as_view
    (template_name='users/password_reset.html',
       email_template_name='users/password_reset_email.html',

       from_email="<yourgmail@gmail.com>",      

       success_url=reverse_lazy('password_reset_done', ),
     name='password_reset'),

password_reset_email.html內輸入如下網址:

{% block reset_link %}
http://{{domain}}{% url 'password_reset_confirm' uidb64=uid token=token  %}
{% endblock %}

暫無
暫無

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

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