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

Smtplib连接意外关闭求助:代码报错但Telnet可正常连接

解决smtplib.SMTPServerDisconnected连接异常问题

你的代码里有几个明显的逻辑冲突,导致了连接意外关闭的错误,咱们一步步拆解修复:

问题核心分析

  1. 端口与连接协议不匹配:你先用端口26初始化了普通smtplib.SMTP对象,紧接着又调用connect连接465端口——这两个端口的工作逻辑完全不同:

    • 端口26是明文SMTP端口,需要通过starttls()升级为加密连接
    • 端口465是SMTPS专属端口,要求从建立连接开始就使用SSL加密,不能用普通SMTP对象处理
  2. 重复连接操作:初始化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:44:53