Python-как я могу получать электронные письма через POP или IMAP через прокси-сервер?

ни poplib, ни imaplib не предлагают поддержку прокси, и я не мог найти много информации об этом, несмотря на мои попытки google-fu.

Я использую python для извлечения писем с различных серверов с поддержкой imap/pop и должен иметь возможность делать это через прокси.

В идеале, я хотел бы иметь возможность сделать это в python напрямую, но с помощью оболочки (внешней программы / скрипта, на основе OSX), чтобы заставить весь трафик проходить через прокси-сервер, может быть достаточно, если я ничего не могу найти лучше.

кто-нибудь может мне помочь? Я не могу себе представить, что я единственный, кому когда-либо нужно было получать электронные письма через прокси в python...

** редактировать заголовок редактировать, чтобы удалить HTTP, потому что я не должен печатать так быстро, когда я устал, извините за это ребята **

прокси, которые я планирую использовать, позволяют socks в дополнение к http.

Pop или Imap работа через http не будет иметь большого смысла (stateful vs без гражданства), но я понимаю, что носки позволят я буду делать то, что хочу.

до сих пор единственным способом достичь того, что я хочу, кажется, грязный взлом imaplib... я бы предпочел избежать этого, если смогу.

3 ответов


вам не нужно грязно взломать imaplib. Вы можете попробовать использовать пакет SocksiPy, который поддерживает SOCKS4, socks5 и HTTP proxy (connect):

что-то вроде этого, очевидно, вы хотите лучше обрабатывать параметры setproxy, используя дополнительные аргументы для пользовательского __init__ метод, etc.

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')

ответ на мой собственный вопрос... Есть быстрый и грязный способ заставить trafic из скрипта python пройти через прокси без хлопот с помощью Socksipy (спасибо MattH за указание мне таким образом)

import socks
import socket
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS4,proxy_ip,port,True)
socket.socket = socks.socksocket

это глобальное переопределение сокета, очевидно, немного жестоко, но работает как быстрое исправление, пока я не найду время правильно подкласса IMAP4 и IMAP4_SSL.


Если я правильно вас понял, вы пытаетесь вставить квадратный колышек в круглое отверстие.

HTTP-прокси знает только, как" говорить " HTTP, поэтому не может напрямую подключиться к POP или IMAP-серверу.

Если вы хотите сделать это, вы должны реализовать свой собственный сервер где-то поговорить с почтовых серверов. Он будет получать HTTP-запросы, а затем совершать соответствующие вызовы на почтовый сервер. Например:

насколько это было бы практично, я не знаю знайте, так как вам придется преобразовать протокол с состоянием в один.