Sambungan IMAP SSL boleh merentasi SOCKS sambil mengekalkan pelayan mel sebagai rakan TLSnya. Titik integrasi yang berguna ialah tempat klien mencipta pengangkutannya, sebelum salam IMAP biasa dan pengendalian keupayaan bermula.

Untuk CPython 3.14, yang berikut menggambarkan penyesuai kecil yang menggunakan PySocks. Ia menimpa cangkuk pengangkutan peribadi, jadi kekalkan ia terikat pada versi imaplib yang diselenggara:

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 ialah pemegang tempat untuk proksi dan perkhidmatan IMAP yang sudah tersedia. Untuk destinasi IMAP awam yang dibenarkan menggunakan proksi awam, senarai proksi SOCKS5 menawarkan calon; setiap satu mesti membenarkan hos dan port mel yang diperlukan. Kebergantungan PySocks menyediakan rundingan SOCKS; imaplib masih memulakan sesi mel. Tiada penggantian socket.socket global terlibat.

Kekalkan identiti pelayan mel

Nama hos TLS kekal imap.example. Ia bukan nama hos SOCKS. Menghantar ssl.create_default_context() sengaja mendayakan pemeriksaan sijil dan nama hos biasa; soket yang disulitkan sahaja tidak cukup untuk menegakkan pemeriksaan itu.

proxy_rdns=True meminta laluan SOCKS mengendalikan nama hos destinasi. Jika proksi memerlukan akaun, argumen kelayakan yang disokongnya tergolong dalam konfigurasi pengangkutan itu. Ia tidak log masuk ke peti mel.

Serahkan permulaan sesi kepada imaplib

Penyesuai memulangkan aliran TLS kepada pembina biasa. Melaksanakan semula open() daripada contoh lama boleh terlepas parameter tamat masa, penampan dan jangkaan permulaan yang lain. Dalam CPython 3.14, malah akses file lama ialah sifat keserasian, bukan medan yang boleh dibina semula dengan bebas.

Apabila menaik taraf pustaka, semak cangkuk peribadi ini terhadap sumber yang sepadan. Jika penyelenggaraan subkelas tidak sesuai, pilih klien mel dengan antara muka pengangkutan proksi yang didokumenkan. Apa-apa susunan harus mengekalkan pemisahan yang sama: sambungan proksi, pengesahan TLS destinasi, kemudian pengesahan IMAP.

Artikel berkaitan