Połączenie IMAP SSL może podróżować przez SOCKS, zachowując serwer poczty jako jego partnera TLS. Użytecznym punktem integracji jest miejsce, w którym klient tworzy swój transport, zanim rozpoczną się zwykłe powitanie IMAP i obsługa możliwości.

W CPython 3.14 poniższy przykład ilustruje mały adapter korzystający z PySocks. Nadpisuje on prywatny hook transportu, więc trzymaj go związanego z utrzymywaną wersją imaplib:

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

Nazwy i port są wartościami zastępczymi dla już dostępnego proxy i usługi IMAP. Dla publicznego celu IMAP, któremu wolno używać publicznych proxy, lista proxy SOCKS5 oferuje kandydatów; każdy musi zezwalać na wymagany host i port poczty. Zależność PySocks zapewnia negocjację SOCKS; imaplib nadal inicjuje sesję poczty. Nie występuje żadne globalne zastąpienie socket.socket.

Zachowaj tożsamość serwera poczty

Nazwa hosta TLS pozostaje imap.example. To nie jest nazwa hosta SOCKS. Przekazanie ssl.create_default_context() celowo włącza zwykłe sprawdzanie certyfikatu i nazwy hosta; sam zaszyfrowany socket nie wystarcza do ustanowienia tych sprawdzeń.

proxy_rdns=True prosi, aby ścieżka SOCKS obsłużyła nazwę hosta docelowego. Jeśli proxy wymaga konta, jego obsługiwane argumenty poświadczeń należą do tej konfiguracji transportu. Nie logują się do skrzynki pocztowej.

Pozostaw inicjalizację sesji bibliotece imaplib

Adapter zwraca strumień TLS zwykłemu konstruktorowi. Ponowne zaimplementowanie open() ze starego przykładu może pominąć parametry limitu czasu, buforowanie i inne oczekiwania inicjalizacji. W CPython 3.14 nawet stary dostęp file jest właściwością zgodności, a nie polem do swobodnego odtwarzania.

Przy aktualizacji biblioteki przejrzyj ten prywatny hook względem odpowiedniego źródła. Jeśli utrzymywanie podklasy nie jest odpowiednie, wybierz klienta poczty z udokumentowanym interfejsem transportu proxy. Każdy układ powinien zachować ten sam rozdział: połączenie proxy, weryfikacja TLS celu, następnie uwierzytelnienie IMAP.

Powiązane artykuły