Python邮件脚本出现smtplib.SMTPAuthenticationError(535)错误的排查与解决
问题分析与修复方案
错误原因
smtplib.SMTPAuthenticationError(535) 本质是Gmail的SMTP认证机制拒绝了登录请求,核心原因有三类:
- 普通密码无法用于第三方SMTP登录:Gmail目前默认禁止使用账号原密码通过非官方应用登录SMTP服务,哪怕密码完全正确也会触发该错误。
- 两步验证开启后未使用应用专用密码:如果Gmail账号开启了两步验证,原密码直接失去第三方SMTP登录权限,必须使用Google生成的「应用专用密码」。
- 账号触发安全拦截:若登录操作存在异常(异地登录、短时间多次请求等),Google会临时拦截请求,需手动在账号安全中心确认操作合法性。
修复步骤
方案1:使用应用专用密码(推荐,适配开启两步验证的账号)
- 登录Google账号,进入「安全」设置界面
- 找到「应用专用密码」选项(需先开启两步验证才会显示)
- 生成新的应用专用密码(可命名为「Python SMTP」便于识别)
- 将代码中
server.login('email', 'password')里的password替换为生成的应用专用密码
方案2:OAuth2认证适配(适配未开启两步验证且不想开启的情况)
若不想开启两步验证,需通过OAuth2协议完成认证,步骤如下:
- 在Google Cloud平台创建项目并启用Gmail API
- 创建OAuth客户端ID,下载凭据文件(命名为
credentials.json) - 使用
google-auth系列库替换原登录逻辑,示例代码:
import smtplib import os from google.oauth2.credentials import Credentials from google.auth.transport.requests import Request from google_auth_oauthlib.flow import InstalledAppFlow SCOPES = ['https://www.googleapis.com/auth/gmail.send'] creds = None # 加载已保存的凭据 if os.path.exists('token.json'): creds = Credentials.from_authorized_user_file('token.json', SCOPES) # 无有效凭据时触发登录流程 if not creds or not creds.valid: if creds and creds.expired and creds.refresh_token: creds.refresh(Request()) else: flow = InstalledAppFlow.from_client_secrets_file( 'credentials.json', SCOPES) creds = flow.run_local_server(port=0) # 保存凭据供后续使用 with open('token.json', 'w') as token: token.write(creds.to_json()) # 连接SMTP并发送邮件 server = smtplib.SMTP('smtp.gmail.com', 587) server.starttls() server.login(creds._id_token, creds.token) e = 0 while e < 2: server.sendmail('你的邮箱@gmail.com', '收件人邮箱@xxx.com', '邮件内容' ) e += 1 print("DONE") server.quit()
额外检查项
- 登录Google账号查看「安全活动」页面,若有被拦截的登录请求,标记为「本人操作」
- 确认代码中的邮箱地址无拼写错误
内容的提问来源于stack exchange,提问作者ChanceMeteor515
相关产品推荐
相关产品推荐

