poplib或imaplib似乎都没有提供代理支持,尽管谷歌尝试了谷歌,但我找不到太多关于它的信息。
我正在使用python从各种支持imap / pop的服务器中获取电子邮件,并且需要能够通过代理来完成。
理想情况下,我希望能够直接在python中完成它,但是如果我找不到任何东西,使用包装器(外部程序/脚本,基于OSX)强制所有流量通过代理可能就足够了更好。
有人能帮我一把吗?我无法想象我是唯一需要通过python中的代理获取电子邮件的人......
**编辑标题编辑删除HTTP,因为当我累了我不应该这么快打字,对不起那些家伙**
我打算使用的代理允许除了http之外的袜子。
通过http的Pop或Imap工作没有多大意义(有状态对无国籍)但我的理解是袜子会让我做我想做的事。
到目前为止,实现我想要的唯一方法似乎是对imaplib进行肮脏的黑客攻击......如果可以的话,宁可避免使用它。
答案 0 :(得分:9)
你不需要肮脏地破解imaplib。您可以尝试使用SocksiPy包,它支持socks4,socks5和http代理(连接):
这样的事情,显然你想通过自定义__init__
方法的额外参数等更好地处理setproxy选项。
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')
答案 1 :(得分:5)
回答我自己的问题...... 有一种快速而肮脏的方法可以强制使用python脚本中的流量来通过代理而不用麻烦使用Socksipy(感谢MattH指点我这样做)
import socks
import socket
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS4,proxy_ip,port,True)
socket.socket = socks.socksocket
那个全局套接字覆盖显然有点残酷,但作为一个快速修复,直到我找到时间正确子类IMAP4和IMAP4_SSL。
答案 2 :(得分:0)
如果我理解你的话,你正试图在一个圆孔中放一个方形钉。
HTTP代理只知道如何“通话”HTTP,因此无法直接连接到POP或IMAP服务器。
如果您想这样做,您需要在某处实现自己的服务器以与邮件服务器通信。它将接收HTTP请求,然后对邮件服务器进行适当的调用。 E.g:
我不知道这是多么实用,因为您必须将有状态协议转换为stateless协议。