CPython 3.14 imaplib via SOCKS med verifierad TLS
Anpassa en IMAP SSL-anslutning i CPython 3.14 via SOCKS utan att byta ut sockets globalt eller förlora postserverns TLS-identitet.
En IMAP SSL-anslutning kan färdas via SOCKS medan postservern förblir dess TLS-motpart. Den användbara integrationspunkten är där klienten skapar sin transport, innan den vanliga IMAP-hälsningen och kapacitetshanteringen börjar.
För CPython 3.14 illustrerar följande en liten adapter som använder PySocks. Den åsidosätter en privat transportkrok, så håll den bunden till den imaplib-version som underhålls:
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()Namnen och porten är platshållare för en redan tillgänglig proxy och IMAP-tjänst. För ett offentligt IMAP-mål som får använda offentliga proxyservrar erbjuder SOCKS5-proxylistan kandidater; var och en måste tillåta den nödvändiga postvärden och porten. PySocks-beroendet levererar SOCKS-förhandlingen; imaplib initierar fortfarande postsessionen. Ingen global ersättning av socket.socket är inblandad.
Bevara postserverns identitet
TLS-värdnamnet förblir imap.example. Det är inte SOCKS-värdnamnet. Att skicka ssl.create_default_context() aktiverar avsiktligt de vanliga certifikat- och värdnamnskontrollerna; en krypterad socket ensam räcker inte för att upprätta dessa kontroller.
proxy_rdns=True ber SOCKS-vägen hantera målvärdnamnet. Om proxyn kräver ett konto hör dess stödda autentiseringsargument till den transportkonfigurationen. De loggar inte in på brevlådan.
Låt sessionsinitieringen ligga hos imaplib
Adaptern returnerar TLS-strömmen till den vanliga konstruktorn. Att återimplementera open() från ett gammalt exempel kan missa timeoutparametrar, buffring och andra initieringsförväntningar. I CPython 3.14 är även den äldre file-åtkomsten en kompatibilitetsegenskap, inte ett fält som fritt kan återuppbyggas.
Vid en biblioteksuppgradering bör du granska denna privata krok mot motsvarande källa. Om underhåll av en underklass inte passar, välj en postklient med ett dokumenterat transportgränssnitt för proxy. Varje upplägg bör bevara samma separation: proxyanslutning, TLS-verifiering av målet, därefter IMAP-autentisering.