Соединение 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.

Похожие статьи