Smtplib连接意外关闭求助:代码报错但Telnet可正常连接
解决smtplib.SMTPServerDisconnected连接异常问题
你的代码里有几个明显的逻辑冲突,导致了连接意外关闭的错误,咱们一步步拆解修复:
问题核心分析
端口与连接协议不匹配:你先用端口26初始化了普通
smtplib.SMTP对象,紧接着又调用connect连接465端口——这两个端口的工作逻辑完全不同:- 端口26是明文SMTP端口,需要通过
starttls()升级为加密连接 - 端口465是SMTPS专属端口,要求从建立连接开始就使用SSL加密,不能用普通
SMTP对象处理
- 端口26是明文SMTP端口,需要通过
重复连接操作:初始化
SMTP对象时已经指定了服务器和端口,额外调用connect()会导致服务器端的连接状态混乱,直接触发断开。
两种可行解决方案
方案一:使用端口26(配合starttls加密)
既然你telnet能正常连通端口26,优先用这个端口实现,调整后的代码如下:
import smtplib def mailme(): print('connecting') # 直接用端口26初始化SMTP对象 server = smtplib.SMTP('mail.server.com', 26) print('connected..') server.ehlo() # 升级为加密连接 server.starttls() server.ehlo() server.login('scraper@server.com', "pwd") text = 'TEST 123' # 注意发件人地址你写的是me@sserver.com,检查下拼写是否多了一个s server.sendmail('me@sserver.com', 'me@server2.com', text) server.quit()
方案二:使用端口465(直接SSL连接)
如果要使用465端口,必须用smtplib.SMTP_SSL类初始化,代码如下:
import smtplib def mailme(): print('connecting') # 用SMTP_SSL直接连接465加密端口 server = smtplib.SMTP_SSL('mail.server.com', 465) print('connected..') server.ehlo() server.login('scraper@server.com', "pwd") text = 'TEST 123' server.sendmail('me@sserver.com', 'me@server2.com', text) server.quit()
额外提醒
- 检查发件人地址
me@sserver.com的拼写是否正确(看起来多了一个s),无效地址可能导致服务器主动断开 - 确认登录密码
pwd是否正确,错误的认证信息也会触发连接关闭 - 部分服务器会限制频繁连接,测试时注意间隔时间
内容的提问来源于stack exchange,提问作者Volatil3
相关产品推荐
相关产品推荐

