Flask使用Gmail发送邮件报SMTPSenderRefused 530认证错误如何解决
问题根因及修复方案
你遇到的530认证错误核心是配置项名称写错,同时还有遗漏导入的问题,修正方案如下:
- 缺少
os模块导入:代码中调用了os.getenv()但没有导入os,会先触发模块未找到的错误 - Flask-Mail配置字段错误:Flask-Mail读取用户名的配置项是
MAIL_USERNAME,你写的MAIL_USER是无效字段,导致邮箱用户名没有被正确传入认证逻辑,直接触发认证失败 - 路由POST分支缺少返回值:POST请求处理完成后没有返回响应,会触发Flask路由异常
修正后完整代码
import os from flask import Flask, render_template, redirect, request from flask_mail import Mail, Message app = Flask(__name__) app.config["MAIL_SERVER"] = "smtp.gmail.com" app.config["MAIL_PORT"] = 587 app.config["MAIL_USE_TLS"] = True # 修正配置项名称为MAIL_USERNAME app.config["MAIL_USERNAME"] = os.getenv("MAIL_USERNAME") app.config["MAIL_DEFAULT_SENDER"] = os.getenv("MAIL_USERNAME") app.config["MAIL_PASSWORD"] = os.getenv("MAIL_PASSWORD") mail = Mail(app) @app.route("/", methods=["GET", "POST"]) def index(): if request.method == "POST": recipient = request.form.get("email") msg = Message("Welcome on board!", recipients=[recipient]) mail.send(msg) # 补全POST分支返回 return "邮件发送成功" elif request.method == "GET": return render_template("greetings.html")
剩余问题排查
如果修正后还有问题,可以按以下顺序排查:
- 确认谷歌账号已开启两步验证,且生成的应用专用密码对应你当前使用的邮箱
- 运行时打印环境变量
os.getenv("MAIL_USERNAME")和os.getenv("MAIL_PASSWORD"),确认能正常读取到正确的凭证内容 - 确认邮箱没有被谷歌临时限制登录,可登录邮箱查看安全提醒邮件确认
内容的提问来源于stack exchange,提问作者Muhammad Abd-Elsattar
相关产品推荐
相关产品推荐

