我有一个使用Flask-Security注册的烧瓶应用程序,在注册时发送Flask Mail。我已经使用SSL在smtp.gmail.com端口464指出了烧瓶邮件配置。但是,当应用程序尝试发送邮件时,它会获得smtplib.SMTPAuthenticationError。如果我转到google admin page并允许"不太安全的应用"通过那时发送工作。
以下是发送失败并出现上述错误时收到的堆栈跟踪:
File "~/lib/python3.5/site-packages/flask/app.py", line 1836, in __call__
return self.wsgi_app(environ, start_response)
File "~/lib/python3.5/site-packages/flask/app.py", line 1820, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "~/lib/python3.5/site-packages/flask_restful/__init__.py", line 271, in error_router
return original_handler(e)
File "~/lib/python3.5/site-packages/flask/app.py", line 1403, in handle_exception
reraise(exc_type, exc_value, tb)
File "~/lib/python3.5/site-packages/flask/_compat.py", line 33, in reraise
raise value
File "~/lib/python3.5/site-packages/flask/app.py", line 1817, in wsgi_app
response = self.full_dispatch_request()
File "~/lib/python3.5/site-packages/flask/app.py", line 1477, in full_dispatch_request
rv = self.handle_user_exception(e)
File "~/lib/python3.5/site-packages/flask_restful/__init__.py", line 271, in error_router
return original_handler(e)
File "~/lib/python3.5/site-packages/flask/app.py", line 1381, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "~/lib/python3.5/site-packages/flask/_compat.py", line 33, in reraise
raise value
File "~/lib/python3.5/site-packages/flask/app.py", line 1475, in full_dispatch_request
rv = self.dispatch_request()
File "~/lib/python3.5/site-packages/flask/app.py", line 1461, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "~/lib/python3.5/site-packages/flask_security/decorators.py", line 225, in wrapper
return f(*args, **kwargs)
File "~/lib/python3.5/site-packages/flask_security/views.py", line 117, in register
user = register_user(**form.to_dict())
File "~/lib/python3.5/site-packages/flask_security/registerable.py", line 41, in register_user
user=user, confirmation_link=confirmation_link)
File "~/lib/python3.5/site-packages/flask_security/utils.py", line 341, in send_mail
mail.send(msg)
File "~/lib/python3.5/site-packages/flask_mail.py", line 491, in send
with self.connect() as connection:
File "~/lib/python3.5/site-packages/flask_mail.py", line 144, in __enter__
self.host = self.configure_host()
File "~/lib/python3.5/site-packages/flask_mail.py", line 165, in configure_host
host.login(self.mail.username, self.mail.password)
File "/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/smtplib.py", line 729, in login
raise last_exception
File "/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/smtplib.py", line 720, in login
initial_response_ok=initial_response_ok)
File "/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/smtplib.py", line 641, in auth
raise SMTPAuthenticationError(code, resp)
我的邮件配置是:
app.config['MAIL_SERVER'] = 'smtp.gmail.com'
app.config['MAIL_PORT'] = 465
app.config['MAIL_USE_SSL'] = True
当我转到谷歌管理员为我的应用启用TLS时会发生这种情况:
告诉Flask Mail遵守Google的安全标准,我该怎么办?
答案 0 :(得分:1)
这是因为Google希望您的应用程序使用OAuth2。
为了更好地保护您的用户,我们建议您升级所有用户 应用程序到OAuth 2.0。如果您选择不这样做,您的用户将会这样做 被要求采取额外的步骤,以便继续访问你的 应用
如果您想使用Flask-Mail通过smtp发送电子邮件,则需要采取额外步骤并启用"安全性较低的应用程序"在您的Google管理页面中。
来源: https://googleonlinesecurity.blogspot.com/2014/04/new-security-measures-will-affect-older.html
答案 1 :(得分:1)
您可以使用google smtp服务器发送电子邮件,只需要一个可以从这里获得的应用专用密码: https://security.google.com/settings/security/apppasswords
在上面的页面上选择其他应用并为其输入名称,然后您将获得一个应用密码。
此应用正常运行并发送电子邮件:
# Try to send a mail using
from flask import Flask
from flask.ext.mail import Mail
from flask.ext.mail import Message
app = Flask(__name__)
app.config['MAIL_SERVER'] = 'smtp.googlemail.com'
app.config['MAIL_PORT'] = 587
app.config['MAIL_USE_TLS'] = True
app.config['MAIL_USERNAME'] = "your gmail username"
app.config['MAIL_PASSWORD'] = "Your app spesfic password"
app.config['MAIL_DEFAULT_SENDER'] = 'Default sender name'
mail = Mail(app)
@app.route('/')
def hello_world():
return 'Hello World!'
@app.route('/send')
def send_mail():
msg = Message("Hello",
sender="test@test.com",
recipients=["test@test.com"])
mail.send(msg)
return ""
if __name__ == '__main__':
app.run(debug=True)