CPython 3.14 imaplib, SOCKS를 통한 검증된 TLS 사용
소켓을 전역적으로 교체하지 않고 메일 서버의 TLS 신원을 잃지 않으면서 CPython 3.14 IMAP SSL 연결을 SOCKS를 통해 적용합니다.
IMAP SSL 연결은 메일 서버를 TLS 상대로 유지한 채 SOCKS를 통과할 수 있습니다. 유용한 통합 지점은 클라이언트가 전송 계층을 만드는 곳, 즉 일반적인 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 인증입니다.