IMAP SSL-ühendus võib SOCKS-i kaudu liikuda, hoides postiserverit selle TLS-partnerina. Kasulik integreerimispunkt on koht, kus klient loob oma transpordi, enne tavalise IMAP-tervituse ja võimaluste käsitlemise algust.

CPython 3.14 puhul näitab järgnev väikest adapterit, mis kasutab PySocksi. See alistab privaatse transpordikonksu, seega hoidke see seotud hooldatava imaplib-versiooniga:

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

Nimed ja port on juba saadaval oleva puhverserveri ja IMAP-teenuse kohahoidjad. Avalikule IMAP-sihtkohale, millel on lubatud avalikke puhverservereid kasutada, pakub SOCKS5 puhverserverite loend kandidaate; igaüks peab lubama vajalikku postihosti ja porti. PySocksi sõltuvus pakub SOCKS-läbirääkimised; imaplib siiski lähtestab postiseansi. Kaasatud ei ole ühtegi globaalset socket.socket asendust.

Säilitage postiserveri identiteet

TLS-i hostinimi jääb imap.example. See ei ole SOCKS-i hostinimi. ssl.create_default_context() edastamine lubab teadlikult tavalisi sertifikaadi- ja hostinimekontrolle; üksnes krüpteeritud pesa ei ole nende kontrollide loomiseks piisav.

proxy_rdns=True palub, et SOCKS-i tee käsitleks sihtkoha hostinime. Kui puhverserver nõuab kontot, kuuluvad selle toetatud mandaadikargumendid sellesse transporthäälestusse. Need ei logi postkasti sisse.

Jätke seansi lähtestamine imaplibi hooleks

Adapter tagastab TLS-voo tavalisse konstruktorisse. open() uuesti rakendamine vana näite põhjal võib jätta vahele ajapiirangute parameetrid, puhverduse ja muud lähtestamise ootused. CPython 3.14-s on isegi vana file juurdepääs ühilduvusomadus, mitte vabalt ümberehitatav väli.

Teegi uuendamisel vaadake see privaatne konks üle vastava lähtekoodi suhtes. Kui alamklassi hooldamine ei sobi, valige postiklient, millel on dokumenteeritud puhverserveri transpordiliides. Iga lahendus peaks säilitama sama eraldatuse: puhverserveri ühendus, sihtkoha TLS-kontroll, seejärel IMAP-autentimine.

Seotud artiklid