Koneksi IMAP SSL dapat melewati SOCKS sambil mempertahankan server email sebagai rekan TLS-nya. Titik integrasi yang berguna adalah tempat klien membuat transportnya, sebelum sapaan IMAP biasa dan penanganan kapabilitas dimulai.

Untuk CPython 3.14, berikut ini menggambarkan adaptor kecil yang menggunakan PySocks. Adaptor ini menimpa kait transport privat, jadi pertahankan keterikatan pada versi imaplib yang dipelihara:

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

Nama dan port adalah placeholder untuk proxy dan layanan IMAP yang sudah tersedia. Untuk tujuan IMAP publik yang diizinkan memakai proxy publik, daftar proxy SOCKS5 menyediakan kandidat; masing-masing harus mengizinkan host dan port email yang diperlukan. Dependensi PySocks menyediakan negosiasi SOCKS; imaplib tetap menginisialisasi sesi email. Tidak ada penggantian socket.socket secara global yang terlibat.

Pertahankan identitas server email

Nama host TLS tetap imap.example. Itu bukan nama host SOCKS. Meneruskan ssl.create_default_context() dengan sengaja mengaktifkan pemeriksaan sertifikat dan nama host yang normal; socket terenkripsi saja tidak cukup untuk menegakkan pemeriksaan tersebut.

proxy_rdns=True meminta jalur SOCKS menangani nama host tujuan. Jika proxy memerlukan akun, argumen kredensial yang didukungnya termasuk dalam konfigurasi transport tersebut. Argumen itu tidak masuk ke kotak surat.

Serahkan inisialisasi sesi kepada imaplib

Adaptor mengembalikan aliran TLS ke konstruktor normal. Mengimplementasikan ulang open() dari contoh lama dapat melewatkan parameter batas waktu, penyangga, dan ekspektasi inisialisasi lainnya. Di CPython 3.14, bahkan akses file lama adalah properti kompatibilitas, bukan bidang yang bebas dibangun ulang.

Saat meningkatkan pustaka, tinjau kait privat ini terhadap sumber yang sesuai. Jika memelihara subkelas tidak cocok, pilih klien email dengan antarmuka transport proxy yang terdokumentasi. Susunan apa pun harus mempertahankan pemisahan yang sama: koneksi proxy, verifikasi TLS tujuan, lalu autentikasi IMAP.

Artikel terkait