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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:30:50