Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何通过代理通过POP或IMAP获取电子邮件?_Python_Proxy_Imap_Pop3 - Fatal编程技术网

Python 如何通过代理通过POP或IMAP获取电子邮件?

Python 如何通过代理通过POP或IMAP获取电子邮件?,python,proxy,imap,pop3,Python,Proxy,Imap,Pop3,poplib和imaplib似乎都不提供代理支持,尽管我尝试了google fu,但我找不到太多关于它的信息 我正在使用python从各种支持imap/pop的服务器获取电子邮件,并且需要能够通过代理来完成 理想情况下,我希望能够直接在python中实现这一点,但如果找不到更好的方法,使用包装器(外部程序/脚本,基于OSX)强制所有流量通过代理可能就足够了 谁能帮我一下吗?我无法想象我是唯一一个需要通过python代理获取电子邮件的人 **编辑标题编辑以删除HTTP,因为我不应该在累了的时候这么

poplib和imaplib似乎都不提供代理支持,尽管我尝试了google fu,但我找不到太多关于它的信息

我正在使用python从各种支持imap/pop的服务器获取电子邮件,并且需要能够通过代理来完成

理想情况下,我希望能够直接在python中实现这一点,但如果找不到更好的方法,使用包装器(外部程序/脚本,基于OSX)强制所有流量通过代理可能就足够了

谁能帮我一下吗?我无法想象我是唯一一个需要通过python代理获取电子邮件的人

**编辑标题编辑以删除HTTP,因为我不应该在累了的时候这么快地键入内容,对不起,伙计们**

我计划使用的代理除了http之外还允许socks

通过http进行Pop或Imap工作没有多大意义(有状态与无状态),但我的理解是socks允许我做我想做的事情


到目前为止,实现我想要的唯一方法似乎是对imaplib进行肮脏的黑客攻击。。。如果可以的话,我宁愿避免

如果我没听错的话,你是想把一个方形的钉子插进一个圆形的洞里

HTTP代理只知道如何“交谈”HTTP,因此无法直接连接到POP或IMAP服务器

如果您想这样做,您需要在某个地方实现自己的服务器,以便与邮件服务器通信。它将接收HTTP请求,然后对邮件服务器进行适当的调用。例如:


我不知道这会有多实际,因为您必须将有状态协议转换为有状态协议。

您不需要直接攻击imaplib。您可以尝试使用SocksiPy包,该包支持socks4、socks5和http代理(connect):

类似这样,显然您希望通过自定义
\uuuu init\uuu
方法等的额外参数更好地处理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')

回答我自己的问题。。。 有一种快速而肮脏的方法可以强制python脚本中的trafic通过代理,而不用使用Socksipy(感谢MattH向我指出这种方法)


这种全局套接字覆盖显然有点残酷,但在我找到时间正确地将IMAP4和IMAP4_SSL子类化之前,它是一种快速修复方法。

我很好奇:即使没有python,你如何通过http代理将imap隧道化?从标题中删除http,我的错误,意味着socks…你是100%正确的,我忘了提到socks功能。我从标题中删除了HTTP,很抱歉,我累了;p HTTP代理的“连接”方法允许您运行任何tcp客户端->服务器协议。如果HTTP代理允许,大多数默认配置会将“连接”请求限制在端口443。我理解你的意思,但雷鸟是如何通过HTTP代理进行连接的?很高兴找到MattH,这正是我想要的(不知道SocksiPy)。我要试一试。谢谢。@rafael-t您的代码中的
create\u connection()
方法是什么?它是在哪里实现的?@ССчччччччччччччччччччч1095from@MattH是的,我试着称呼Rafael,但SOF引擎显然不支持称呼做过编辑的人。我想这个东西来自PySocks(第150行)。此方法应为
socks。创建\u连接
。谢谢你的回复。还有一件事是关于
self.sock
包装后关闭的。sockssocket中没有sockssocket对我不起作用,我得到了“IOError:[Errno socket error]('timed out',)”,有什么建议吗?
import socks
import socket
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS4,proxy_ip,port,True)
socket.socket = socks.socksocket