CPython 3.14 imaplib през SOCKS с проверен TLS
Адаптирайте IMAP SSL връзка в CPython 3.14 през SOCKS, без глобална замяна на сокети и без загуба на TLS идентичността на пощенския сървър.
IMAP SSL връзка може да преминава през SOCKS, като пощенският сървър остава неин TLS партньор. Полезната точка за интеграция е там, където клиентът създава своя транспорт, преди нормалното IMAP поздравление и обработката на възможностите.
За CPython 3.14 следното показва малък адаптер с PySocks. Той замества частен транспортен hook, затова го дръжте вързан към поддържаната версия на 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 е свойство за съвместимост, а не поле, което да се възстановява свободно.
При надграждане на библиотеката прегледайте този частен hook спрямо съответния източник. Ако поддръжката на подклас е неподходяща, изберете пощенски клиент с документиран транспортен интерфейс за прокси. Всяко решение трябва да запази същото разделение: прокси връзка, TLS проверка на дестинацията, след това IMAP удостоверяване.