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

时间:2010-08-02 10:06:46

标签: python proxy imap pop

poplib或imaplib似乎都没有提供代理支持,尽管谷歌尝试了谷歌,但我找不到太多关于它的信息。

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

理想情况下,我希望能够直接在python中完成它,但是如果我找不到任何东西,使用包装器(外部程序/脚本,基于OSX)强制所有流量通过代理可能就足够了更好。

有人能帮我一把吗?我无法想象我是唯一需要通过python中的代理获取电子邮件的人......

**编辑标题编辑删除HTTP,因为当我累了我不应该这么快打字,对不起那些家伙**

我打算使用的代理允许除了http之外的袜子。

通过http的Pop或Imap工作没有多大意义(有状态对无国籍)但我的理解是袜子会让我做我想做的事。

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

3 个答案:

答案 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协议。