通过SOCKS5代理连接SMTP服务器失败问题求助
问题:SOCKS5代理验证正常,但无法连接SMTP服务器
嘿,我来梳理下目前的情况,然后给你解决思路:
1. 已确认SOCKS5代理正常工作
我先用requests库验证了代理可用性,代码如下:
import requests proxy = {"socks5": "http://8af309b04420:1858f2fd8c@185.242.108.72:12324/"} url = 'http://example.org' r = requests.get(url, proxies=proxy) print(r.status_code)
执行后返回状态码200,说明代理本身是可以正常使用的。
2. 尝试连接SMTP服务器失败
接着我用smtplib尝试连接Gmail的SMTP服务器,代码如下:
import smtplib smtpserver = smtplib.SMTP("smtp.gmail.com", 587, source_address=("http://8af309b04420:1858f2fd8c@185.242.108.72:12324/", 12324))
结果抛出错误:socket.gaierror: [Errno 11003] getaddrinfo failed
问题根源&解决方案
你这里踩了一个典型的误区:smtplib.SMTP的source_address参数根本不是用来设置代理的! 这个参数的作用是指定本地发起连接时使用的IP和端口,完全和代理无关。你把带用户名密码的代理URL填进去,系统会把它当成IP地址去解析,自然会报错。
要让smtplib通过SOCKS5代理连接,我们需要借助pysocks库(先通过pip install pysocks安装)来给socket层设置代理。具体代码如下:
import smtplib import socks import socket # 配置SOCKS5代理信息 socks.set_default_proxy( socks.SOCKS5, addr="185.242.108.72", port=12324, username="8af309b04420", password="1858f2fd8c" ) # 让全局socket使用代理配置 socket.socket = socks.socksocket # 正常连接SMTP服务器 try: smtpserver = smtplib.SMTP("smtp.gmail.com", 587) smtpserver.starttls() # Gmail必须启用TLS加密 # 后续可以执行登录、发邮件操作 # smtpserver.login("你的Gmail邮箱", "应用专用密码") print("SMTP连接成功!") smtpserver.quit() except Exception as e: print(f"连接失败:{str(e)}")
额外注意事项
- 如果你用的是Gmail,现在必须使用应用专用密码(开启两步验证后才能生成),普通密码直接登录会失败;不推荐关闭两步验证并允许低安全性应用。
- 确保你的SOCKS5代理支持TCP协议转发(SMTP基于TCP,代理必须支持该协议)。
- 如果你不想让全局socket都走代理,也可以单独给SMTP配置代理:
# 单独给SMTP设置代理,不影响其他网络请求 class ProxySMTPsocket(socks.socksocket): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.set_proxy( socks.SOCKS5, addr="185.242.108.72", port=12324, username="8af309b04420", password="1858f2fd8c" ) smtplib.SMTP.socket = ProxySMTPsocket
内容的提问来源于stack exchange,提问作者ibrahim




