CPython 3.14 imaplib via SOCKS avec TLS vérifié
Adaptez une connexion IMAP SSL de CPython 3.14 via SOCKS sans remplacer globalement les sockets ni perdre l'identité TLS du serveur de messagerie.
Une connexion IMAP SSL peut passer par SOCKS tout en gardant le serveur de messagerie comme pair TLS. Le point d'intégration utile est là où le client crée son transport, avant le début de la salutation IMAP habituelle et du traitement des capacités.
Pour CPython 3.14, ce qui suit illustre un petit adaptateur utilisant PySocks. Il contourne un crochet de transport privé, gardez-le donc lié à la version d'imaplib maintenue :
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()Les noms et le port sont des substituts pour un proxy et un service IMAP déjà disponibles. Pour une destination IMAP publique autorisée à utiliser des proxys publics, la liste de proxys SOCKS5 propose des candidats ; chacun doit autoriser l'hôte et le port de messagerie requis. La dépendance PySocks fournit la négociation SOCKS ; imaplib initialise toujours la session de messagerie. Aucun remplacement global de socket.socket n'intervient.
Préservez l'identité du serveur de messagerie
Le nom d'hôte TLS reste imap.example. Ce n'est pas le nom d'hôte SOCKS. Passer ssl.create_default_context() active délibérément les vérifications habituelles du certificat et du nom d'hôte ; un socket chiffré seul ne suffit pas à établir ces vérifications.
proxy_rdns=True demande au chemin SOCKS de gérer le nom d'hôte de destination. Si le proxy exige un compte, ses arguments d'identifiants pris en charge appartiennent à cette configuration de transport. Ils ne connectent pas à la boîte aux lettres.
Laissez l'initialisation de session à imaplib
L'adaptateur renvoie le flux TLS au constructeur normal. Réimplémenter open() à partir d'un ancien exemple peut manquer les paramètres de délai, la mise en tampon et d'autres attentes d'initialisation. Dans CPython 3.14, même l'accès hérité file est une propriété de compatibilité, non un champ à reconstruire librement.
Lors d'une mise à jour de la bibliothèque, revoyez ce crochet privé par rapport à la source correspondante. Si maintenir une sous-classe ne convient pas, choisissez un client de messagerie doté d'une interface de transport proxy documentée. Toute disposition doit préserver la même séparation : connexion proxy, vérification TLS de la destination, puis authentification IMAP.