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

求助:Python SMTP用户存在检测脚本socket连接错误排查

解决SMTP用户检测脚本的socket连接错误

嘿,我帮你排查下这个socket连接错误的问题~

错误根源

你碰到的socket.gaierror: [Errno -2] Name or service not known,核心问题出在这一行:

connect=s.connect(('IpTested', 25))

你把变量IpTested用单引号括起来了!这就导致程序不是去连接你从smtp_ip.txt里读取的IP地址,而是尝试连接一个叫IpTested的主机——系统当然找不到这个“主机名”,所以报错了。

除此之外,脚本还有几个小细节需要调整,不然就算连接成功了,也可能出现其他问题:

  • Python2里print语句虽然可以不加括号,但加上更规范,也方便以后迁移到Python3
  • 从文件里读取的每一行都会带换行符\n,直接用的话会导致发送的VRFY命令格式错误,得用strip()去掉
  • with语句会自动帮你关闭文件,不需要手动调用ip.close(),反而会报错(因为ip已经被with上下文关闭了)
  • socket.connect()方法没有返回值,不用赋值给connect变量
  • 没有错误处理,只要一个IP连接失败,整个脚本就直接终止了,没法测试其他IP
  • 现在的代码不管连接成功与否,都会执行发送VRFY命令的逻辑,这显然不合理

修正后的完整脚本

#!/usr/bin/python
import socket
import sys

# 读取SMTP服务器IP列表
with open("smtp_ip.txt", "r") as ip_file:
    for ip_line in ip_file:
        # 移除行尾的换行和空白字符,跳过空行
        ip_tested = ip_line.strip()
        if not ip_tested:
            continue
        print("Testing SMTP server: %s" % ip_tested)
        
        try:
            # 创建TCP socket
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            # 设置10秒超时,防止连接卡住
            s.settimeout(10)
            # 这里用变量ip_tested,不是字符串'IpTested'!
            s.connect((ip_tested, 25))
            
            # 接收服务器欢迎banner
            banner = s.recv(1024)
            print("Connected successfully. Banner: %s" % banner.strip())
            
            # 遍历用户列表进行检测
            with open("user.txt", "r") as user_file:
                for user_line in user_file:
                    user = user_line.strip()
                    if not user:
                        continue
                    # 发送VRFY命令
                    s.send('VRFY %s\r\n' % user)
                    result = s.recv(1024)
                    print("VRFY %s: %s" % (user, result.strip()))
            
            # 关闭socket连接
            s.close()
        except socket.error as e:
            print("Failed to connect to %s: %s" % (ip_tested, str(e)))
            # 跳过当前IP,继续测试下一个
            continue

关键修正说明

  1. 修复变量引用错误:把('IpTested', 25)改成(ip_tested, 25),让程序正确使用读取到的IP地址
  2. 处理换行符:用strip()清理每行的空白和换行,保证发送的SMTP命令格式正确
  3. 添加异常处理:用try-except捕获socket连接错误,这样一个IP连接失败时,脚本会继续测试其他IP
  4. 设置超时:给socket加上超时时间,避免遇到无响应的服务器时脚本一直卡住
  5. 调整执行逻辑:只有连接成功后才执行用户检测,避免无效的send/recv操作
  6. 移除冗余代码:删掉了不需要的connect变量赋值和手动关闭文件的代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 17:52:54