CPython 3.14 imaplib gennem SOCKS med verificeret TLS
Tilpas en CPython 3.14 IMAP SSL-forbindelse gennem SOCKS uden at udskifte sockets globalt eller miste postserverens TLS-identitet.
En IMAP SSL-forbindelse kan rejse gennem SOCKS, mens postserveren forbliver dens TLS-modpart. Det nyttige integrationspunkt er der, hvor klienten opretter sin transport, før den normale IMAP-hilsen og kapabilitetsbehandling begynder.
Til CPython 3.14 illustrerer følgende en lille adapter, som bruger PySocks. Den tilsidesætter en privat transportkrog, så hold den bundet til den imaplib-version, der vedligeholdes:
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 pladsholdere for en allerede tilgængelig proxy og IMAP-tjeneste. Til en offentlig IMAP-destination, der må bruge offentlige proxyer, giver SOCKS5-proxylisten kandidater; hver skal tillade den krævede postvært og port. PySocks-afhængigheden leverer SOCKS-forhandlingen; imaplib initialiserer stadig postsessionen. Der indgår ingen global udskiftning af socket.socket.
Bevar postserverens identitet
TLS-værtsnavnet forbliver imap.example. Det er ikke SOCKS-værtsnavnet. At sende ssl.create_default_context() aktiverer bevidst de normale certifikat- og værtsnavnekontroller; en krypteret socket alene er ikke nok til at etablere disse kontroller.
proxy_rdns=True beder SOCKS-vejen om at håndtere destinationsværtsnavnet. Hvis proxyen kræver en konto, hører dens understøttede legitimationsargumenter til den transportkonfiguration. De logger ikke ind på postkassen.
Lad sessionsinitialiseringen blive hos imaplib
Adapteren returnerer TLS-strømmen til den normale konstruktør. At genimplementere open() fra et gammelt eksempel kan overse timeoutparametre, buffering og andre initialiseringsforventninger. I CPython 3.14 er selv den ældre file-adgang en kompatibilitetsegenskab frem for et felt, der frit kan genopbygges.
Ved en biblioteksopgradering bør du gennemgå denne private krog mod den tilsvarende kilde. Hvis vedligeholdelse af en underklasse er uhensigtsmæssig, vælg en postklient med en dokumenteret transportgrænseflade til proxyer. Enhver ordning bør bevare samme adskillelse: proxyforbindelse, TLS-verifikation af destinationen, derefter IMAP-godkendelse.