Unha conexión IMAP SSL pode viaxar a través de SOCKS mantendo o servidor de correo como o seu par TLS. O punto de integración útil é onde o cliente crea o seu transporte, antes de que comece o saludo IMAP habitual e o manexo de capacidades.

Para CPython 3.14, o seguinte ilustra un pequeno adaptador que usa PySocks. Sobrescribe un gancho de transporte privado, así que mantéñao ligado á versión de imaplib que se mantén:

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()

Os nomes e o porto son marcadores de posición para un proxy e un servizo IMAP xa dispoñibles. Para un destino IMAP público ao que se permite usar proxies públicos, a lista de proxies SOCKS5 ofrece candidatos; cada un debe permitir o host e o porto de correo requiridos. A dependencia PySocks fornece a negociación SOCKS; imaplib aínda inicializa a sesión de correo. Non intervén ningún substituto global de socket.socket.

Preserve a identidade do servidor de correo

O nome de host TLS segue sendo imap.example. Non é o nome de host SOCKS. Pasar ssl.create_default_context() habilita deliberadamente as comprobacións habituais de certificado e de nome de host; un socket cifrado por si só non abonda para establecer esas comprobacións.

proxy_rdns=True pide que a ruta SOCKS xestione o nome de host de destino. Se o proxy require unha conta, os seus argumentos de credenciais compatibles pertencen a esa configuración de transporte. Non inician sesión no buzón.

Deixe a inicialización da sesión a imaplib

O adaptador devolve o fluxo TLS ao construtor normal. Reimplementar open() a partir dun exemplo antigo pode omitir parámetros de tempo de espera, almacenamento en búfer e outras expectativas de inicialización. En CPython 3.14, mesmo o acceso herdado file é unha propiedade de compatibilidade, non un campo que se poida reconstruír libremente.

Ao actualizar a biblioteca, revise este gancho privado contra o código fonte correspondente. Se manter unha subclase non é axeitado, escolla un cliente de correo cunha interface de transporte de proxy documentada. Calquera disposición debe preservar a mesma separación: conexión de proxy, verificación TLS do destino e despois autenticación IMAP.

Artigos relacionados