Flask-Mail 使用 config.from_object() 时无法读取配置
Flask-Mail Cannot read configurations when config.from_object() is used
我有两个版本的邮件发送代码
版本 1(W/O 外部配置文件)
# app.py
from flask import Flask
from flask_mail import Mail, Message
mail = Mail()
app =Flask(__name__)
app.config['MAIL_SERVER']='smtp.gmail.com'
app.config['MAIL_PORT'] = 465
app.config['MAIL_USERNAME'] = 'test@gmail.com'
app.config['MAIL_PASSWORD'] = 'test'
app.config['MAIL_USE_TLS'] = False
app.config['MAIL_USE_SSL'] = True
print(app.config)
mail.init_app(app)
@app.route("/")
def index():
msg = Message('Hi', sender = 'test@gmail.com', recipients = ['test@gmail.com'])
msg.body = "Hello"
mail.send(msg)
return "Sent"
if __name__ == '__main__':
app.run(debug = True)
此版本发送电子邮件没有问题
版本 2(使用 from_object() 配置)
# app.py
from flask import Flask
from flask_mail import Mail, Message
mail = Mail()
app = Flask(__name__)
app.config.from_object('config.DevelopmentConfig')
# mail = Mail(app)
print(app.config)
mail.init_app(app)
@app.route("/")
def index():
print('Sending email')
msg = Message('Tutorial point3', sender = 'test@gmail.com', recipients = ['test@gmail.com'])
msg.body = "Hello Flask message sent from Flask-Mail "
mail.send(msg)
return "Sent"
if __name__ == '__main__':
app.run()
下面是配置文件
# config.py
class BaseConfig:
"""Base configuration"""
DEBUG = False
TESTING = False
SQLALCHEMY_TRACK_MODIFICATIONS = False
SECRET_KEY = 'my_precious'
MAIL_SERVER = 'smtp.gmail.com'
MAIL_PORT = 465
MAIL_USE_SSL = True
MAIL_USE_TLS = False
MAIL_USERNAME = 'test@google.com'
MAIL_PASSWORD = 'test'
class DevelopmentConfig(BaseConfig):
"""Development configuration"""
DEBUG = True
不知何故第 2 版无法工作并给我这个错误
smtplib.SMTPAuthenticationError: (535, b'5.7.8 Username and Password not accepted. Learn more at\n5.7.8 https://support.google.com/mail/?p=BadCredentials x4sm75923481pfk.51 - gsmtp')
错误消息说我的凭据是错误的,但我认为这不是真的,因为在版本 1 中我使用完全相同的用户名和密码并且它工作正常。
为了查明我在 config.py 中的配置是否已加载,我做了 print(app.config)
(尽管我不确定这是否是一个好方法),看起来我的配置已正确加载到我的 Flask 应用程序。
<Config {'DEBUG': True, 'TESTING': False, 'PROPAGATE_EXCEPTIONS': None, 'PRESERVE_CONTEXT_ON_EXCEPTION': None, 'SECRET_KEY': 'my_precious', 'PERMANENT_SESSION_LIFETIME': datetime.timedelta(31), 'USE_X_SENDFILE': False, 'LOGGER_NAME': '__main__', 'LOGGER_HANDLER_POLICY': 'always', 'SERVER_NAME': None, 'APPLICATION_ROOT': None, 'SESSION_COOKIE_NAME': 'session', 'SESSION_COOKIE_DOMAIN': None, 'SESSION_COOKIE_PATH': None, 'SESSION_COOKIE_HTTPONLY': True, 'SESSION_COOKIE_SECURE': False, 'SESSION_REFRESH_EACH_REQUEST': True, 'MAX_CONTENT_LENGTH': None, 'SEND_FILE_MAX_AGE_DEFAULT': datetime.timedelta(0, 43200), 'TRAP_BAD_REQUEST_ERRORS': False, 'TRAP_HTTP_EXCEPTIONS': False, 'EXPLAIN_TEMPLATE_LOADING': False, 'PREFERRED_URL_SCHEME': 'http', 'JSON_AS_ASCII': True, 'JSON_SORT_KEYS': True, 'JSONIFY_PRETTYPRINT_REGULAR': True, 'JSONIFY_MIMETYPE': 'application/json', 'TEMPLATES_AUTO_RELOAD': None, 'MAIL_PASSWORD': 'test', 'MAIL_PORT': 465, 'MAIL_SERVER': 'smtp.gmail.com', 'MAIL_USERNAME': 'test@google.com', 'MAIL_USE_SSL': True, 'MAIL_USE_TLS': False, 'SQLALCHEMY_TRACK_MODIFICATIONS': False}>
提前感谢您的帮助!
更新1:
修改标题以便更好地理解。
此外,当我测试这两个版本时,我使用了实际的 gmail 地址和密码,但在代码片段中我将所有凭据替换为 "test" 以保护我的帐户
第 2 版中有错字。
我从this flask official snippets复制了代码,所以我希望这个答案能帮助人们避免陷入同样的陷阱。
class BaseConfig:
"""Base configuration"""
DEBUG = False
TESTING = False
SQLALCHEMY_TRACK_MODIFICATIONS = False
SECRET_KEY = 'my_precious'
MAIL_SERVER = 'smtp.gmail.com' # <-- Here
MAIL_PORT = 465
MAIL_USE_SSL = True
MAIL_USE_TLS = False
MAIL_USERNAME = 'test@gmail.com'
MAIL_PASSWORD = 'test'
class DevelopmentConfig(BaseConfig):
"""Development configuration"""
DEBUG = True
我有两个版本的邮件发送代码
版本 1(W/O 外部配置文件)
# app.py
from flask import Flask
from flask_mail import Mail, Message
mail = Mail()
app =Flask(__name__)
app.config['MAIL_SERVER']='smtp.gmail.com'
app.config['MAIL_PORT'] = 465
app.config['MAIL_USERNAME'] = 'test@gmail.com'
app.config['MAIL_PASSWORD'] = 'test'
app.config['MAIL_USE_TLS'] = False
app.config['MAIL_USE_SSL'] = True
print(app.config)
mail.init_app(app)
@app.route("/")
def index():
msg = Message('Hi', sender = 'test@gmail.com', recipients = ['test@gmail.com'])
msg.body = "Hello"
mail.send(msg)
return "Sent"
if __name__ == '__main__':
app.run(debug = True)
此版本发送电子邮件没有问题
版本 2(使用 from_object() 配置)
# app.py
from flask import Flask
from flask_mail import Mail, Message
mail = Mail()
app = Flask(__name__)
app.config.from_object('config.DevelopmentConfig')
# mail = Mail(app)
print(app.config)
mail.init_app(app)
@app.route("/")
def index():
print('Sending email')
msg = Message('Tutorial point3', sender = 'test@gmail.com', recipients = ['test@gmail.com'])
msg.body = "Hello Flask message sent from Flask-Mail "
mail.send(msg)
return "Sent"
if __name__ == '__main__':
app.run()
下面是配置文件
# config.py
class BaseConfig:
"""Base configuration"""
DEBUG = False
TESTING = False
SQLALCHEMY_TRACK_MODIFICATIONS = False
SECRET_KEY = 'my_precious'
MAIL_SERVER = 'smtp.gmail.com'
MAIL_PORT = 465
MAIL_USE_SSL = True
MAIL_USE_TLS = False
MAIL_USERNAME = 'test@google.com'
MAIL_PASSWORD = 'test'
class DevelopmentConfig(BaseConfig):
"""Development configuration"""
DEBUG = True
不知何故第 2 版无法工作并给我这个错误
smtplib.SMTPAuthenticationError: (535, b'5.7.8 Username and Password not accepted. Learn more at\n5.7.8 https://support.google.com/mail/?p=BadCredentials x4sm75923481pfk.51 - gsmtp')
错误消息说我的凭据是错误的,但我认为这不是真的,因为在版本 1 中我使用完全相同的用户名和密码并且它工作正常。
为了查明我在 config.py 中的配置是否已加载,我做了 print(app.config)
(尽管我不确定这是否是一个好方法),看起来我的配置已正确加载到我的 Flask 应用程序。
<Config {'DEBUG': True, 'TESTING': False, 'PROPAGATE_EXCEPTIONS': None, 'PRESERVE_CONTEXT_ON_EXCEPTION': None, 'SECRET_KEY': 'my_precious', 'PERMANENT_SESSION_LIFETIME': datetime.timedelta(31), 'USE_X_SENDFILE': False, 'LOGGER_NAME': '__main__', 'LOGGER_HANDLER_POLICY': 'always', 'SERVER_NAME': None, 'APPLICATION_ROOT': None, 'SESSION_COOKIE_NAME': 'session', 'SESSION_COOKIE_DOMAIN': None, 'SESSION_COOKIE_PATH': None, 'SESSION_COOKIE_HTTPONLY': True, 'SESSION_COOKIE_SECURE': False, 'SESSION_REFRESH_EACH_REQUEST': True, 'MAX_CONTENT_LENGTH': None, 'SEND_FILE_MAX_AGE_DEFAULT': datetime.timedelta(0, 43200), 'TRAP_BAD_REQUEST_ERRORS': False, 'TRAP_HTTP_EXCEPTIONS': False, 'EXPLAIN_TEMPLATE_LOADING': False, 'PREFERRED_URL_SCHEME': 'http', 'JSON_AS_ASCII': True, 'JSON_SORT_KEYS': True, 'JSONIFY_PRETTYPRINT_REGULAR': True, 'JSONIFY_MIMETYPE': 'application/json', 'TEMPLATES_AUTO_RELOAD': None, 'MAIL_PASSWORD': 'test', 'MAIL_PORT': 465, 'MAIL_SERVER': 'smtp.gmail.com', 'MAIL_USERNAME': 'test@google.com', 'MAIL_USE_SSL': True, 'MAIL_USE_TLS': False, 'SQLALCHEMY_TRACK_MODIFICATIONS': False}>
提前感谢您的帮助!
更新1: 修改标题以便更好地理解。 此外,当我测试这两个版本时,我使用了实际的 gmail 地址和密码,但在代码片段中我将所有凭据替换为 "test" 以保护我的帐户
第 2 版中有错字。 我从this flask official snippets复制了代码,所以我希望这个答案能帮助人们避免陷入同样的陷阱。
class BaseConfig:
"""Base configuration"""
DEBUG = False
TESTING = False
SQLALCHEMY_TRACK_MODIFICATIONS = False
SECRET_KEY = 'my_precious'
MAIL_SERVER = 'smtp.gmail.com' # <-- Here
MAIL_PORT = 465
MAIL_USE_SSL = True
MAIL_USE_TLS = False
MAIL_USERNAME = 'test@gmail.com'
MAIL_PASSWORD = 'test'
class DevelopmentConfig(BaseConfig):
"""Development configuration"""
DEBUG = True