因此,当我尝试使用为发送电子邮件而构建的烧瓶应用程序时,出现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
在此先感谢您,如果需要进一步说明,我将为您提供任何答案,请询问。
答案 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"
}
}