Ver*_*lon 8 python proxy pop3 imap
poplib或imaplib似乎都没有提供代理支持,尽管我的google-fu尝试,但我找不到有关它的更多信息.
我正在使用python从各种支持imap/pop的服务器获取电子邮件,并且需要能够通过代理来完成.
理想情况下,我希望能够直接在python中完成它,但如果我找不到更好的东西,使用包装器(外部程序/脚本,基于OSX)强制所有流量通过代理可能就足够了.
有人能帮我一把吗?我无法想象我是唯一需要通过python中的代理获取电子邮件的人...
**编辑标题编辑删除HTTP,因为当我累了我不应该这么快打字,对不起那些家伙**
我打算使用的代理允许除了http之外的袜子.
Pop或Imap通过http工作没有多大意义(有状态对无国籍)但我的理解是袜子可以让我做我想做的事.
到目前为止,达到我想要的唯一方法似乎是对imaplib进行肮脏的黑客攻击......如果可以的话,宁愿避免使用它.
Mat*_*ttH 10
你不需要肮脏地破解imaplib.您可以尝试使用SocksiPy包,它支持socks4,socks5和http代理(连接):
像这样的东西,显然你想要更好地处理setproxy选项,通过自定义__init__方法的额外参数等.
from imaplib import IMAP4, IMAP4_SSL, IMAP4_PORT, IMAP4_SSL_PORT
from socks import sockssocket, PROXY_TYPE_SOCKS4, PROXY_TYPE_SOCKS5, PROXY_TYPE_HTTP
class SocksIMAP4(IMAP4):
    def open(self,host,port=IMAP4_PORT):
        self.host = host
        self.port = port
        self.sock = sockssocket()
        self.sock.setproxy(PROXY_TYPE_SOCKS5,'socks.example.com')
        self.sock.connect((host,port))
        self.file = self.sock.makefile('rb')
你可以用IMAP4_SSL做类似的事情.只需注意将其包装成ssl插槽即可
import ssl
class SocksIMAP4SSL(IMAP4_SSL):
    def open(self, host, port=IMAP4_SSL_PORT):
        self.host = host
        self.port = port
        #actual privoxy default setting, but as said, you may want to parameterize it
        self.sock = create_connection((host, port), PROXY_TYPE_HTTP, "127.0.0.1", 8118)
        self.sslobj = ssl.wrap_socket(self.sock, self.keyfile, self.certfile)
        self.file = self.sslobj.makefile('rb')
回答我自己的问题......有一种快速而肮脏的方法可以强制使用python脚本中的流量来通过代理而不用麻烦使用Socksipy(感谢MattH指点我的方式)
import socks
import socket
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS4,proxy_ip,port,True)
socket.socket = socks.socksocket
那个全局套接字覆盖显然有点残酷,但作为一个快速修复,直到我找到时间正确子类IMAP4和IMAP4_SSL.