poplib和imaplib似乎都不提供代理支持,尽管我尝试了google-fu,但我还是找不到太多关于它的信息。
我正在使用python从各种支持imap/pop的服务器获取电子邮件,并且需要能够通过代理来完成。
理想情况下,我希望能够直接在python中完成,但如果我找不到更好的方法,使用包装器(外部程序/脚本,基于OSX )强制所有流量通过代理可能就足够了。
有人能帮我一下吗?我无法想象我是唯一一个需要通过python中的代理来获取电子邮件的人……
*
*
编辑标题编辑以删除HTTP,因为我不应该在累的时候打字这么快,对此我很抱歉
*
*
我计划使用的代理除了允许http之外,还允许socks。
Pop或Imap通过http工作没有多大意义(有状态与无状态),但我的理解是,socks将允许我做我想做的事情。
到目前为止,实现我想要的唯一方法似乎是对imaplib进行肮脏的黑客攻击。如果可以的话我宁愿避开它。
发布于 2010-08-02 19:24:11
你不需要破解imaplib。您可以尝试使用支持socks4、socks5和http代理(连接)的SocksiPy包:
类似这样的情况,显然您希望通过自定义的额外参数更好地处理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')发布于 2010-08-02 20:48:46
回答我自己的问题..。有一种快速而肮脏的方法可以使用Socksipy从python脚本强制传输到代理,而不是麻烦(感谢MattH为我指出了这一点)。
import socks
import socket
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS4,proxy_ip,port,True)
socket.socket = socks.socksocket这种全局套接字覆盖显然有点残酷,但在我找到合适的子类IMAP4和IMAP4之前,它可以作为一种快速修复方法
_
SSL。
发布于 2010-08-02 18:20:29
如果我没理解错的话,你是想把一个方形的钉子钉在一个圆孔里。
HTTP代理只知道如何“对话”HTTP,所以不能直接连接到POP或IMAP服务器。
如果你想这样做,你需要在某个地方实现你自己的服务器来与邮件服务器通信。它将接收HTTP请求,然后对邮件服务器进行适当的调用。例如:

我不知道这有多实用,因为您必须将有状态协议转换为
无状态
一个。
https://stackoverflow.com/questions/3386724
复制相似问题