CPython 3.14 imaplib gjennom SOCKS med verifisert TLS
Tilpass ein CPython 3.14 IMAP SSL-tilkopling gjennom SOCKS utan å byta ut socketar globalt eller mista TLS-identiteten til posttenaren.
Ei IMAP SSL-tilkopling kan reisa gjennom SOCKS medan posttenaren blir verande TLS-motparten hennar. Det nyttige integreringspunktet er der klienten lagar transporten sin, før den vanlege IMAP-helsinga og handsaminga av kapabilitetar byrjar.
For CPython 3.14 viser det følgjande ein liten adapter som brukar PySocks. Han overstyrer ein privat transportkrok, så hald han bunden til imaplib-versjonen som blir vedlikeheldt:
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()Namna og porten er plasshaldarar for ein allereie tilgjengeleg proxy og IMAP-teneste. For ein offentleg IMAP-destinasjon som har løyve til å bruka offentlege proxyar, tilbyr SOCKS5-proxylista kandidatar; kvar av dei må tillata den påkravde postverten og porten. PySocks-avhengnaden leverer SOCKS-forhandlinga; imaplib startar framleis postøkta. Ingen global erstatning av socket.socket er involvert.
Ta vare på identiteten til posttenaren
TLS-vertnamnet blir verande imap.example. Det er ikkje SOCKS-vertnamnet. Å senda ssl.create_default_context() aktiverer med vilje dei vanlege sertifikat- og vertnamnkontrollane; ein kryptert socket åleine er ikkje nok til å skipa desse kontrollane.
proxy_rdns=True ber SOCKS-vegen handsama destinasjonsvertnamnet. Viss proxyen krev ein konto, høyrer dei støtta legitimasjonsargumenta hans til den transportkonfigurasjonen. Dei loggar ikkje inn på postboksen.
Lat imaplib ta seg av øktstarten
Adapteren returnerer TLS-straumen til den vanlege konstruktøren. Å implementera open() på nytt frå eit gammalt døme kan oversjå tidsavbrotsparameterar, bufreing og andre initialiseringsforventningar. I CPython 3.14 er sjølv den eldre file-tilgangen ein kompatibilitetseigenskap, ikkje eit felt som fritt kan byggjast opp att.
Ved bibliotekoppgradering bør du gå gjennom denne private kroken mot den tilsvarande kjelda. Viss vedlikehald av ein underklasse ikkje passar, vel ein postklient med eit dokumentert transportgrensesnitt for proxy. Kva ordning som helst bør ta vare på same skiljet: proxyforbinding, TLS-verifisering av destinasjonen, deretter IMAP-autentisering.