使用create_app初始化Flask应用时Flask-Mail无法发邮件的解决方法
解决Flask工厂模式下邮件发送失败的问题
问题出在两个核心点:
__init__.py里定义了全局的mail实例,但没在create_app()函数中完成它与Flask应用的绑定app.py里重复创建了mail实例,导致这个新实例无法读取到create_app()里配置的邮件参数
第一步:修改__init__.py
在create_app()函数中,找到db.init_app(app)这一行,在它后面添加mail.init_app(app),让全局的mail实例和当前创建的Flask应用完成绑定:
def create_app(): app = Flask(__name__) # ... 其他原有配置代码保持不变 ... db.init_app(app) # 添加这行代码,绑定mail实例与应用 mail.init_app(app) # ... 后续蓝图注册、数据库创建等代码保持不变 ...
第二步:修改app.py
删掉自己创建的mail = Mail(app),改成从website包导入已经初始化好的mail实例:
from website import create_app, mail # 从包中导入全局mail实例 from flask import Flask, request, render_template from flask_mail import Message # 无需再导入Mail类 app = create_app() # 删掉这一行:mail = Mail(app) def send_email_notification(email, body): msg = Message('Scheduled Notification', sender='your_email@gmail.com', recipients=['myemail']) msg.body = body mail.send(msg) # ... 后续路由代码保持不变 ...
最后检查配置
确保__init__.py里的MAIL_USERNAME和MAIL_PASSWORD已填写正确内容(如果使用Gmail,开启两步验证后需要用应用专用密码,而非普通登录密码)。
现在启动应用,点击按钮提交表单,就能正常发送邮件了。
内容的提问来源于stack exchange,提问作者Snatking09
相关产品推荐
相关产品推荐

