CPython 3.14 imaplib tramite SOCKS con TLS verificato
Adattare una connessione IMAP SSL di CPython 3.14 tramite SOCKS senza sostituire globalmente i socket né perdere l'identità TLS del server di posta.
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.