Flask-Mail无法使用Gmail和应用密码进行身份验证

时间:2019-01-21 07:09:01

标签: python-2.7 flask amazon-ec2 gmail flask-mail

因此,当我尝试使用为发送电子邮件而构建的烧瓶应用程序时,出现SMTPSenderRefused错误。让我开始说这以前有用,但现在已经停止了。我很茫然,花了很多时间进行测试,调整和在线阅读,但是“没什么”给了我答案。

我一直收到以下错误。

[2019-01-21 03:07:51,954] ERROR in app: Exception on /register/ [POST]
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 2292, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1815, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1718, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1813, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1799, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "MyFlaskApp.py", line 131, in register
    mail.send(msg)
  File "/usr/local/lib/python2.7/site-packages/flask_mail.py", line 492, in send
    message.send(connection)
  File "/usr/local/lib/python2.7/site-packages/flask_mail.py", line 427, in send
    connection.send(self)
  File "/usr/local/lib/python2.7/site-packages/flask_mail.py", line 192, in send
    message.rcpt_options)
  File "/usr/lib64/python2.7/smtplib.py", line 737, in sendmail
    raise SMTPSenderRefused(code, resp, from_addr)
SMTPSenderRefused: (530, '5.5.1 Authentication Required. Learn more at\n5.5.1  https://support.google.com/mail/?p=WantAuthError u186sm20332024pfu.51 - gsmtp', u'myemail@gmail.com')
IP.XX.XXX.XXX - - [21/Jan/2019 03:07:51] "POST /register/ HTTP/1.1" 500 -

我的gmail帐户配置了两步验证,然后配置了此Flask应用使用的应用密码。我已经尝试了每种组合,但仍然无法使用。这是我正在使用的代码。

app = Flask(__name__, static_url_path='/static')
app.config.update(
  DEBUG = False,
  MAIL_SERVER = 'smtp.gmail.com',
  MAIL_PORT = 465,
  MAIL_USE_SSL = True,
  MAIL_USERNAME = 'myemail@gmail.com',
  MAIL_DEFAULT_SENDER = 'myemail@gmail.com',
  MAIL_PASSWORD = 'GmailApplicationPassword',
  )
mail = Mail(app)

实际发送消息的行(在POST内部):

    msg = Message("Welcome",
      sender = 'myemail@gmail.com',
      recipients = [request.form["email"]])
    msg.body = "Welcome! \n\n Congratulations on your successful registration. \n\n Cheers!"
    mail.send(msg)

一些其他信息可能会有所帮助。当我在本地运行应用程序时,此确切的代码曾经可以正常工作。然后,我将代码部署到了我的AWS EC2实例,并使其在该实例上工作。一直到我执行以下操作为止。

我将弹性IP地址与站点相关联,然后将我的DNS指向该IPv4。我还添加了AWS公共证书。

有人可以帮助我了解为什么我无法发送电子邮件。我已经尝试了所有可以在线找到的解决方案。

其他详细信息:

$ pip freeze
Flask-Mail==0.9.1

在此先感谢您,如果需要进一步说明,我将为您提供任何答案,请询问。

2 个答案:

答案 0 :(得分:0)

这是我发现效果最好的解决方案。 (我并不是说这是最好的方法,但是它能起作用)。它涉及到一些我强烈建议使用的关键概念的使用。它涉及秘密的使用,您可以按照guide here的要求获得更多有关此信息的信息(因为这不是此问题的核心,因此我仅在此处保留链接)。它还需要使用Boto3才能读取变量。 AWS文档将在这里有所帮助,因此我不再将其包括在内。

我的方法是设置AWS Simple Email Service(SES)。这样一来,使用Flask-Mail的应用程序将访问AWS SES发送电子邮件,然后与gmail对话以实际发送电子邮件。这里的一些重要注释是,SES不在每个区域中,但是目前(2019年6月),不需要将EC2实例托管在与使用SES相同的区域中。如果您希望能够将电子邮件发送到外部地址,则必须确保您已按照AWS使用条款配置了电子邮件收件箱。最后,如果您使用的是免费套餐,则必须提交支持票以提高费率,并且还允许您向外部发送电子邮件。现在这是我使用的一些代码:

app = Flask(__name__, static_url_path='/static')
app.config.update(
  DEBUG = False,
  MAIL_SERVER = params.getParameter("SES_SERVER"),
  MAIL_PORT = 587,
  MAIL_USE_TLS = True,
  MAIL_USERNAME = params.getParameter("SES_USERNAME"),
  MAIL_PASSWORD = params.getParameter("SES_PASSWORD"),
  )
mail = Mail(app)

发送代码保持不变。 我确实需要为Boto3添加一个导入,并且创建了一个名为params.py的新文件,并且在其中构建了getParameter方法来访问变量。如果您愿意,可以对上面的值进行硬编码,但我不建议您这样做,尤其是当您将代码存储在云存储库中时。

我不确定100%,但是我怀疑gmail禁止AWS来访问其服务器的IP地址或域,因此您无法发送电子邮件。这是我的怀疑,但我找不到方法来证明这一点。

答案 1 :(得分:0)

对于已激活两步验证的 Gmail 帐户,禁用安全性较低的应用程序。在这种情况下,需要生成访问应用密码。

这是用flask应用编写的应用配置代码。

`app = Flask(__name__)
 app.config.update(
   MAIL_SERVER = "smtp.gmail.com",
   MAIL_PORT="465",
   MAIL_USE_SSL=True,
   MAIL_USERNAME=params['gmail-user'],
   MAIL_PASSWORD=params['gmail-pass']  
   )
 mail=Mail(app)`

创建“config.json”来定义参数,上面会用到。对于用户名和密码,请检查“gmail-user”和“gmail-pass”

{"params":
    {   "local_server":"True",
        "local_uri":"mysql+pymysql://root:@localhost/jbh_datasc_blog",
        "prod_uri": "mysql+pymysql://root:@localhost/jbh_datasc_blog",
        "fb_url":"https://facebook.com/<give the name of extension>",
        "tw_url":"https://twitter.com/<give the name of extension>",
        "gh_url":"https://github.com/<give the name of extension>",
        "blog_head":"Data Science Digital",
        "sub_head":"Innovating Future",
        "gmail-user":"xxxxxxxx@gmail.com",
        "gmail-pass":"xxxxxxxxxxxxxxxx"    
    }
}
  1. 转到您的 Gmail 帐户,然后在搜索栏中输入应用密码。
  2. 它会询问你从哪里访问的应用程序和计算机的名称,提供它。
  3. Google 会生成一个 16 位数的密码。
  4. 使用此密码填写'gmail-pass'
  5. 保存并执行代码。