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.

Падобныя артыкулы