FastAPI应用无法登录Gmail SMTP服务器:凭据无效问题求助
解决Gmail SMTP登录失败(535 5.7.8 Username and Password not accepted)的方案
我之前也碰到过一模一样的问题,折腾了好一阵才搞定,给你整理几个最可能的解决方向:
一、确认应用密码的正确性与配置前提
- 必须开启两步验证:Gmail的应用密码只对开启了两步验证的账号生效,先去你的Google账号安全中心确认两步验证已经打开。
- 应用密码的生成规则:
- 生成时要选择「邮件」作为应用类型,选「其他(自定义名称)」也可以,但别选错类型
- 16位应用密码是没有空格的,复制的时候别把空格带进去,也别手动添加空格
- 替换代码里的密码:确保你代码里的
smtp_password确实是这串16位密码,而不是你的Google账号原密码
二、检查代码里的账号与配置匹配
看你代码里的变量,这里很容易踩坑:
smtp_username设成了"Tokeri51",但server.login用的是sender_email,这两个必须完全一致!要么都用你的完整Gmail地址(比如tokeri51@gmail.com),要么都用账号前缀,但更稳妥的是用完整邮箱地址- 确认
smtp_server是"smtp.gmail.com",smtp_port是587(TLS专用端口),这两个参数别写错
三、Google账号的安全限制检查
- 别找「不太安全的应用」选项:Google已经取消了这个功能,现在只能用应用密码或者OAuth2来登录SMTP,所以不用再浪费时间找这个选项
- 检查账号异常登录拦截:去Google账号的「最近活动」里看看有没有被拦截的登录请求,要是有的话,点击「这是我」允许该登录
- 启用IMAP服务:去Gmail设置里的「转发和POP/IMAP」标签,确认IMAP访问已经开启(虽然SMTP是发件服务,但这个开关有时候会关联影响登录权限)
四、代码里的小细节修正
你的代码里有几个变量可能没定义全,比如sender_email、sender_password、smtp_server、smtp_port,建议直接在代码里明确赋值(正式环境推荐用环境变量):
# 测试用明确配置(正式环境建议用os.getenv读取环境变量) smtp_server = "smtp.gmail.com" smtp_port = 587 sender_email = "tokeri51@gmail.com" # 你的完整Gmail地址 smtp_password = "你的16位无空格应用密码"
另外,server.login的第一个参数要和sender_email完全一致,别混用账号前缀和完整邮箱。
五、用极简代码排查问题
如果还是不行,先写个极简的测试代码排除其他干扰(比如Jinja模板、日志模块):
import smtplib import ssl smtp_server = "smtp.gmail.com" port = 587 sender_email = "your-gmail-address@gmail.com" password = "your-16-digit-app-password" receiver_email = "test@example.com" context = ssl.create_default_context() try: server = smtplib.SMTP(smtp_server, port) server.ehlo() server.starttls(context=context) server.ehlo() server.login(sender_email, password) server.sendmail(sender_email, receiver_email, "Test email content") print("Email sent successfully!") except Exception as e: print(f"Error: {e}") finally: server.quit()
如果这个极简代码能成功,那就是你原来的代码里其他部分(比如模板加载、变量赋值)的问题;如果还是失败,那就是账号配置的问题,需要再仔细检查Google账号的安全设置。
内容的提问来源于stack exchange,提问作者Tomas Keri
相关产品推荐
相关产品推荐

