IMAP SSL връзка може да преминава през SOCKS, като пощенският сървър остава неин TLS партньор. Полезната точка за интеграция е там, където клиентът създава своя транспорт, преди нормалното IMAP поздравление и обработката на възможностите.

За CPython 3.14 следното показва малък адаптер с PySocks. Той замества частен транспортен hook, затова го дръжте вързан към поддържаната версия на imaplib:

import imaplib
import ssl
import socks

class SocksIMAP4SSL(imaplib.IMAP4_SSL):
    def _create_socket(self, timeout):
        stream = socks.create_connection(
            (self.host, self.port),
            timeout=timeout,
            proxy_type=socks.SOCKS5,
            proxy_addr="proxy.example",
            proxy_port=1080,
            proxy_rdns=True,
        )
        try:
            return self.ssl_context.wrap_socket(
                stream, server_hostname=self.host)
        except Exception:
            stream.close()
            raise

context = ssl.create_default_context()
with SocksIMAP4SSL("imap.example", ssl_context=context,
                  timeout=15) as mailbox:
    mailbox.noop()

Имената и портът са заместители за вече налични прокси и IMAP услуга. За публична IMAP дестинация, на която е разрешено да използва публични проксита, списъкът със SOCKS5 проксита предлага кандидати; всяко трябва да разрешава нужния пощенски хост и порт. Зависимостта PySocks осигурява SOCKS договарянето; imaplib все още инициализира пощенската сесия. Не участва глобална замяна на socket.socket.

Запазете идентичността на пощенския сървър

TLS името на хоста остава imap.example. То не е SOCKS името на хоста. Подаването на ssl.create_default_context() умишлено включва нормалните проверки на сертификат и име на хост; един шифрован сокет не е достатъчен, за да установи тези проверки.

proxy_rdns=True иска SOCKS пътят да обработва името на хоста на дестинацията. Ако проксито изисква акаунт, поддържаните от него аргументи за идентификационни данни принадлежат на тази транспортна конфигурация. Те не влизат в пощенската кутия.

Оставете инициализацията на сесията на imaplib

Адаптерът връща TLS потока на нормалния конструктор. Преизпълняването на open() от стар пример може да пропусне параметри за таймаут, буфериране и други очаквания при инициализация. В CPython 3.14 дори наследеният достъп file е свойство за съвместимост, а не поле, което да се възстановява свободно.

При надграждане на библиотеката прегледайте този частен hook спрямо съответния източник. Ако поддръжката на подклас е неподходяща, изберете пощенски клиент с документиран транспортен интерфейс за прокси. Всяко решение трябва да запази същото разделение: прокси връзка, TLS проверка на дестинацията, след това IMAP удостоверяване.

Подобни статии