You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

更新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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 16:36:20