使用Python发送邮件时遇smtplib.SMTPNotSupportedError:服务器不支持STARTTLS扩展
解决smtplib.SMTPNotSupportedError: STARTTLS extension not supported by server问题
看起来你在用Gmail SMTP发送邮件时碰到了TLS相关的错误,先别慌——Gmail的smtp.gmail.com:587是明确支持STARTTLS的,这个错误大概率是代码流程缺了关键步骤,或者认证配置出了问题。我帮你梳理下解决方案:
错误原因分析
这个提示表示你的SMTP客户端尝试启用STARTTLS加密,但服务器返回不支持该扩展。但Gmail的587端口是专门用来走STARTTLS加密流程的,所以问题肯定出在你的代码没正确触发加密环节,或者后续认证步骤有遗漏。
修正后的完整代码
先给你一个能正常运行的版本,我会标注关键修改点:
from email.mime.text import MIMEText import smtplib def send_email(email): from_email = "mine@gmail.com" # 重要提示:如果你的Gmail开了两步验证,这里必须用「应用专用密码」,不是日常登录密码 from_password = "你的应用专用密码或登录密码" to_email = email subject = "Data" message = "Hey there!!" msg = MIMEText(message, 'html') msg['Subject'] = subject msg['To'] = to_email msg['From'] = from_email # 核心流程修正 with smtplib.SMTP('smtp.gmail.com', 587) as gmail: # 启用STARTTLS加密(这一步是你代码里缺失的关键环节!) gmail.starttls() # 执行账号登录认证 gmail.login(from_email, from_password) # 发送邮件 gmail.send_message(msg)
关键注意事项
- 必须调用
starttls():在连接服务器后、登录之前,一定要执行这个方法开启加密通道,否则Gmail会直接拒绝登录请求,甚至抛出你遇到的TLS不支持错误。 - Gmail认证特殊处理:
- 如果你的账号开启了两步验证(2FA),普通登录密码会失效,需要去Google账号设置里生成应用专用密码,用这个密码替代登录密码。
- 没开2FA的话,需要在Google账号设置里允许「不太安全的应用访问」(不过这个选项正在被逐步淘汰,更推荐开启2FA后用应用专用密码)。
- 用
with语句管理连接:这种写法会自动帮你关闭SMTP连接,避免资源泄漏,比手动调用quit()更稳妥。
额外排查点
如果还是报错,可以检查:
- 网络是否能正常访问
smtp.gmail.com,有没有被防火墙或代理拦截 - 端口是否正确:Gmail的SMTP端口还有465(SSL加密),如果改用465端口,要换成
smtplib.SMTP_SSL初始化连接,不需要再调用starttls()
内容的提问来源于stack exchange,提问作者user496119
相关产品推荐
相关产品推荐

