部署heroku后,Flask应用程序smptlib发送方拒绝错误



message.send(连接(2021-06-20T00:49:29.013482+00:0 app[web.1]:文件"/app/.heroku/python/lib/python3.9/site packages/flask_mail.py";,第427行,发送中2021-06-20T00:49:29.013483+00:0 app[web.1]:connection.send(self(文件self.host.sendmail(消毒地址(envelope_from或message.sesender(,2021-06-20T00:49:29.013484+00:0 app[web.1]:文件"/app/.heroku/python/lib/python3.9/smtplib.py";,882行,发送邮件2021-06-20T00:49:29.013484+00:0 app[web.1]:引发SMTPSenderRejected(代码,resp,from_addr(2021-06-20T00:49:29.013486+00:0 app[web.1]:smtplib。SMTPSenderRejected:(530,b'5.7.0需要身份验证。有关详细信息,请访问\n5.7.0https://support.google.com/mail/?p=WantAuthErrory24sm8273493qtn.57-gsmtp','xxx@gmail.com'(

我已经将我的flask应用程序部署到heroku,我面临着这个电子邮件身份验证错误。在我的本地机器上,电子邮件部分工作得很好。只有在部署到heroku之后,才会出现此错误。我已经检查了所有的电子邮件和密码变量,还允许不太安全的应用程序访问。请给我一些建议。我正在使用烧瓶邮件

我的代码是

__init__.py
app.config['MAIL_SERVER'] = 'smtp.gmail.com'
app.config['MAIL_PORT'] = 587
app.config['MAIL_USE_TLS'] = True
app.config['MAIL_USERNAME'] = os.environ.get('EMAIL_USER')
app.config['MAIL_PASSWORD'] = os.environ.get('EMAIL_PASS')
In routes.py
def send_reset_email(user):
token=user.get_reset_token()
msg=Message("Password  Reset Request",sender='xxx@gmail.com',recipients=[user.email])
msg.body=f'''To reset your password visit the following link:
{url_for('reset_password',token=token,_external=True)}
If you did not make this request please ignore this message.
'''
mail.send(msg)
@app.route("/reset_request",methods=["GET","POST"])
def reset_request():
form=ResetRequestForm()
if form.validate_on_submit():
user=User.query.filter_by(email=form.emailmain.data).first()
if user is None:
flash("No account exists with this email. Pls register first.",'danger')
else:
send_reset_email(user)
flash("An email has been sent with instructions to reset your password",'success')
time.sleep(2)
return redirect(url_for('login'))
In models.py
def get_reset_token(self, expires_sec=1800):
s = Serializer(app.config['SECRET_KEY'], expires_sec)
return s.dumps({'user_id': self.id}).decode('utf-8')

@staticmethod
def verify_reset_token(token):
s = Serializer(app.config['SECRET_KEY'])
try:
user_id = s.loads(token)['user_id']
except:
return None

有人能告诉我我缺少什么吗

谷歌不允许你像那样从heroku登录。您可以执行以下操作。

  1. 查看您的邮件,可能会有一封邮件告诉您登录帐户
  2. 转到安全并启用不太安全的应用程序

注意-在这样做之后,我的应用程序工作了,但有一天它又出现了同样的错误。我从一个SO问题中得到了这个DisplayUnlockCaptcha链接。但每当我发电子邮件时,我都需要它。所以我终于得到了这个。

  1. 转到安全启用两步验证并前往应用程序密码
  2. 选择你的设备(我选择了windows电脑(和应用程序内选择邮件。将生成应用程序密码。将您的密码替换为heroku-env变量中的此密码

相关内容