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
相关产品推荐
相关产品推荐

