首页 > 解决方案 > Django 可以发送“重置密码”邮件但不能使用“send_mail”

问题描述

当人们注册我的网页时,我想发送一封“问候”邮件。

我可以使用内置发送“重置密码”电子邮件,auth_views.PasswordResetView但是当我尝试使用时,django.core.mail.send_mail我得到了一个Username and Password not accepted.

我的settings.py

.
.
#Email config
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' 
EMAIL_USE_TLS = True
EMAIL_PORT = 587
DEFAULT_FROM_EMAIL = "My Name <no-reply@my_site.com>"
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_PASSWORD = app_cred
EMAIL_HOST_USER = app_email

views.py

def register(request):
    if request.method=="POST": #post request
        form = UserRegisterForm(request.POST)
        agree_form = AgreeForm(request.POST)
        if form.is_valid() and agree_form.is_valid():
            user = form.save(commit=False)
            user.email = form.cleaned_data["email"]
            user.save()
            
            send_mail(subject = "Welcome to my-site.com",
            message = "Welcome!",
            from_email = None,
            recipient_list = [user.email])
            return redirect("login")
    else:
        form = UserRegisterForm()
        agree_form = AgreeForm()

    return render(request,"users/register.html",context= {"form":form,"agree_form":agree_form})

据我了解,Django 使用设置中指定的凭据,所以我想知道为什么我可以发送密码重置邮件但不能使用send_mail使用相同凭据的方法?

标签: pythondjangoemail

解决方案


我是SO新手,我没有评论这个的声誉,否则我会,但我认为这是因为如果没有为'send_mail'中的'from_email'参数提供值,那么它默认为'DEFAULT_FROM_EMAIL ' 设置中提供的值,在您的情况下为“我的姓名 <no-reply@my_site.com>”。如果是这种情况,那么我的假设是它正在尝试使用该电子邮件(我的姓名 <no-reply@my_site.com>)在 Gmail 服务器上对您进行身份验证,无论您的密码是什么。(https://docs.djangoproject.com/en/3.2/topics/email/)。

一个快速检查的方法是将'send_email'中的'from_email'值从None更改为'EMAIL_HOST_USER',

send_mail(subject = "Welcome to my-site.com",
        message = "Welcome!",
        from_email = settings.EMAIL_HOST_USER,
        recipient_list = [user.email])
        return redirect("login")

或将您的“DEFAULT_FROM_EMAIL”值更改为与“EMAIL_HOST_USER”值相同。

DEFAULT_FROM_EMAIL = app_email
EMAIL_HOST_USER = app_email

我不太确定您的后端在发送电子邮件方面是什么样的,但我希望这会有所帮助!


推荐阅读