更新Flask-Mail后邮件无法发送,网站出现404错误求助
问题描述
- 网站出现404错误,邮件确认功能失效,推测因谷歌安全设置变更导致
- 已完成操作:更新所有软件包及Python版本,开启谷歌两步验证并创建应用密码
- 调用
send_email函数无报错,但收不到邮件;已成功ping通smtp.gmail.com - 注意:Flask及谷歌安全机制已更新,请勿提供过时方案
相关代码文件
email.py
from flask_mail import Message from GetMowed2 import app, mail def send_email(to, subject, template): msg = Message( subject, recipients=[to], html=template, sender=app.config['MAIL_DEFAULT_SENDER'] ) mail.send(msg)
init.py
from flask_mail import Mail, Message import json app = Flask(__name__) # from GetMowed2 import app as application #with open('/etc/config.json') as config_file: # config = json.load(config_file) app.config.from_file("/etc/config.json", load=json.load) # Magic that creates everything, including Base (db.Model), engine (db.engine), and session > app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///Mowed2.db' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = 'SQLALCHEMY_TRACK_MODIFICATIONS' app.config['SECRET_KEY'] = 'SECRET_KEY' app.config['SECURITY_PASSWORD_SALT'] = 'SECURITY_PASSWORD_SALT' # mail settings app.config['MAIL_SERVER']= 'MAIL_SERVER' app.config['MAIL_PORT'] = 'MAIL_PORT' app.config['MAIL_USE_TLS'] = 'MAIL_USE_TLS' app.config['MAIL_USE_SSL'] = 'MAIL_USE_SSL' app.config['TESTING'] = 'TESTING' app.config['MAIL_SUPPRESS_SEND'] = 'MAIL_SUPPRESS_SEND' app.config['MAIL_FAIL_SILENTLY'] = 'MAIL_FAIL_SILENTLY' # gmail authentication app.config['MAIL_USERNAME'] = 'MAIL_USERNAME' app.config['MAIL_PASSWORD'] = 'MAIL_PASSWORD' # mail accounts app.config['MAIL_DEFAULT_SENDER'] = 'MAIL_DEFAULT_SENDER' mail = Mail(app)
config.json
{ "SQLALCHEMY_TRACK_MODIFICATIONS": false, "SECRET_KEY": "*******", "SECURITY_PASSWORD_SALT": "******", "MAIL_SERVER": "smtp.gmail.com", "MAIL_PORT": 465, "MAIL_USE_TLS": false, "MAIL_USE_SSL": true, "MAIL_SUPPRESS_SEND": false, "MAIL_FAIL_SILENTLY": false, "TESTING": false, "MAIL_USERNAME": "GetMowed2@gmail.com", "MAIL_PASSWORD": "******", "MAIL_DEFAULT_SENDER": "GetMowed2@gmail.com" }
requirements.txt
bcrypt>=3.2.2 blinker>=1.5 cffi>=1.15.1 click>=8.1.3 cryptography>=37.0.4 dnspython>=2.2.1 email-validator>=1.2.1 Flask>=2.2.2 Flask-Login>=0.6.2 Flask-Mail>=0.9.1 Flask-SQLAlchemy>=2.5.1 Flask-User>=1.0.2.2 Flask-WTF>=1.0.1 greenlet>=1.1.2 gunicorn>=20.1.0 idna>=3.3 importlib-metadata>=4.12.0 itsdangerous>=2.1.2 Jinja2>=3.1.2 MarkupSafe>=2.1.1 passlib>=1.7.4 pkg_resources>=0.0.0 pycparser>=2.21 six>=1.16.0 SQLAlchemy>=1.4.40 Werkzeug>=2.2.2 WTForms>=3.0.1 zipp>=3.8.1
解决方案
1. 修复配置覆盖问题
__init__.py中,你通过app.config.from_file()加载了config.json的正确配置,但后续手动给邮件相关配置赋值为字符串常量(如app.config['MAIL_SERVER']= 'MAIL_SERVER'),直接覆盖了配置文件中的有效值,导致Flask-Mail无法连接正确的SMTP服务器。必须删除所有手动覆盖配置的代码,仅保留配置文件加载逻辑。
修改后的核心配置部分:
app.config.from_file("/etc/config.json", load=json.load) # 仅保留数据库URI配置,其余配置从config.json读取 app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///Mowed2.db' mail = Mail(app)
2. 验证谷歌应用密码
- 确认
config.json中的MAIL_PASSWORD是完整的16位谷歌应用密码,无空格或多余字符 - 应用密码需在开启两步验证的账号下生成,且选择的应用类型为「邮件」
3. 调试邮件发送
- 开启Flask调试模式,查看隐藏错误:
app.run(debug=True) - 检查谷歌账号「最近活动」页面,确认SMTP登录是否被拦截
- 尝试更换SMTP端口:若465端口异常,改用587端口并开启TLS,修改
config.json:"MAIL_PORT": 587, "MAIL_USE_TLS": true, "MAIL_USE_SSL": false
4. 404错误排查
404与邮件功能无关,需检查:
- Flask路由配置是否完整,所有请求路径都有对应视图函数
url_for生成的链接端点名称是否正确- 服务器部署配置(如gunicorn、nginx)是否正确映射到Flask应用入口
内容的提问来源于stack exchange,提问作者CodeDiggs
相关产品推荐
相关产品推荐

