Flask Security的Flask Mail注册从smtp.gmail.com

时间:2016-01-21 14:35:13

标签: python flask gmail flask-security flask-mail

我有一个使用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时会发生这种情况:

Not available for your account

告诉Flask Mail遵守Google的安全标准,我该怎么办?

2 个答案:

答案 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

enter image description here

在上面的页面上选择其他应用并为其输入名称,然后您将获得一个应用密码。

此应用正常运行并发送电子邮件:

# 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)
相关问题