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

Python通过Gmail SMTP发邮件报错SMTPServerDisconnected:请先运行connect()

错误原因

你搞错了with上下文管理器的作用范围:with smtplib.SMTP_SSL("smtp.gmail.com", port, context=context) as server 代码块执行完毕后,和Gmail服务器的SMTP连接会被自动关闭。你把server.sendmail()写在了with块外面,此时连接已经释放,自然会抛出please run connect() first的错误。
你的Gmail侧配置没有问题:开启两步验证、创建应用专用密码这两个发信的必要前置条件都已满足,不需要调整Google账号的相关设置。

修复方案

把发信相关的所有逻辑(包括邮件内容定义、sendmail调用)都放到with块内部,保证调用发信接口时连接处于有效状态,修复后的可运行代码如下:

import smtplib
import ssl

port = 465  # Gmail SSL SMTP端口
password = "你自己创建的Gmail应用专用密码"
sender_email = "test@gmail.com"
receiver_email = "test@gmail.com"
# 定义邮件内容
message = """\
Subject: Test

Test."""

context = ssl.create_default_context()
# 所有和SMTP服务交互的操作都放在with块内
with smtplib.SMTP_SSL("smtp.gmail.com", port, context=context) as server:
    server.login(sender_email, password)
    server.sendmail(sender_email, receiver_email, message)
注意事项
  • 不要把邮箱账号、应用密码硬编码在代码中,正式使用时建议从环境变量或本地独立配置文件读取,避免凭证泄露
  • 如果需要发送带HTML格式、附件的邮件,搭配Python标准库的email模块构建标准MIME格式邮件即可,能大幅降低被Gmail判定为垃圾邮件的概率
  • 你当前选择的465端口+SSL直连的方式是Gmail官方支持的发信方式,不需要更换为587端口的STARTTLS模式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 17:36:28