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.