CPython 3.14 imaplib über SOCKS mit verifiziertem TLS
Passen Sie eine IMAP-SSL-Verbindung in CPython 3.14 über SOCKS an, ohne Sockets global zu ersetzen oder die TLS-Identität des Mailservers zu verlieren.
Eine IMAP-SSL-Verbindung kann über SOCKS laufen und den Mailserver dennoch als TLS-Peer behalten. Der sinnvolle Integrationspunkt ist dort, wo der Client seinen Transport erzeugt, bevor die normale IMAP-Begrüßung und die Capability-Behandlung beginnen.
Für CPython 3.14 zeigt das Folgende einen kleinen Adapter mit PySocks. Er überschreibt einen privaten Transport-Hook, daher sollte er an die gepflegte imaplib-Version gebunden bleiben:
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()Namen und Port sind Platzhalter für einen bereits verfügbaren Proxy und IMAP-Dienst. Für ein öffentliches IMAP-Ziel, dem die Nutzung öffentlicher Proxys erlaubt ist, bietet die SOCKS5-Proxy-Liste Kandidaten; jeder muss den benötigten Mailhost und Port zulassen. Die PySocks-Abhängigkeit liefert die SOCKS-Aushandlung; imaplib initialisiert weiterhin die Mailsitzung. Es ist kein globaler Ersatz von socket.socket beteiligt.
Die Identität des Mailservers bewahren
Der TLS-Hostname bleibt imap.example. Er ist nicht der SOCKS-Hostname. Das Übergeben von ssl.create_default_context() aktiviert bewusst die normalen Zertifikats- und Hostnamenprüfungen; ein verschlüsselter Socket allein reicht nicht aus, um diese Prüfungen zu etablieren.
proxy_rdns=True verlangt, dass der SOCKS-Pfad den Zielhostnamen verarbeitet. Verlangt der Proxy ein Konto, gehören seine unterstützten Anmeldedaten-Argumente zu dieser Transportkonfiguration. Sie melden sich nicht am Postfach an.
Die Sitzungsinitialisierung bei imaplib lassen
Der Adapter gibt den TLS-Stream an den normalen Konstruktor zurück. Das Nachbauen von open() aus einem alten Beispiel kann Timeout-Parameter, Pufferung und andere Erwartungen an die Initialisierung verfehlen. In CPython 3.14 ist selbst der alte file-Zugriff eine Kompatibilitätseigenschaft und kein frei rekonstruierbares Feld.
Prüfen Sie bei einem Bibliotheks-Upgrade diesen privaten Hook gegen die passende Quelle. Ist die Pflege einer Unterklasse ungeeignet, wählen Sie einen Mailclient mit dokumentierter Proxy-Transport-Schnittstelle. Beide Anordnungen sollten dieselbe Trennung wahren: Proxy-Verbindung, TLS-Verifikation des Ziels, dann IMAP-Authentifizierung.