Egy IMAP SSL kapcsolat áthaladhat SOCKS-on, miközben a levelezőszerver marad a TLS-partnere. A hasznos integrációs pont ott van, ahol a kliens létrehozza a szállítási rétegét, a szokásos IMAP-üdvözlés és a képességek kezelésének kezdete előtt.

CPython 3.14 esetén az alábbi egy kis, PySocksot használó adaptert mutat be. Felülír egy privát szállítási hookot, ezért tartsa a karbantartott imaplib-verzióhoz kötve:

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

A nevek és a port egy már elérhető proxy és IMAP-szolgáltatás helyőrzői. Egy nyilvános IMAP-célhoz, amelynek engedélyezett a nyilvános proxyk használata, a SOCKS5 proxy lista kínál jelölteket; mindegyiknek engedélyeznie kell a szükséges levélkiszolgálót és portot. A PySocks függőség biztosítja a SOCKS-egyeztetést; az imaplib továbbra is inicializálja a levélmunkamenetet. Nem vesz részt semmilyen globális socket.socket-csere.

Őrizze meg a levelezőszerver identitását

A TLS-gazdanév imap.example marad. Ez nem a SOCKS-gazdanév. A ssl.create_default_context() átadása szándékosan engedélyezi a szokásos tanúsítvány- és gazdanév-ellenőrzéseket; egy titkosított socket önmagában nem elég ezek megteremtéséhez.

A proxy_rdns=True arra kéri a SOCKS-útvonalat, hogy kezelje a cél gazdanevét. Ha a proxy fiókot igényel, a támogatott hitelesítőadat-argumentumai ehhez a szállítási konfigurációhoz tartoznak. Ezek nem jelentkeznek be a postaládába.

Hagyja a munkamenet inicializálását az imaplibra

Az adapter visszaadja a TLS-folyamot a szokásos konstruktornak. A open() újraimplementálása egy régi példából kihagyhatja az időtúllépési paramétereket, a pufferelést és más inicializálási elvárásokat. A CPython 3.14-ben még a régi file-hozzáférés is kompatibilitási tulajdonság, nem szabadon újraépíthető mező.

Könyvtárfrissítéskor vizsgálja felül ezt a privát hookot a megfelelő forráshoz képest. Ha az alosztály karbantartása nem megfelelő, válasszon dokumentált proxy-szállítási felülettel rendelkező levelezőklienst. Bármely elrendezésnek meg kell őriznie ugyanazt a szétválasztást: proxykapcsolat, a cél TLS-ellenőrzése, majd IMAP-hitelesítés.

Kapcsolódó cikkek