CPython 3.14 imaplib gjennom SOCKS med verifisert TLS
Tilpass en CPython 3.14 IMAP SSL-tilkobling gjennom SOCKS uten å bytte ut sockets globalt eller miste postserverens TLS-identitet.
En IMAP SSL-tilkobling kan reise gjennom SOCKS mens postserveren forblir dens TLS-motpart. Det nyttige integrasjonspunktet er der klienten oppretter transporten sin, før den vanlige IMAP-hilsenen og kapabilitetsbehandlingen begynner.
For CPython 3.14 illustrerer følgende en liten adapter som bruker PySocks. Den overstyrer en privat transportkrok, så hold den bundet til imaplib-versjonen som vedlikeholdes:
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()Navnene og porten er plassholdere for en allerede tilgjengelig proxy og IMAP-tjeneste. For en offentlig IMAP-destinasjon som har lov til å bruke offentlige proxyer, tilbyr SOCKS5-proxylisten kandidater; hver må tillate den påkrevde postverten og porten. PySocks-avhengigheten leverer SOCKS-forhandlingen; imaplib initialiserer fortsatt postsøkten. Ingen global erstatning av socket.socket er involvert.
Bevar postserverens identitet
TLS-vertsnavnet forblir imap.example. Det er ikke SOCKS-vertsnavnet. Å sende ssl.create_default_context() aktiverer bevisst de vanlige sertifikat- og vertsnavnkontrollene; en kryptert socket alene er ikke nok til å etablere disse kontrollene.
proxy_rdns=True ber SOCKS-veien håndtere destinasjonsvertsnavnet. Hvis proxyen krever en konto, hører dens støttede legitimasjonsargumenter til den transportkonfigurasjonen. De logger ikke inn på postboksen.
La øktinitialiseringen bli hos imaplib
Adapteren returnerer TLS-strømmen til den vanlige konstruktøren. Å implementere open() på nytt fra et gammelt eksempel kan overse tidsavbruddsparametere, bufreing og andre initialiseringsforventninger. I CPython 3.14 er selv den eldre file-tilgangen en kompatibilitetsegenskap, ikke et felt som fritt kan gjenoppbygges.
Ved bibliotekoppgradering bør du gjennomgå denne private kroken mot den tilsvarende kilden. Hvis vedlikehold av en underklasse ikke passer, velg en postklient med et dokumentert transportgrensesnitt for proxy. Enhver ordning bør bevare samme separasjon: proxyforbindelse, TLS-verifisering av destinasjonen, deretter IMAP-autentisering.