FastAPI应用使用Gmail SMTP发送邮件时遭遇凭据无效(Bad credentials)错误的求助
FastAPI应用使用Gmail SMTP发送邮件时遭遇凭据无效(Bad credentials)错误的求助
看起来你在使用Gmail SMTP发送Jinja2模板渲染的HTML邮件时碰到了535凭据错误,我来帮你一步步排查可能的问题:
1. 确认应用专用密码的使用前提
Gmail的应用专用密码只有在**开启两步验证(2FA)**的账号下才会生效,这是最容易被忽略的前提!如果你的Gmail账号没开2FA,哪怕生成了应用密码也会被判定为无效凭据,先去Google账号的「安全性」页面确认2FA已经开启。
2. 检查账号与密码的准确性
- 应用密码是16位无空格的字符串,复制时一定要完整粘贴(别手动输入,很容易漏字符或多打空格),建议直接从Google的应用密码生成页面复制到你的配置里。
- 代码中
server.login使用的是sender_email,要确保这个变量是你生成应用密码的完整Gmail地址(比如your-name@gmail.com),而不是代码里硬编码的短用户名"Tokeri51"——Gmail登录必须用完整邮箱地址,不能用缩写。
3. 代码变量一致性排查
你的代码里存在几个变量混用的情况,容易导致逻辑混乱:
- 定义了
smtp_username = "Tokeri51",但msg['From']和server.login用的是sender_email,要确保sender_email、smtp_username指向同一个Gmail账号。 - 敏感信息(邮箱、应用密码)建议用环境变量存储,避免硬编码出错,比如:
import os sender_email = os.getenv("GMAIL_FULL_ADDRESS") smtp_password = os.getenv("GMAIL_APP_PASSWORD")
4. Google账号的额外安全校验
- 刚生成应用密码后,Google服务器可能需要1-2分钟同步设置,别急着马上测试,可以等几分钟再试。
- 去Google账号的「最近的安全活动」页面,看看是否有被标记为“异常登录”的记录,如果有,手动允许该登录尝试即可。
5. 极简测试验证登录逻辑
先剥离Jinja2模板、MIMEMultipart这些复杂逻辑,写一个极简的测试代码,先确认SMTP登录和基础邮件发送功能正常:
import smtplib import ssl from email.mime.text import MIMEText def test_gmail_smtp(): # 替换为你的真实信息 sender_email = "your-full-gmail-address@gmail.com" app_password = "your-16-char-app-password" smtp_server = "smtp.gmail.com" smtp_port = 587 context = ssl.create_default_context() try: with smtplib.SMTP(smtp_server, smtp_port) as server: server.starttls(context=context) # 重点测试登录环节 server.login(sender_email, app_password) print("登录成功!") # 发送测试邮件到自己邮箱 msg = MIMEText("这是Gmail SMTP测试邮件") msg['Subject'] = "SMTP测试" msg['From'] = sender_email msg['To'] = sender_email server.sendmail(sender_email, sender_email, msg.as_string()) print("测试邮件发送成功!") except Exception as e: print(f"错误详情: {str(e)}") test_gmail_smtp()
如果以上步骤都排查过还是不行,可以检查一下网络环境:比如公司/学校的防火墙是否拦截了587端口(Gmail SMTP的TLS端口),或者尝试切换到465端口的SSL连接(代码里用smtplib.SMTP_SSL而不是SMTP+starttls)。




