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.