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

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

Я использую Python для выборки электронных писем с включенных серверов различного IMAP/поп и потребности смочь сделать это через прокси.

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

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

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

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

Поп или работа IMAP через http не имели бы большого смысла (с сохранением информации по сравнению с не сохраняющим состояние), но мое понимание - то, что носки позволили бы мне делать то, что я хочу.

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

8
задан Vadim Kotov 22 August 2019 в 08:39
поделиться

3 ответа

Вам не нужно грязно взламывать 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')
10
ответ дан 5 December 2019 в 10:00
поделиться

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

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

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

7
ответ дан 5 December 2019 в 10:00
поделиться

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

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

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

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

0
ответ дан 5 December 2019 в 10:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: