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.