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

