CPython 3.14 imaplib via SOCKS met geverifieerde TLS
Pas een IMAP SSL-verbinding van CPython 3.14 aan via SOCKS zonder sockets globaal te vervangen of de TLS-identiteit van de mailserver te verliezen.
Een IMAP SSL-verbinding kan via SOCKS reizen terwijl de mailserver de TLS-tegenpartij blijft. Het nuttige integratiepunt is waar de client zijn transport aanmaakt, voordat de gebruikelijke IMAP-begroeting en de capaciteitsafhandeling beginnen.
Voor CPython 3.14 illustreert het volgende een kleine adapter die PySocks gebruikt. Hij overschrijft een private transport-hook, dus houd hem gekoppeld aan de imaplib-versie die wordt onderhouden:
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()De namen en de poort zijn plaatsaanduidingen voor een al beschikbare proxy en IMAP-dienst. Voor een openbare IMAP-bestemming die openbare proxies mag gebruiken, biedt de SOCKS5-proxylijst kandidaten; elk moet de vereiste mailhost en poort toestaan. De PySocks-afhankelijkheid levert de SOCKS-onderhandeling; imaplib initialiseert nog steeds de mailsessie. Er is geen globale vervanging van socket.socket bij betrokken.
Behoud de identiteit van de mailserver
De TLS-hostnaam blijft imap.example. Dat is niet de SOCKS-hostnaam. Het doorgeven van ssl.create_default_context() schakelt bewust de gebruikelijke certificaat- en hostnaamcontroles in; een versleutelde socket alleen is niet genoeg om die controles te vestigen.
proxy_rdns=True vraagt het SOCKS-pad om de bestemmingshostnaam af te handelen. Als de proxy een account vereist, horen de ondersteunde inloggegevensargumenten bij die transportconfiguratie. Ze loggen niet in op de mailbox.
Laat de sessie-initialisatie aan imaplib
De adapter geeft de TLS-stream terug aan de normale constructor. Het opnieuw implementeren van open() uit een oud voorbeeld kan time-outparameters, buffering en andere initialisatieverwachtingen missen. In CPython 3.14 is zelfs de oude file-toegang een compatibiliteitseigenschap en geen veld dat vrij kan worden gereconstrueerd.
Bekijk bij een bibliotheekupgrade deze private hook tegen de bijbehorende bron. Als het onderhouden van een subklasse niet past, kies dan een mailclient met een gedocumenteerde proxytransportinterface. Elke opzet moet dezelfde scheiding behouden: proxyverbinding, TLS-verificatie van de bestemming, daarna IMAP-authenticatie.