【问题标题】:SMTPAuthenticationError: (535, b'5.7.8 Username and Password not accepted in Django production?SMTPAuthenticationError:(535,b'5.7.8 Django 生产中不接受用户名和密码?
【发布时间】:2020-02-05 13:49:29
【问题描述】:

我在 Heroku 上部署了一个 Django 应用程序。在其中一个部分中,我使用 SMTP Gmail 设置向用户发送电子邮件。当我在本地运行项目而不是在 Heroku 上部署的项目时,电子邮件发送成功。

我在 Stackoverflow 上看到了许多其他答案,但没有一个能解决我的问题。 我已在我的 Google 帐户上启用了 2FA,并生成了一个 APP 密码,并在我的设置文件中使用了该密码。其他开发者不建议开启 allow_less_secure_app 选项

我的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_USER2')
EMAIL_HOST_PASSWORD = os.environ.get('EMAIL_PASS2')

我的views.py 视图处理邮件-

def index(request) 
    if request.method == 'POST':
        form = MyForm(request.POST)
        if form.is_valid():
            message = form.cleaned_data['message']
            email = form.cleaned_data['email']
            subject = "You got a message"
            thoughts = "{} by {}".format(message,email)
            recipients = ['xyz@gmail.com']
            sender = 'abc@gmail.com'
            send_mail(subject, thoughts, sender ,recipients,fail_silently=False)
            return HttpResponse()
    else:
        form = MyForm()
    return render(request,'my_webapp/index.html',{'form':form})

我在 Heroku 日志中遇到的错误是-

raise SMTPAuthenticationError(code, resp)
2019-10-07T18:22:12.174365+00:00 app[web.1]: smtplib.SMTPAuthenticationError: (535, b'5.7.8 Username and Password not accepted. Learn more at\n5.7.8  https://support.google.com/mail/?p=BadCredentials w2sm9789664qtc.59 - gsmtp')

【问题讨论】:

  • 一般建议:不要将 Gmail 用作批量电子邮件发送服务。你很快就会被屏蔽。
  • 添加一些日志以检查 os.environ.get() 是否在 Heroku 上设置了正确的值。确保您遵循support.google.com/mail/?p=BadCredentials 上的所有步骤 - 例如您没有在问题中提及验证码建议。您还应该确保 EMAIL_HOST_USER sender = 'abc@gmail.com' 匹配 - Gmail 不会让您为其他帐户发送电子邮件。如果它仍然不起作用,那么我同意 Klaus 的观点,即您应该寻找其他电子邮件提供商。
  • 密码正确我检查了两次。此外,displayUnlockCaptcha 只是指导我创建 APP 密码的方法,我已经做了 5 次。它也是一个非常小的应用程序,每周可能会发送 7-8 封电子邮件。
  • 即使它是一个小应用程序,我也会寻找另一种发送电子邮件的方式 - 你说 我在 stackoverflow 上看到了许多其他答案 - 接收许多电子邮件这表明使用 Gmail 发送 Django 电子邮件是一项艰巨的工作!
  • 其他替代方法是什么?你能推荐一些吗?我尝试使用 sendgrid,但它们响应我的新帐户太慢了。

标签: python django email smtp


【解决方案1】:

对我有用的解决方案发布在here

我使用了 Flask,但错误完全相同。我确保我的凭据是正确的,并且环境变量没有像 Eddy Ogola 建议的那样用引号括起来。

这篇文章的简短回答是在登录与您发送邮件的 gmail 关联的 google 帐户时单击 this link

Google 不信任大多数脚本来登录您的帐户,因此他们让 gmail 的所有者有责任授予“不太安全的应用”访问您的 gmail 的权限。

【讨论】:

    【解决方案2】:

    我有同样的问题。我通过重置 os 环境变量来解决它,这些值不应该用引号引起来。例如,MAIL_USERNAME=blah@gmail.com。它应该可以工作。

    【讨论】:

      【解决方案3】:

      我在 Django 中工作时遇到了同样的错误[https://i.stack.imgur.com/beMIs.png]

      我通过将 google 帐户表单将不太安全的应用程序访问 (关闭) 设置为 (开启) 解决了这个问题 [https://i.stack.imgur.com/N1fNC.png]

      所以执行此选项 更改您的 Google 帐户设置以允许安全性较低的应用访问您的帐户。 (不建议这样做,因为它可能会使某人更容易侵入您的帐户)。如果您仍然想允许访问,请按照以下步骤操作:

      1. 转到“不太安全的应用”部分
      2. 在“访问不太安全的应用”旁边,选择开启

      【讨论】:

        【解决方案4】:

        我遇到了同样的问题,

        我是怎么解决的?

        第 1 步:检查凭据是否正确(电子邮件和密码),

        EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
        EMAIL_HOST = 'smtp.gmail.com'                                       // can also use yahoo
        EMAIL_USE_TLS = True
        EMAIL_PORT = 587
        EMAIL_HOST_USER = 'yourmail@gmail.com'
        EMAIL_HOST_PASSWORD = 'yourpassword'
        DEFAULT_FROM_EMAIL = '<anything you want>'
        

        第 2 步:检查是否已开启(如果未开启)

        Google Less Secure apps

        【讨论】:

          【解决方案5】:

          快速回答:去lesssecureapps session of your google account

          选择开启

          更多细节: 如果您的所有配置都正确,则此错误可能是因为 django 尝试登录您的应用程序而 gmail 无法识别他

          【讨论】:

            猜你喜欢
            • 2023-03-22
            • 2016-07-05
            • 1970-01-01
            • 2020-01-19
            • 1970-01-01
            • 2016-05-22
            • 2021-08-05
            相关资源
            最近更新 更多