Python应用集成Gmail发送邮件触发SMTP 334错误如何排查
问题根因
返回的(334, b'UGFzc3dvcmQ6')是SMTP认证阶段的标准提示,把UGFzc3dvcmQ6做base64解码结果就是Password:,代表服务端要求校验密码,但你传入的密码参数未通过校验或未被正确读取。你已经完成了2FA开启、应用专用密码生成、IMAP开启、安全访问确认这些前置操作,代码语法本身没有错误,故障基本出在参数读取环节,和服务端权限配置无关。
排查修复步骤
- 优先排查环境变量读取问题:这是这类报错最常见的诱因
- 先做对照测试:临时把代码里的
EMAIL_ADDRESS、EMAIL_PASSWORD直接替换为你的Gmail完整地址、16位应用专用密码(测试完成后必须立刻删除硬编码内容,避免凭证泄露),运行脚本看是否发信成功。如果硬编码状态下可以正常发信,100%是环境变量配置错误:- 检查设置环境变量的终端和运行Python脚本的终端是否为同一个会话,环境变量是会话级配置,重启终端、切换终端窗口后之前设置的变量会自动失效
- 配置环境变量时等号两侧不能加空格:Windows系统用
set Email_Password=你的应用密码、macOS/Linux用export Email_Password=你的应用密码,等号后面如果多打了空格,空格会被识别为密码的一部分,直接导致认证失败 - 如果在VSCode、PyCharm等IDE内运行脚本,需要在项目的运行配置面板里单独配置环境变量,IDE不会自动读取系统终端中设置的环境变量
- 先做对照测试:临时把代码里的
- 如果硬编码后仍然报错,检查应用专用密码本身的配置问题:
- 生成应用专用密码时,应用类型要选择「邮件」,设备选择当前运行脚本的对应设备,不要选其他应用类型,否则生成的密码没有SMTP发信权限
- 复制应用专用密码时不要带前后空格、不要漏字符,应用专用密码是16位连续字符串,不需要输入你Gmail账号的原始登录密码,2FA开启后原始密码无法通过SMTP认证
- 你的SMTP连接配置本身是正确的:
smtp.gmail.com搭配465端口走SMTP_SSL不需要额外配置starttls,不要随意更换端口为587调整连接方式,避免引入额外问题。
临时验证用代码
import smtplib from email.message import EmailMessage # 仅用于验证配置,测试完成后立刻删除硬编码的账号密码,换回环境变量读取方式 EMAIL_ADDRESS = "你的完整Gmail地址,格式为xxx@gmail.com" EMAIL_PASSWORD = "16位无空格应用专用密码" msg = EmailMessage() msg['Subject'] = 'Testing email.' msg['From'] = EMAIL_ADDRESS msg['To'] = 'orchidlight09@gmail.com' msg.set_content('This is a test email.') with smtplib.SMTP_SSL('smtp.gmail.com', 465) as smtp: smtp.login(EMAIL_ADDRESS, EMAIL_PASSWORD) smtp.send_message(msg)
安全提示:不要把包含账号、应用专用密码的代码上传到公开代码仓库,生产环境始终使用环境变量或专用密钥管理服务读取凭证。
内容的提问来源于stack exchange,提问作者orchid light
相关产品推荐
相关产品推荐

