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

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>
有任何想法吗?谢谢。

请将您的评论转化为下面的真正答案。两天后您可以将其标记为已接受。这将使问题从“未回答的问题”选项卡中消失。 - Martin Geisler
很酷,我是新来的社区成员,这些提示真的很有帮助 :) - Darkade
不客气,非常感谢您回来帮助我们清理! - Martin Geisler
3个回答

10

我应该提到我使用的是 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'

上述设置有效!


3
我遇到了同样的问题,缺失的值是DEFAULT_FROM_EMAIL。如果没有设置它,邮件就不会发送。 - Max

9
在我的情况下,我使用create_user()创建了用户。我的想法是创建一堆帐户,然后告诉人们他们可以去密码重置表单设置密码。如果您需要告诉他们“使用密码” welcome123”,然后不要忘记修改密码'之类的话,那是很糟糕的体验。
我发现如果我没有传递Password ='foo',或者也可以传递Password=Nonecreate_user(),则密码重置不会被发送。这是因为Django有时使用空密码来知道它不需要在本地进行身份验证,而是使用LDAP等。
所以现在我的做法是:
User.objects.create_user(
  user_name,
  email=user_email,
  password=os.urandom(32),
)

我可以指导用户使用密码重置功能来创建新账户。不过,如果在create_user选项中加入自动发送激活邮件给用户的功能,那就更好了!


谢谢,我已经为了弄清楚这个问题而苦思冥想了好几个小时。顺便说一下,有这样一行代码: password = User.objects.make_random_password() - Apollo Data
谢谢!FYI,os.urandom()和make_random_password()对我都不起作用。我使用了以下代码:from django.contrib.auth.hashers import make_password password = make_password(User.objects.make_random_password()) - pythonjsgeo
任何正在考虑或正在做这件事的人都应该立即停止,并创建自定义表单以允许用户注册。如果您想要执行类似管理员批准、电子邮件验证或其他类似操作...请使用http://django-registration.readthedocs.io/en。 - Derek Adair

0
您需要添加一个默认的发送地址,例如:
DEFAULT_FROM_EMAIL = 'info@mymail.com'
我现在看到它在注释中,但为了防止其他人也错过它,我会在这里添加它。

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