CPython 3.14 imaplib ผ่าน SOCKS พร้อม TLS ที่ตรวจสอบแล้ว
ปรับการเชื่อมต่อ IMAP SSL ของ CPython 3.14 ให้ผ่าน SOCKS โดยไม่แทนที่ซ็อกเก็ตทั้งระบบหรือสูญเสียตัวตน TLS ของเซิร์ฟเวอร์เมล
การเชื่อมต่อ 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