求助: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
关键修正说明
- 修复变量引用错误:把
('IpTested', 25)改成(ip_tested, 25),让程序正确使用读取到的IP地址 - 处理换行符:用
strip()清理每行的空白和换行,保证发送的SMTP命令格式正确 - 添加异常处理:用
try-except捕获socket连接错误,这样一个IP连接失败时,脚本会继续测试其他IP - 设置超时:给socket加上超时时间,避免遇到无响应的服务器时脚本一直卡住
- 调整执行逻辑:只有连接成功后才执行用户检测,避免无效的send/recv操作
- 移除冗余代码:删掉了不需要的
connect变量赋值和手动关闭文件的代码
内容的提问来源于stack exchange,提问作者Aydr
相关产品推荐
相关产品推荐

