1

Flask-Security の登録を使用して登録時に Flask メールを送信するフラスコ アプリがあります。SSL を使用して smtp.gmail.com ポート 464 でフラスコ メール設定を指定しました。ただし、アプリがメールを送信しようとすると、smtplib.SMTPAuthenticationError が返されます。Google 管理ページに移動して「安全性の低いアプリ」を許可すると、送信が機能します。

前述のエラーで送信が失敗したときに取得するスタック トレースを次に示します。

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 を有効にするために Google 管理者に移動すると、次のようになります。

お使いのアカウントではご利用いただけません

Flask Mail が Google のセキュリティ基準に準拠するようにするにはどうすればよいですか?

4

3 に答える 3

2

ここから取得できるアプリ固有のパスワードが必要な場合は、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)
于 2016-01-21T19:52:28.737 に答える
2

これは、Google がアプリケーションで OAuth2 を使用することを望んでいるためです。

ユーザーの保護を強化するために、すべてのアプリケーションを OAuth 2.0 にアップグレードすることをお勧めします。そうしないことを選択した場合、ユーザーはアプリケーションへのアクセスを継続するために追加の手順を実行する必要があります。

Flask-Mail を使用して smtp 経由でメールを送信する場合は、追加の手順を実行して、Google 管理ページで「安全性の低いアプリ」を有効にする必要があります。

ソース: https://googleonlinesecurity.blogspot.com/2014/04/new-security-measures-will-affect-older.html

于 2016-01-21T15:59:38.927 に答える