Python登录Gmail报Invalid credentials错误 低安全应用访问已停用
问题根因
你遇到的[AUTHENTICATIONFAILED] Invalid credentials报错,核心触发原因是谷歌已全面停用Gmail的低安全应用访问权限,所有直接使用账号明文密码通过IMAP/POP/SMTP协议登录的请求,都会被谷歌服务端直接拦截,和代码逻辑错误、普通密码输入错误没有直接关系。
可行解决方案
以下方案按改造成本从低到高排序,可根据自己的账号权限情况选择:
方案1:使用应用专用密码(零代码改造,优先推荐)
这个方案不需要修改现有IMAP登录逻辑,只需要替换登录用的密码即可:- 先登录对应谷歌账号,在安全设置中开启两步验证(2FA),未开启两步验证的账号无法生成应用专用密码
- 两步验证开启后,在安全设置页找到「应用专用密码」配置项,应用类型选择「邮件」,设备可自定义填写(比如你部署在AWS Lambda就填对应名称即可),系统会生成一组16位长度的专用密码
- 把代码中原先填写的账号普通登录密码,替换为这组16位应用专用密码,原有
imap4Obj.login()的调用逻辑完全不用改动,即可正常通过认证
注意:如果使用的是谷歌Workspace企业账号,需要先由组织管理员在后台放开应用专用密码的使用权限,否则个人账号设置页不会显示对应入口。
方案2:切换为OAuth2.0认证(官方长期推荐的标准方案)
如果你的账号无法开启两步验证、或者管理员不允许使用应用专用密码,就需要将明文密码登录改造为OAuth2.0授权模式:- 在谷歌云控制台创建对应项目,开启Gmail API服务,创建OAuth2.0授权凭据,拿到客户端ID、客户端密钥
- 走OAuth授权流程,拿到对应Gmail账号的长期刷新令牌(refresh_token)
- 代码中不再直接传入账号密码,而是每次登录前通过刷新令牌换取有效的访问令牌(access_token),通过IMAP的XOAUTH2协议完成认证
核心认证代码参考:
import imaplib from google.oauth2.credentials import Credentials from google.auth.transport.requests import Request # 替换为你自己申请到的凭据信息 EMAIL_ADDR = "你的Gmail邮箱地址" creds = Credentials( token=None, refresh_token="你拿到的refresh_token", token_uri="https://oauth2.googleapis.com/token", client_id="你的OAuth客户端ID", client_secret="你的OAuth客户端密钥", scopes=["https://mail.google.com/"] ) # 刷新获取有效的access_token creds.refresh(Request()) # 拼接XOAUTH2协议要求的认证字符串 auth_content = f"user={EMAIL_ADDR}\x01auth=Bearer {creds.token}\x01\x01" # 建立IMAP SSL连接 imap_conn = imaplib.IMAP4_SSL("imap.gmail.com") # 通过XOAUTH2机制完成认证,无需传入普通密码 imap_conn.authenticate("XOAUTH2", lambda _: auth_content.encode("utf-8"))配套排查校验项
完成上述配置后如果仍然报错,优先检查以下配置:- 确认Gmail设置中已经手动开启了IMAP访问权限,Gmail默认关闭IMAP服务,需要在「转发和POP/IMAP」设置页手动打开
- 确认填写的应用专用密码、OAuth凭据信息没有输入错误,不要多复制前后的空格
- 如果是在云服务器、Serverless平台(比如报错中提到的AWS Lambda)上部署,首次从新的出口IP发起登录请求可能触发谷歌安全风控,需要登录账号在安全通知中手动确认是本人操作,解除IP拦截。
内容的提问来源于stack exchange,提问作者ambigus9
相关产品推荐
相关产品推荐

