Django,部署在 Heroku 上。当我尝试发送电子邮件时,SMTPSenderRefused 在 /password_reset/

Django, deployment on Heroku. SMTPSenderRefused at /password_reset/ when i try to send an email

我正在 Heroku 上部署 Django 应用程序。应用程序运行良好,但是当我尝试通过发送电子邮件重置忘记的密码时 - 我遇到了这个错误:

SMTPSenderRefused 在 /password_reset/ (530,b'5.7.0 需要身份验证。了解更多 at\n5.7.0 https://support.google.com/mail/?p=WantAuthError h13sm1336757qti.32 - gsmtp','None')

此外,只有当我使用 Heroku 服务器使用我的 Django 应用程序时(类似于 beautiful-flowers-12345.herokuapp.com,我不知道),不是本地主机 127.0.0.1:8000。当我使用本地主机使用我的 Django 应用程序时发送电子邮件 - 工作正常,没有任何错误。

修复此错误的唯一方法是替换此:

EMAIL_HOST_USER = os.environ.get('EMAIL_USER')
EMAIL_HOST_PASSWORD = os.environ.get('EMAIL_PASS')

有了这个:

EMAIL_HOST_USER = 'fake_email'
EMAIL_HOST_PASSWORD = 'myfakepassword123' 

并在 Gmail 设置中启用使用安全性较低的应用程序的权限。

但这不是我想要解决这个问题的方式

1) 我用这种方法展示了我的 host_user 和 host_password,这是我不想要的。

2) 每个用户都需要去这里 "Gmail -> Settings -> Allow less secure apps",我也不希望那样,因为它对用户来说不是很友好。此外,为什么用户应该允许访问不安全的应用程序?

也许您遇到过这个问题并且知道如何用不同的方式解决它?谢谢!

这里有几点要提一下:

1) 您不想在您的电子邮件和密码中进行硬编码是完全正确的,它们绝对应该存储为环境变量。你必须在 heroku 上设置它们与你在开发中所做的略有不同:

  • 在 heroku 中转到您的应用程序
  • 点击设置
  • 应该有一个名为配置变量的部分。单击 'reveal config vars'
  • 在这里您可以输入您的配置变量。

2) 并非每个用户都需要将他们的 Gmail 设置为使用安全性较低的应用程序。只有用于 发送 电子邮件的电子邮件帐户才需要这样做。 (大概您的用户只是在接收电子邮件)。

最后,值得一提的是,我相信对于 gmail,此解决方案不会工作太久。 (同样,我要说的所有内容仅适用于用于发送的电子邮件,而不适用于您用户的电子邮件)。 Google 将收紧 'less secure apps' 并要求使用 OAuth。我认为这应该在 6 月或 7 月左右发生,但 google 可能由于 covid-19 的情况而推迟了截止日期。

另一种方法是使用诸如 mailGun 之类的服务,它对少量电子邮件几乎是免费的,并且很容易与您的项目集成。他们有很棒的文档。像 django-anymail 这样的库也可以非常简单地与任意数量的电子邮件服务集成。

编辑: 还值得检查一下您的 google 帐户是否有任何尝试被阻止。当从 heroku 服务器进行尝试时,由于该服务器很可能与您所在的地理位置不同,google 可能会将该尝试视为可疑并阻止它。所以这也值得检查一下。