اتصال 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.

مقالات مرتبط