Django:重置密码无法发送电子邮件。

13

我正在使用Django重置密码功能。

我在settings.py文件中有如下代码:

EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_HOST_USER = 'myusername@gmail.com'
EMAIL_HOST_PASSWORD = 'mypassword'
DEFAULT_FROM_EMAIL = 'myusername@gmail.com'
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
SERVER_EMAIL = 'myusername@gmail.com'

它把我重定向到正确的页面,但是没有发送电子邮件。我已经检查了垃圾邮件文件夹等,但仍然没有任何消息 :(

非常感谢任何想法!

编辑

我尝试使用控制台进行测试,但是我收到以下错误:

>>> email = EmailMessage('Mail test', 'this is a test', to=['myusername@gmail.com'])
>>> email.send()

Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/usr/local/lib/python2.7/dist-packages/django/core/mail/message.py", line 255, in send
return self.get_connection(fail_silently).send_messages([self])
File "/usr/local/lib/python2.7/dist-packages/django/core/mail/backends/smtp.py", line 88, in send_messages
new_conn_created = self.open()
File "/usr/local/lib/python2.7/dist-packages/django/core/mail/backends/smtp.py", line 55, in open
self.connection.login(self.username, self.password)
File "/usr/lib/python2.7/smtplib.py", line 576, in login
raise SMTPException("SMTP AUTH extension not supported by server.")

SMTPException: SMTP AUTH extension not supported by server.

编辑

我已经按照上述配置了settings.py。因为某种原因以前它没有起作用,但现在好像可以了。当我运行时

python manage.py shell

我使用EmailMessage和send()函数进行测试时,获得了状态码1,并收到了电子邮件。但是,我仍然没有从password_reset获取电子邮件。有任何想法吗?感谢大家的帮助!


您的账户上启用了双重认证吗? - Burhan Khalid
我以前从未接触过那个。当我去查看时,它说我必须设置它。它默认设置好了吗? - user1670032
9个回答

19

如果在Django shell中发送测试邮件成功,说明您的电子邮件设置已经正确配置。

如果你仍然无法从password_reset收到邮件,那么你必须在这个领域中搜索你的问题。

你需要知道密码重置邮件只会发送给有效用户(is_active),而且只有当他们有可用的密码时才会发送(has_usable_password)。

如果用户的密码无效,Django将 悄悄地 不发送重置邮件。

使用以下代码在Django shell中测试所有用户:

from django.contrib.auth import get_user_model

[(u.email, u.is_active, u.has_usable_password()) for u in get_user_model().objects.all()]

此外(也许太明显了):确保u.email的值实际上是一个有效的电子邮件地址。 - undefined

2

尝试发送邮件:

./manage.py shell

from django.core.mail import send_mail
send_mail('Subject here', 'Here is the message.', 'from@example.com',
['to@example.com'], fail_silently=False)

如果返回值为0,则需要重新配置电子邮件设置。确保您输入正确的凭据。请查看文档https://docs.djangoproject.com/en/dev/topics/email/#send-mail

我之前尝试过类似的东西,但是出现了上面的错误。我已经编辑了我的原始帖子。 - user1670032
你使用了内置视图吗?你能发布一下你的password_reset函数吗? - Zack Kanda

2

这可能有点出乎意料,但是奇怪的是我在设置文件中没有设置EMAIL_BACKEND。我以为我已经设置了,但是当我仔细查看后发现找不到它。虽然我不使用Gmail,但我的电子邮件发送正常,包括密码重置。此外,从控制台中查看错误日志,似乎与“backend”有关。所以我的建议是:尝试删除EMAIL_BACKEND设置。


2
在Gmail中创建一个单独的密码用于邮件发送(作为应用程序),该选项位于高级设置中。密码长度应为12-16个字符。然后尝试使用它。

2

它可以同时使用两者,事实上这就在你发布的链接中。 - Burhan Khalid
如果您仍然无法发送邮件,请尝试将SMTP配置为使用端口25(带SSL)。我使用465+SSL没有任何问题。 - eRIZ

2

EMAIL_PORT = 25设置为25。 Gmail使用SSL连接,您需要将EMAIL_PORT = 25设置为25。


它似乎可以使用端口587。然而,实际的密码重置视图似乎没有发送电子邮件。 - user1670032

2
在下面添加以下设置。
# ....
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_HOST_USER = '<your gmail>'
EMAIL_HOST_PASSWORD = '<your password>'
EMAIL_USE_TLS = True
# ....

现在,尝试从Django shell发送电子邮件。
from django.core.mail import send_mail
send_mail('Subject', 'Body infromation', '<your from email>', ['<your to email>'])

1

您的设置似乎是正确的

您必须先查看是否已登录

同时,您可以在主要网址中使用此功能

from django.contrib.auth import views as auth_views

path('reset_password/',auth_views.PasswordResetView.as_view(),name='password_reset)

0

这是我解决这个问题的方法:

我之前也遇到了这个问题。但是当我检查我的数据库时,发现我的数据库是空的。我的数据库中没有一个用户。所以,请确保你的数据库中有一个使用这个电子邮件的用户。


1
目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何撰写好答案的更多信息。 - Neeraj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接