CPython 3.14 imaplib através de SOCKS com TLS verificado
Adapte uma conexão IMAP SSL do CPython 3.14 através de SOCKS sem substituir sockets globalmente nem perder a identidade TLS do servidor de correio.
Uma conexão IMAP SSL pode percorrer SOCKS mantendo o servidor de correio como seu par TLS. O ponto de integração útil é onde o cliente cria o seu transporte, antes de começarem a saudação IMAP habitual e o tratamento de capacidades.
Para CPython 3.14, o seguinte ilustra um pequeno adaptador que usa PySocks. Substitui um hook de transporte privado, por isso mantenha-o ligado à versão de imaplib que é mantida:
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 a porta são marcadores de posição para um proxy e um serviço IMAP já disponíveis. Para um destino IMAP público autorizado a usar proxies públicos, a lista de proxies SOCKS5 oferece candidatos; cada um deve permitir o host e a porta de correio exigidos. A dependência PySocks fornece a negociação SOCKS; o imaplib continua a inicializar a sessão de correio. Não está envolvida qualquer substituição global de socket.socket.
Preserve a identidade do servidor de correio
O nome de host TLS permanece imap.example. Não é o nome de host SOCKS. Passar ssl.create_default_context() ativa deliberadamente as verificações normais de certificado e de nome de host; um socket cifrado por si só não basta para estabelecer essas verificações.
proxy_rdns=True pede que o caminho SOCKS trate do nome de host de destino. Se o proxy exigir uma conta, os seus argumentos de credenciais suportados pertencem a essa configuração de transporte. Não iniciam sessão na caixa de correio.
Deixe a inicialização da sessão com o imaplib
O adaptador devolve o fluxo TLS ao construtor normal. Reimplementar open() a partir de um exemplo antigo pode omitir parâmetros de tempo limite, de buffer e outras expectativas de inicialização. Em CPython 3.14, até o acesso herdado file é uma propriedade de compatibilidade, não um campo a reconstruir livremente.
Ao atualizar a biblioteca, reveja este hook privado em relação ao código-fonte correspondente. Se manter uma subclasse não for adequado, escolha um cliente de correio com uma interface de transporte de proxy documentada. Qualquer disposição deve preservar a mesma separação: ligação proxy, verificação TLS do destino e, depois, autenticação IMAP.