CPython 3.14 imaplib a través de SOCKS con TLS verificado
Adapte una conexión IMAP SSL de CPython 3.14 a través de SOCKS sin reemplazar los sockets globalmente ni perder la identidad TLS del servidor de correo.
Una conexión IMAP SSL puede viajar a través de SOCKS y mantener el servidor de correo como su par TLS. El punto de integración útil es donde el cliente crea su transporte, antes de que comiencen el saludo IMAP habitual y el manejo de capacidades.
Para CPython 3.14, lo siguiente ilustra un pequeño adaptador que usa PySocks. Sobrescribe un gancho de transporte privado, así que manténgalo atado a la versión de imaplib que se mantiene:
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()Los nombres y el puerto son marcadores de posición para un proxy y un servicio IMAP ya disponibles. Para un destino IMAP público al que se permite usar proxies públicos, la lista de proxies SOCKS5 ofrece candidatos; cada uno debe permitir el host y el puerto de correo requeridos. La dependencia PySocks aporta la negociación SOCKS; imaplib sigue inicializando la sesión de correo. No interviene ningún reemplazo global de socket.socket.
Preserve la identidad del servidor de correo
El nombre de host TLS sigue siendo imap.example. No es el nombre de host SOCKS. Pasar ssl.create_default_context() habilita deliberadamente las comprobaciones habituales de certificado y de nombre de host; un socket cifrado por sí solo no basta para establecer esas comprobaciones.
proxy_rdns=True pide que la ruta SOCKS gestione el nombre de host de destino. Si el proxy requiere una cuenta, sus argumentos de credenciales compatibles pertenecen a esa configuración de transporte. No inician sesión en el buzón.
Deje la inicialización de la sesión a imaplib
El adaptador devuelve el flujo TLS al constructor normal. Reimplementar open() a partir de un ejemplo antiguo puede omitir parámetros de tiempo de espera, almacenamiento en búfer y otras expectativas de inicialización. En CPython 3.14, incluso el acceso heredado file es una propiedad de compatibilidad, no un campo que se reconstruya libremente.
Al actualizar la biblioteca, revise este gancho privado contra el código fuente correspondiente. Si mantener una subclase no es adecuado, elija un cliente de correo con una interfaz de transporte de proxy documentada. Cualquier disposición debe preservar la misma separación: conexión de proxy, verificación TLS del destino y luego autenticación IMAP.