IMAP SSL připojení může procházet přes SOCKS a přitom si poštovní server ponechat jako svůj TLS protějšek. Užitečný styčný bod je místo, kde klient vytváří svůj transport, před začátkem obvyklého IMAP pozdravu a zpracování schopností.

Pro CPython 3.14 následující ukazuje malý adaptér používající PySocks. Přepisuje soukromý transportní hook, proto ho držte svázaný s udržovanou verzí 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()

Názvy a port jsou zástupné hodnoty pro již dostupný proxy a službu IMAP. Pro veřejné IMAP úložiště, kterému je povoleno používat veřejné proxy, nabízí seznam proxy SOCKS5 kandidáty; každý musí povolit požadovaný poštovní host a port. Závislost PySocks zajišťuje vyjednávání SOCKS; imaplib stále inicializuje poštovní relaci. Žádná globální náhrada socket.socket do toho nevstupuje.

Zachovejte identitu poštovního serveru

TLS název hostitele zůstává imap.example. Není to název hostitele SOCKS. Předání ssl.create_default_context() záměrně zapíná obvyklé kontroly certifikátu a názvu hostitele; samotný šifrovaný socket k navázání těchto kontrol nestačí.

proxy_rdns=True žádá, aby cesta SOCKS zpracovala cílový název hostitele. Pokud proxy vyžaduje účet, jeho podporované argumenty přihlašovacích údajů patří do této transportní konfigurace. Nepřihlašují se do poštovní schránky.

Nechte inicializaci relace na imaplib

Adaptér vrací TLS proud obvyklému konstruktoru. Opětovná implementace open() ze starého příkladu může minout parametry časového limitu, bufferování a další očekávání inicializace. V CPython 3.14 je i starší přístup file vlastností kompatibility, nikoli polem k volnému rekonstruování.

Při aktualizaci knihovny projděte tento soukromý hook proti odpovídajícímu zdroji. Pokud údržba podtřídy není vhodná, zvolte poštovního klienta s dokumentovaným transportním rozhraním pro proxy. Každé uspořádání by mělo zachovat stejné oddělení: připojení přes proxy, ověření TLS cíle, poté autentizace IMAP.

Související články