การเชื่อมต่อ IMAP SSL เดินทางผ่าน SOCKS ได้โดยยังคงให้เซิร์ฟเวอร์เมลเป็นคู่ TLS ของตน จุดเชื่อมต่อที่มีประโยชน์คือจุดที่ไคลเอนต์สร้างการขนส่งของตน ก่อนที่การทักทาย IMAP ตามปกติและการจัดการความสามารถจะเริ่มต้น

สำหรับ CPython 3.14 ตัวอย่างต่อไปนี้แสดงอะแดปเตอร์เล็ก ๆ ที่ใช้ PySocks โดยแทนที่ฮุกการขนส่งแบบส่วนตัว ดังนั้นควรผูกไว้กับเวอร์ชัน 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()

ชื่อและพอร์ตเป็นตัวแทนสำหรับพร็อกซีและบริการ IMAP ที่มีอยู่แล้ว สำหรับปลายทาง IMAP สาธารณะที่ได้รับอนุญาตให้ใช้พร็อกซีสาธารณะ รายการพร็อกซี SOCKS5 มีผู้สมัครให้เลือก แต่ละรายต้องอนุญาตโฮสต์และพอร์ตเมลที่ต้องการ การพึ่งพา PySocks ให้การเจรจา SOCKS ส่วน imaplib ยังคงเริ่มเซสชันเมล ไม่มีการแทนที่ socket.socket ทั้งระบบเข้ามาเกี่ยวข้อง

รักษาตัวตนของเซิร์ฟเวอร์เมล

ชื่อโฮสต์ TLS ยังคงเป็น imap.example ไม่ใช่ชื่อโฮสต์ SOCKS การส่ง ssl.create_default_context() จะเปิดใช้การตรวจสอบใบรับรองและชื่อโฮสต์ตามปกติอย่างตั้งใจ ซ็อกเก็ตที่เข้ารหัสเพียงอย่างเดียวไม่เพียงพอที่จะสร้างการตรวจสอบเหล่านั้น

proxy_rdns=True ขอให้เส้นทาง SOCKS จัดการชื่อโฮสต์ปลายทาง หากพร็อกซีต้องใช้บัญชี อาร์กิวเมนต์ข้อมูลรับรองที่รองรับจะเป็นของการกำหนดค่าการขนส่งนั้น ไม่ได้ลงชื่อเข้าใช้กล่องจดหมาย

ปล่อยการเริ่มเซสชันให้ imaplib

อะแดปเตอร์คืนสตรีม TLS ให้ตัวสร้างตามปกติ การนำ open() กลับมาใช้ใหม่จากตัวอย่างเก่าอาจพลาดพารามิเตอร์เวลาหมดอายุ การบัฟเฟอร์ และความคาดหวังในการเริ่มต้นอื่น ๆ ใน CPython 3.14 แม้แต่การเข้าถึง file แบบเดิมก็เป็นคุณสมบัติความเข้ากันได้ ไม่ใช่ฟิลด์ที่สร้างใหม่ได้อย่างอิสระ

เมื่ออัปเกรดไลบรารี ควรทบทวนฮุกส่วนตัวนี้เทียบกับซอร์สที่ตรงกัน หากการดูแลคลาสย่อยไม่เหมาะสม ให้เลือกไคลเอนต์เมลที่มีอินเทอร์เฟซการขนส่งพร็อกซีที่มีเอกสารกำกับ การจัดวางใด ๆ ควรคงการแยกเดียวกันไว้ นั่นคือการเชื่อมต่อพร็อกซี การตรวจสอบ TLS ของปลายทาง แล้วจึงตรวจสอบสิทธิ์ IMAP

บทความที่เกี่ยวข้อง