חיבור 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.

מאמרים קשורים