Flask对接Gmail SMTP发信报535认证失败错误的解决方法
错误根因
你遇到的535认证错误是Gmail安全策略调整导致的:2022年5月之后Gmail已全量下线「低安全性应用访问」开关,所有第三方客户端直接使用账号主密码登录SMTP的请求都会被直接拦截,和Flask-Mail的配置逻辑无关。
可行解决方案(按适用场景排序)
方案1:使用Gmail应用专用密码(个人账号最快解决方式)
该方案仅适用于个人Gmail账号,要求账号提前开启两步验证(2FA),未开启两步验证的账号不会显示应用专用密码入口:
- 进入Google账号安全设置页,找到「应用专用密码」选项
- 应用类型选择「邮件」,设备选择你运行Flask服务的对应设备,点击生成
- 系统会弹出一串16位的随机密码,该密码仅展示一次,立刻复制保存
- 将环境变量中
MAIL_PASSWORD的值替换为这串16位密码(不要带生成时显示的分隔空格),MAIL_USERNAME保持为完整的Gmail邮箱地址即可,其余配置无需改动 - 注意:应用密码生成后存在5-10分钟的权限同步延迟,如果刚改完还是报错,等待后重试即可;同时不要使用频繁切换节点的代理连接Gmail SMTP,会被判定为异常登录拦截。
方案2:使用Google Workspace SMTP中继(企业域名账号适用)
如果你使用的是Google Workspace付费企业邮箱,不需要给单个账号开2FA和生成应用密码:
- 登录Workspace管理员后台,找到SMTP中继配置页
- 添加你部署Flask服务的出口IP到允许发信列表,配置对应发信域名权限
- 直接使用分配的中继账号密码配置即可,发信限额比个人账号高,适合生产环境批量发信场景。
方案3:替换为第三方专业邮件发送服务(生产环境首选)
如果你的服务部署在无法稳定连接Gmail SMTP的网络环境,或者需要更高的发信到达率、更高的发信限额,直接替换为第三方邮件服务即可:
- 可选服务包括SendGrid、Mailgun、国内的腾讯企业邮、阿里邮件推送等
- 配置逻辑和Gmail完全一致,仅需替换
MAIL_SERVER、MAIL_PORT、MAIL_USERNAME、MAIL_PASSWORD四个参数为对应服务商提供的值即可,不会触发Google的账号安全拦截策略。
正确配置参考
调整后的配置如下,敏感信息始终通过环境变量读取,不要硬编码到代码中:
# 建议将smtp.googlemail.com替换为官方推荐的smtp.gmail.com,兼容性更好 app.config['MAIL_SERVER'] = 'smtp.gmail.com' app.config['MAIL_PORT'] = 587 app.config['MAIL_USE_TLS'] = True app.config['MAIL_USERNAME'] = os.getenv('MAIL_USERNAME') # 填写完整Gmail地址,格式为xxx@gmail.com app.config['MAIL_PASSWORD'] = os.getenv('MAIL_PASSWORD') # 填写16位应用专用密码,不要填账号主登录密码
常见踩坑说明
- 不要再尝试使用账号主密码登录Gmail SMTP,该方式已被完全封禁,必然返回535错误
- 未开启两步验证的个人账号无法生成应用专用密码,必须先开启2FA才能看到对应入口
- 应用密码丢失后不需要修改账号主密码,直接在安全设置页删除旧的应用密码重新生成即可
- 国内服务器直连Gmail SMTP大概率会出现连接超时、连接被重置的问题,这种场景直接选用第三方邮件服务效率更高。
内容的提问来源于stack exchange,提问作者Dimaapp
相关产品推荐
相关产品推荐

