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 認証という順序です。