IMAP SSL ryšys gali keliauti per SOCKS, išlaikant pašto serverį kaip savo TLS partnerį. Naudinga integracijos vieta yra ten, kur klientas sukuria savo transportą, prieš prasidedant įprastam IMAP pasisveikinimui ir galimybių apdorojimui.

CPython 3.14 atveju toliau pateiktas pavyzdys iliustruoja nedidelį adapterį, naudojantį PySocks. Jis perrašo privatų transporto kabliuką, todėl laikykite jį susietą su palaikoma imaplib versija:

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

Pavadinimai ir prievadas yra vietturiai jau prieinamam tarpiniui serveriui ir IMAP paslaugai. Viešajam IMAP tikslui, kuriam leidžiama naudotis viešaisiais tarpiniais serveriais, SOCKS5 tarpinių serverių sąrašas siūlo kandidatus; kiekvienas turi leisti reikiamą pašto mazgą ir prievadą. PySocks priklausomybė teikia SOCKS derybas; imaplib vis dar inicijuoja pašto sesiją. Jokio globalaus socket.socket pakeitimo nėra.

Išsaugokite pašto serverio tapatybę

TLS mazgo pavadinimas lieka imap.example. Tai nėra SOCKS mazgo pavadinimas. Perduodant ssl.create_default_context() sąmoningai įjungiamos įprastos sertifikato ir mazgo pavadinimo patikros; vien užšifruotas lizdas nėra pakankamas toms patikroms nustatyti.

proxy_rdns=True prašo, kad SOCKS kelias apdorotų paskirties mazgo pavadinimą. Jei tarpinis serveris reikalauja paskyros, jo palaikomi prisijungimo duomenų argumentai priklauso tai transporto konfigūracijai. Jie neprisijungia prie pašto dėžutės.

Palikite sesijos inicijavimą imaplib

Adapteris grąžina TLS srautą įprastam konstruktoriui. Pakartotinis open() įgyvendinimas pagal seną pavyzdį gali praleisti laiko limitų parametrus, buferiavimą ir kitus inicijavimo lūkesčius. CPython 3.14 atveju net senoji file prieiga yra suderinamumo savybė, o ne laisvai atkuriamas laukas.

Atnaujindami biblioteką, peržiūrėkite šį privatų kabliuką pagal atitinkamą šaltinį. Jei poklasio palaikymas netinka, pasirinkite pašto klientą su dokumentuota tarpinio serverio transporto sąsaja. Bet kuri sąranka turėtų išlaikyti tą patį atskyrimą: tarpinio serverio ryšys, paskirties TLS patikra, tada IMAP autentifikavimas.

Susiję straipsniai