Ни один, которого poplib или imaplib, кажется, предлагают поддержке прокси и я не мог найти много информации об этом несмотря на мои попытки google-fu.
Я использую Python для выборки электронных писем с включенных серверов различного IMAP/поп и потребности смочь сделать это через прокси.
Идеально, я хотел бы смочь сделать это в Python непосредственно, но использование обертки (внешняя программа/сценарий, базирующийся OSX), чтобы вынудить весь трафик пройти прокси могло бы состоять достаточно в том, если я ничего не могу найти лучше.
Кто-либо мог дать мне руку? Я не могу предположить, что я - единственный, кто когда-либо должен был выбирать электронные письма через прокси в Python...
** Заголовок РЕДАКТИРОВАНИЯ редактирует для удаления HTTP, потому что я не должен вводить настолько быстро, когда я устал, жаль об этом парни **
Прокси, которые я планирую использовать, позволяют носки в дополнение к http.
Поп или работа IMAP через http не имели бы большого смысла (с сохранением информации по сравнению с не сохраняющим состояние), но мое понимание - то, что носки позволили бы мне делать то, что я хочу.
До сих пор единственный способ достигнуть, что я хочу, кажется, грязное взламывание imaplib... избежали бы его, если я могу.
Вам не нужно грязно взламывать 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')
Ответьте на мой вопрос ... Есть быстрый и грязный способ заставить трафик из скрипта 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-запросы, а затем делать соответствующие вызовы почтовому серверу. Например: [
] Насколько это будет практично, я не знаю, поскольку вам придется преобразовать протокол с сохранением состояния в протокол без состояния .