CPython 3.14 imaplib SOCKS-ის გავლით დადასტურებული TLS-ით
მოარგეთ CPython 3.14-ის IMAP SSL კავშირი 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 ავთენტიფიკაცია.