O conexiune IMAP SSL poate călători prin SOCKS păstrând serverul de poștă ca partener TLS al său. Punctul util de integrare este acolo unde clientul își creează transportul, înainte de a începe salutul IMAP obișnuit și tratarea capacităților.

Pentru CPython 3.14, cele ce urmează ilustrează un adaptor mic care folosește PySocks. Acesta suprascrie un cârlig privat de transport, așa că păstrați-l legat de versiunea imaplib întreținută:

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

Numele și portul sunt substituenți pentru un proxy și un serviciu IMAP deja disponibile. Pentru o destinație IMAP publică căreia i se permite să folosească proxy-uri publice, lista de proxy-uri SOCKS5 oferă candidați; fiecare trebuie să permită gazda și portul de poștă cerute. Dependența PySocks asigură negocierea SOCKS; imaplib inițializează în continuare sesiunea de poștă. Nu este implicată nicio înlocuire globală a socket.socket.

Păstrați identitatea serverului de poștă

Numele de gazdă TLS rămâne imap.example. Nu este numele de gazdă SOCKS. Trimiterea ssl.create_default_context() activează intenționat verificările obișnuite de certificat și de nume de gazdă; un socket criptat singur nu este suficient pentru a stabili acele verificări.

proxy_rdns=True cere ca traseul SOCKS să gestioneze numele de gazdă al destinației. Dacă proxy-ul necesită un cont, argumentele sale de acreditare acceptate aparțin acelei configurații de transport. Ele nu se autentifică în căsuța poștală.

Lăsați inițializarea sesiunii lui imaplib

Adaptorul returnează fluxul TLS constructorului obișnuit. Reimplementarea open() dintr-un exemplu vechi poate rata parametrii de timeout, tamponarea și alte așteptări de inițializare. În CPython 3.14, chiar și accesul vechi file este o proprietate de compatibilitate, nu un câmp ce poate fi reconstruit liber.

La actualizarea bibliotecii, revizuiți acest cârlig privat față de sursa corespunzătoare. Dacă întreținerea unei subclase nu este potrivită, alegeți un client de poștă cu o interfață de transport proxy documentată. Orice aranjament ar trebui să păstreze aceeași separare: conexiune proxy, verificare TLS a destinației, apoi autentificare IMAP.

Articole similare