You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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_emailsmtp_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)。

火山引擎 最新活动