Django 密码重置。不发邮件
Posted
技术标签:
【中文标题】Django 密码重置。不发邮件【英文标题】:Django password reset. Not sending mail 【发布时间】:2012-01-26 10:52:12 【问题描述】:我正在尝试让 django 密码重置工作,但重置电子邮件未发送。
我知道我的电子邮件配置正确,因为以下内容在 shell 和我的一个视图中都有效(我正在使用它来给自己发送支持电子邮件)。
from django.core.mail import send_mail
send_mail('Subject here', 'Here is the message.',
'admin@mydomain.com',['me@gmail.com'], fail_silently=False)
我可以进入我的重置密码视图 (password/reset/),在我给它我的电子邮件后,它会正确地将我重定向到 password/reset/done/ 但是它不发送电子邮件。
这是我的urls.py
:
(r'^password/reset/$','django.contrib.auth.views.password_reset'),
(r'^password/reset/done/$','django.contrib.auth.views.password_reset_done'),
(r'^password/reset/confirm/$','django.contrib.auth.views.password_reset_confirm'),
(r'^password/reset/complete/$','django.contrib.auth.views.password_reset_confirm'),
(r'^password/change/$','django.contrib.auth.views.password_change'),
(r'^password/change/done/$','django.contrib.auth.views.password_change_done'),
这是我的password_reset_form.html
:
<html>
<head>
<link rel="stylesheet" type="text/css" href="/media/css/style_login.css" />
<title>Información de acceso requerida</title>
</head>
<body>
<div id="wrapper">
<h1>Recuperar password</h1>
<p>Utilice este formulario cuando desee recuperar el password para su usuario.</p>
% if form.errors %
<p>No hay un usuario registrado con ese correo electronico.</p>
% endif %
<form method="post" action="% url django.contrib.auth.views.password_reset_done %">
% csrf_token %
form
<input class="login" type="submit" value="Recuperar" />
</form>
</div>
</body>
有什么想法吗?谢谢
【问题讨论】:
请在下方将您的评论变成真正的答案。您可以在两天后将其标记为已接受。这将使问题从未回答的问题标签中消失。 酷,我是社区的新手,这种提示真的很有帮助:) 不客气,非常感谢您回来帮我们打扫卫生! 【参考方案1】:我应该提到我正在使用 hostgator 作为我的提供商。所以这是我的settings.py
EMAIL_HOST = 'my-domain.com'
EMAIL_HOST_PASSWORD = 'my cpanel password'
EMAIL_HOST_USER = 'my cpanel user'
EMAIL_PORT = 25
EMAIL_USE_TLS = False
DEFAULT_FROM_EMAIL = 'webmaster@my-host.com'
SERVER_EMAIL = 'root@my-domain.com'
以上设置有效!
【讨论】:
我遇到了同样的问题,缺失值是 DEFAULT_FROM_EMAIL。如果未设置,则不会发送电子邮件。【参考方案2】:在我的例子中,我使用create_user()
创建了用户。我的想法是创建一堆帐户,然后告诉人们他们可以去密码重置表单设置他们的密码。如果您需要告诉他们“使用密码“welcome123”然后不要忘记修改您的密码”等,我认为这很糟糕。
我发现如果我没有通过Password='foo'
或者如果我通过Password=None
到create_user()
密码重置未发送。这是因为django有时会使用空密码来知道不需要在本地进行身份验证,而是使用LDAP之类的。
所以现在我这样做:
User.objects.create_user(
user_name,
email=user_email,
password=os.urandom(32),
)
而且我可以指导人们为他们的新帐户使用密码重置功能。不过,我认为如果我在 create_user 中有一个选项可以自动向用户发送用于激活帐户的电子邮件,那就太棒了!
【讨论】:
谢谢,我一直在拔头发好几个小时试图弄清楚这一点。顺便说一句,有password = User.objects.make_random_password()
谢谢!仅供参考 os.urandom() 或 make_random_password() 都没有为我工作,我使用: from django.contrib.auth.hashers import make_password password = make_password(User.objects.make_random_password())
任何想到或这样做的人都应该立即停止并创建自定义表单以允许用户注册。如果您想做管理员批准、电子邮件验证等操作...请使用django-registration.readthedocs.io/en【参考方案3】:
您需要从地址添加默认值,例如:
DEFAULT_FROM_EMAIL = 'info@mymail.com'
我现在看到它在 cmets 中,但会在此处添加以防有人也错过它们。
【讨论】:
以上是关于Django 密码重置。不发邮件的主要内容,如果未能解决你的问题,请参考以下文章
在使用 Django 框架构建的博客 Web 应用程序中单击重置密码时,我没有收到密码重置电子邮件链接
如何自定义 django rest auth 密码重置电子邮件内容/模板