Una connessione IMAP SSL può passare attraverso SOCKS mantenendo il server di posta come peer TLS. Il punto di integrazione utile è dove il client crea il proprio trasporto, prima che inizino il consueto saluto IMAP e la gestione delle capacità.

Per CPython 3.14, quanto segue illustra un piccolo adattatore che usa PySocks. Esso sovrascrive un hook di trasporto privato, quindi tenetelo legato alla versione di imaplib mantenuta:

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

I nomi e la porta sono segnaposto per un proxy e un servizio IMAP già disponibili. Per una destinazione IMAP pubblica a cui è consentito usare proxy pubblici, la lista di proxy SOCKS5 offre candidati; ciascuno deve consentire l'host e la porta di posta richiesti. La dipendenza PySocks fornisce la negoziazione SOCKS; imaplib inizializza comunque la sessione di posta. Non è coinvolta alcuna sostituzione globale di socket.socket.

Preservate l'identità del server di posta

Il nome host TLS resta imap.example. Non è il nome host SOCKS. Passare ssl.create_default_context() abilita deliberatamente i normali controlli di certificato e nome host; un socket cifrato da solo non basta a stabilire quei controlli.

proxy_rdns=True chiede al percorso SOCKS di gestire il nome host di destinazione. Se il proxy richiede un account, i suoi argomenti di credenziali supportati appartengono a quella configurazione di trasporto. Non accedono alla casella di posta.

Lasciate l'inizializzazione della sessione a imaplib

L'adattatore restituisce il flusso TLS al costruttore normale. Reimplementare open() da un vecchio esempio può tralasciare parametri di timeout, buffering e altre aspettative di inizializzazione. In CPython 3.14, anche l'accesso legacy file è una proprietà di compatibilità, non un campo da ricostruire liberamente.

Quando aggiornate la libreria, riesaminate questo hook privato rispetto al sorgente corrispondente. Se mantenere una sottoclasse non è adatto, scegliete un client di posta con un'interfaccia di trasporto proxy documentata. Qualunque soluzione dovrebbe preservare la stessa separazione: connessione proxy, verifica TLS della destinazione, poi autenticazione IMAP.

Articoli correlati