1

因此,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

在此先感谢,如果需要更多说明,我将帮助提供任何答案,因此请询问。

4

2 回答 2

0

对于已激活两步验证的 gmail 帐户,将禁用允许不太安全的应用程序。在这种情况下,需要生成访问应用程序密码。

这是用烧瓶应用程序编写的应用程序配置代码。

`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. 它将询问 ru 访问的应用程序和计算机的名称,并提供它。
  3. Google 会生成一个 16 位的密码。
  4. 使用此密码填写“gmail-pass”
  5. 保存并执行代码。
于 2021-07-21T15:00:18.243 回答
0

这是我发现效果最好的解决方案。(我并不是说这是最好的方法,但它有效)它涉及使用我强烈推荐使用的几个不同的关键概念。它涉及秘密的使用,您可以在此处按照本指南获取更多信息(因为这不是这个问题的核心,我只会在此处留下一个链接)。它还需要使用Boto3才能读取变量。AWS 文档在这里会很有帮助,所以我不再包括它。

我的方法是设置 AWS 简单电子邮件服务 (SES)。这使得使用 Flask-Mail 的应用程序访问 AWS SES 以发送电子邮件,然后与 gmail 对话以实际发送电子邮件。这里的一些重要注意事项是,SES 并非在每个区域,但目前(2019 年 6 月)不需要将您的 EC2 实例托管在您使用 SES 的同一区域中。此外,如果您希望能够向外部地址发送电子邮件 您必须确保您的电子邮件收件箱已按照 AWS 使用条款进行配置且不违反 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 地址或域,因此您无法发送电子邮件。这是我的怀疑,但我找不到证明它的方法。

于 2019-06-18T07:07:48.817 回答