Een IMAP SSL-verbinding kan via SOCKS reizen terwijl de mailserver de TLS-tegenpartij blijft. Het nuttige integratiepunt is waar de client zijn transport aanmaakt, voordat de gebruikelijke IMAP-begroeting en de capaciteitsafhandeling beginnen.

Voor CPython 3.14 illustreert het volgende een kleine adapter die PySocks gebruikt. Hij overschrijft een private transport-hook, dus houd hem gekoppeld aan de imaplib-versie die wordt onderhouden:

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()

De namen en de poort zijn plaatsaanduidingen voor een al beschikbare proxy en IMAP-dienst. Voor een openbare IMAP-bestemming die openbare proxies mag gebruiken, biedt de SOCKS5-proxylijst kandidaten; elk moet de vereiste mailhost en poort toestaan. De PySocks-afhankelijkheid levert de SOCKS-onderhandeling; imaplib initialiseert nog steeds de mailsessie. Er is geen globale vervanging van socket.socket bij betrokken.

Behoud de identiteit van de mailserver

De TLS-hostnaam blijft imap.example. Dat is niet de SOCKS-hostnaam. Het doorgeven van ssl.create_default_context() schakelt bewust de gebruikelijke certificaat- en hostnaamcontroles in; een versleutelde socket alleen is niet genoeg om die controles te vestigen.

proxy_rdns=True vraagt het SOCKS-pad om de bestemmingshostnaam af te handelen. Als de proxy een account vereist, horen de ondersteunde inloggegevensargumenten bij die transportconfiguratie. Ze loggen niet in op de mailbox.

Laat de sessie-initialisatie aan imaplib

De adapter geeft de TLS-stream terug aan de normale constructor. Het opnieuw implementeren van open() uit een oud voorbeeld kan time-outparameters, buffering en andere initialisatieverwachtingen missen. In CPython 3.14 is zelfs de oude file-toegang een compatibiliteitseigenschap en geen veld dat vrij kan worden gereconstrueerd.

Bekijk bij een bibliotheekupgrade deze private hook tegen de bijbehorende bron. Als het onderhouden van een subklasse niet past, kies dan een mailclient met een gedocumenteerde proxytransportinterface. Elke opzet moet dezelfde scheiding behouden: proxyverbinding, TLS-verificatie van de bestemming, daarna IMAP-authenticatie.

Gerelateerde artikelen