Ang isang IMAP SSL na koneksyon ay maaaring dumaan sa SOCKS habang pinapanatili ang mail server bilang kapares nito sa TLS. Ang kapaki-pakinabang na punto ng integrasyon ay kung saan ginagawa ng client ang transportasyon nito, bago magsimula ang karaniwang pagbati ng IMAP at ang paghawak ng mga kakayahan.

Para sa CPython 3.14, ang sumusunod ay naglalarawan ng maliit na adapter na gumagamit ng PySocks. Pinapalitan nito ang isang pribadong hook ng transportasyon, kaya panatilihin itong nakatali sa bersyon ng imaplib na inaasikaso:

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

Ang mga pangalan at port ay mga placeholder para sa isang proxy at serbisyong IMAP na mayroon na. Para sa isang pampublikong destinasyong IMAP na pinapayagang gumamit ng mga pampublikong proxy, ang listahan ng proxy na SOCKS5 ay nag-aalok ng mga kandidato; bawat isa ay dapat pahintulutan ang kinakailangang host at port ng mail. Ang dependency na PySocks ay nagbibigay ng negosasyon sa SOCKS; ang imaplib ay nagsisimula pa rin ng sesyon ng mail. Walang pandaigdigang pagpapalit ng socket.socket na kasangkot.

Panatilihin ang pagkakakilanlan ng mail server

Ang hostname ng TLS ay nananatiling imap.example. Hindi ito ang hostname ng SOCKS. Ang pagpasa ng ssl.create_default_context() ay sadyang nagpapagana ng karaniwang pagsusuri ng sertipiko at hostname; ang isang naka-encrypt na socket lamang ay hindi sapat upang itatag ang mga pagsusuring iyon.

Hinihiling ng proxy_rdns=True na hawakan ng landas ng SOCKS ang hostname ng destinasyon. Kung ang proxy ay nangangailangan ng account, ang mga sinusuportahang argumento ng kredensyal nito ay nabibilang sa configuration ng transportasyong iyon. Hindi sila nag-log in sa mailbox.

Iwanan sa imaplib ang pagsisimula ng sesyon

Ibinalik ng adapter ang TLS stream sa karaniwang constructor. Ang muling pagpapatupad ng open() mula sa lumang halimbawa ay maaaring makaligtaan ang mga parameter ng timeout, buffering at iba pang inaasahan sa pagsisimula. Sa CPython 3.14, maging ang lumang pag-access sa file ay isang katangian ng compatibility, hindi isang field na malayang mabubuo muli.

Kapag ina-upgrade ang library, suriin ang pribadong hook na ito laban sa katugmang source. Kung hindi angkop ang pagpapanatili ng subclass, pumili ng mail client na may dokumentadong interface ng transportasyon ng proxy. Anumang kaayusan ay dapat panatilihin ang parehong paghihiwalay: koneksyon ng proxy, beripikasyon ng TLS ng destinasyon, pagkatapos ay pagpapatotoo ng IMAP.

Kaugnay na mga artikulo