IMAP SSL -yhteys voi kulkea SOCKSin kautta pitäen postipalvelimen omana TLS-vastapuolenaan. Hyödyllinen integraatiokohta on siellä, missä asiakas luo kuljetuksensa, ennen tavallisen IMAP-tervehdyksen ja kyvykkyyksien käsittelyn alkua.

CPython 3.14:ssa seuraava havainnollistaa pientä PySocksia käyttävää sovitinta. Se ohittaa yksityisen kuljetuskoukun, joten pidä se sidottuna ylläpidettävään imaplib-versioon:

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

Nimet ja portti ovat paikkamerkkejä jo saatavilla olevalle välityspalvelimelle ja IMAP-palvelulle. Julkiselle IMAP-kohteelle, jolle on sallittu julkisten välityspalvelimien käyttö, SOCKS5-välityspalvelinluettelo tarjoaa ehdokkaita; jokaisen on sallittava tarvittava posti-isäntä ja portti. PySocks-riippuvuus tarjoaa SOCKS-neuvottelun; imaplib alustaa edelleen posti-istunnon. Mukana ei ole minkäänlaista globaalia socket.socket-korvausta.

Säilytä postipalvelimen identiteetti

TLS-isäntänimi pysyy muodossa imap.example. Se ei ole SOCKS-isäntänimi. ssl.create_default_context() välittäminen ottaa tarkoituksella käyttöön tavanomaiset varmenne- ja isäntänimitarkistukset; pelkkä salattu socket ei riitä näiden tarkistusten vahvistamiseen.

proxy_rdns=True pyytää, että SOCKS-polku käsittelee kohdeisäntänimen. Jos välityspalvelin vaatii tilin, sen tuetut tunnistetietoargumentit kuuluvat kyseiseen kuljetusasetukseen. Ne eivät kirjaudu postilaatikkoon.

Jätä istunnon alustus imaplibille

Sovitin palauttaa TLS-virran tavalliselle konstruktorille. open() uudelleen toteuttaminen vanhasta esimerkistä voi jättää huomaamatta aikakatkaisuparametrit, puskuroinnin ja muut alustusodotukset. CPython 3.14:ssa jopa vanha file-käyttö on yhteensopivuusominaisuus eikä vapaasti uudelleenrakennettava kenttä.

Kirjaston päivityksessä tarkista tämä yksityinen koukku vastaavaa lähdettä vasten. Jos aliluokan ylläpito ei sovi, valitse postiasiakas, jolla on dokumentoitu välityspalvelimen kuljetusrajapinta. Minkä tahansa järjestelyn tulee säilyttää sama erottelu: välityspalvelinyhteys, kohteen TLS-varmennus ja sitten IMAP-todennus.

Aiheeseen liittyvät artikkelit