You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

通过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.SMTPsource_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

火山引擎 最新活动