You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python发送Gmail邮件 谷歌停用低安全应用后报SMTP认证错误

问题原因

Google已于2022年5月全面下线「低安全性应用访问」权限,原有直接使用Gmail账号登录密码调用SMTP接口发信的方式已被官方禁用,即便你填写的账号、密码完全正确,也会抛出535 Username and Password not accepted的认证错误,和代码逻辑本身无关。
你遇到的STARTTLS extension not supported by server报错属于端口与连接方式不匹配:465端口是Gmail的SMTPS端口,从连接建立之初就走SSL加密,不需要额外调用starttls()升级加密;starttls()是给587端口(明文初始连接)设计的加密升级方法,在465端口上调用必然触发报错。

修复方案

按以下步骤操作即可恢复发信功能:

  • 首先登录对应Gmail账号的Google管理后台,进入「安全性」设置页,开启账号的两步验证。注意:未开启两步验证的账号不会显示应用专用密码的生成入口,这一步是必须操作。
  • 两步验证开启后,在安全性设置页找到「应用专用密码」选项,应用类型选择「邮件」,设备类型选择你运行代码的对应设备,点击生成后会得到一个16位长度的随机授权密码,该密码仅展示一次,请及时复制保存。
  • 修改原有代码,将代码中serverPw变量对应的原来的账号登录密码,替换为刚才生成的16位应用专用密码,保留原有SMTP_SSL连接465端口的逻辑即可,不要额外添加starttls()调用。

修正后的可运行代码参考:

import smtplib

server = smtplib.SMTP_SSL("smtp.gmail.com", 465)
serverEmail = "你的完整Gmail地址"
serverPw = "刚才生成的16位应用专用密码"  # 不要填原来的账号登录密码
server.login(serverEmail, serverPw)
subject = "Rejection"
body = "Hi! You've been unfortunately declined access to our system."
message = f'Subject: {subject}\n\n{body}'
server.sendmail(serverEmail, doctorEmail['email'], message)
server.quit()
额外排查点

如果按上述步骤操作后仍报错,逐一核对以下项:

  • 复制应用专用密码时不要带入多余空格、换行,也不要漏输字符,16位密码无分隔符也可正常识别,优先直接复制粘贴避免手动输入错误。
  • 如果使用的是企业/学校分配的Google Workspace托管账号,需要联系对应组织的管理员,在后台为账号开启SMTP发信权限,个人普通Gmail账号无此限制。
  • 如果一定要使用STARTTLS连接方式,需要将连接端口改为587,不要在465端口上调用starttls(),对应写法参考:
# STARTTLS模式与上方SSL模式二选一即可,优先使用465端口的SSL连接稳定性更高
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
# 后续登录、发信、退出逻辑和上述代码完全一致

内容的提问来源于stack exchange,提问作者Ipha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 05:42:31