CPython 3.14 imaplib a través de SOCKS amb TLS verificat
Adapteu una connexió IMAP SSL de CPython 3.14 a través de SOCKS sense substituir els sockets globalment ni perdre la identitat TLS del servidor de correu.
Una connexió IMAP SSL pot viatjar a través de SOCKS mantenint el servidor de correu com a parell TLS. El punt d'integració útil és on el client crea el seu transport, abans que comencin la salutació IMAP habitual i la gestió de capacitats.
Per a CPython 3.14, el següent il·lustra un petit adaptador que utilitza PySocks. Substitueix un ganxo de transport privat, així que manteniu-lo lligat a la versió d'imaplib que es manté:
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()Els noms i el port són marcadors de posició per a un proxy i un servei IMAP ja disponibles. Per a una destinació IMAP pública a la qual es permet usar proxys públics, la llista de proxys SOCKS5 ofereix candidats; cadascun ha de permetre el host i el port de correu requerits. La dependència PySocks proporciona la negociació SOCKS; imaplib encara inicialitza la sessió de correu. No hi intervé cap substitució global de socket.socket.
Preserveu la identitat del servidor de correu
El nom d'amfitrió TLS continua sent imap.example. No és el nom d'amfitrió SOCKS. Passar ssl.create_default_context() activa deliberadament les comprovacions habituals de certificat i de nom d'amfitrió; un socket xifrat per si sol no n'hi ha prou per establir aquestes comprovacions.
proxy_rdns=True demana que el camí SOCKS gestioni el nom d'amfitrió de destinació. Si el proxy requereix un compte, els seus arguments de credencials compatibles pertanyen a aquesta configuració de transport. No inicien sessió al bústia de correu.
Deixeu la inicialització de la sessió a imaplib
L'adaptador retorna el flux TLS al constructor normal. Reimplementar open() a partir d'un exemple antic pot oblidar paràmetres de temps d'espera, memòria intermèdia i altres expectatives d'inicialització. A CPython 3.14, fins i tot l'accés heretat file és una propietat de compatibilitat, no un camp que es pugui reconstruir lliurement.
En actualitzar la biblioteca, reviseu aquest ganxo privat contra el codi font corresponent. Si mantenir una subclasse no és adequat, trieu un client de correu amb una interfície de transport de proxy documentada. Qualsevol disposició hauria de preservar la mateixa separació: connexió proxy, verificació TLS de la destinació i després autenticació IMAP.