Python - Как я могу получать электронную почту через POP или IMAP через прокси? - PullRequest
7 голосов
/ 02 августа 2010

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

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

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

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

** РЕДАКТИРОВАТЬ Редактирование заголовка, чтобы удалить HTTP, потому что я не должен печатать так быстро, когда устал, извините за это, ребята **

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

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

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

Ответы [ 3 ]

9 голосов
/ 02 августа 2010

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

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

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')
5 голосов
/ 02 августа 2010

Ответ на мой вопрос ... Существует быстрый и грязный способ заставить трафик из скрипта Python проходить через прокси без хлопот с помощью Socksipy (спасибо MattH за указание на меня таким образом)

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

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

0 голосов
/ 02 августа 2010

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

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

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

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

...