如何使用 Django 发送电子邮件以重置密码?
How to send emails with Django for Password Reset?
我正在尝试将 password change link
发送到用户将键入的电子邮件地址。我输入了我的电子邮件,但它没有向我发送任何 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')]
settings.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')
我将这些用作我的网址。我立即发现与您的主要区别在于 password-reset-confirm。确保传递令牌。
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 或任何其他应用程序访问它,它不会自动运行。执行此操作后收到的密码与您通常登录时使用的密码不同。这可能是导致您出现问题的原因。
正如我所看到的,您缺少 password-reset-confirm 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 的文件中创建了它。
我正在尝试将 password change link
发送到用户将键入的电子邮件地址。我输入了我的电子邮件,但它没有向我发送任何 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')]
settings.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')
我将这些用作我的网址。我立即发现与您的主要区别在于 password-reset-confirm。确保传递令牌。
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 或任何其他应用程序访问它,它不会自动运行。执行此操作后收到的密码与您通常登录时使用的密码不同。这可能是导致您出现问题的原因。
正如我所看到的,您缺少 password-reset-confirm 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 的文件中创建了它。