Net::SMTP 3.16 hat keinen vorkonfigurierten SOCKS-Konstruktor
Net::SMTP 3.16 dokumentiert keine Konstruktoroption für einen vorab verbundenen Socket. Bewahren Sie die Reihenfolge von SMTP-Begrüßung, EHLO und TLS beim Wählen einer Proxy-Transportintegration.
Net::SMTP 3.16 dokumentiert keinen SOCKS- oder Konstruktorparameter für einen vorab verbundenen Socket. Das Umhüllen eines Dateideskriptors mit dem geerbten new_from_fd führt seinen SMTP-Konstruktor nicht aus. Eine erfolgreiche SOCKS-Verbindung liefert einen Stream, keine initialisierte Mailsitzung.
Bei einfachem SMTP, einschließlich eines späteren STARTTLS-Upgrades, spricht der Server zuerst:
SOCKS: connection to smtp.example.net:587 succeeds
server: 220 smtp.example.net ready
client: EHLO client.example.net
server: 250-smtp.example.net
server: 250-STARTTLS
server: 250 AUTH ...Dies ist schematisch; angekündigte Erweiterungen variieren. Die Begrüßung kann selbst mehrere Zeilen umfassen: Ein Antwortcode, gefolgt von einem Bindestrich, setzt die Antwort fort, während ihre letzte Zeile sie beendet. Konsumieren Sie die gesamte Begrüßung vor EHLO. Andernfalls kann der Client ein altes 220 lesen, während er das 250 von EHLO erwartet, und auf einer gesunden Verbindung aus dem Tritt geraten.
Implizites TLS hat eine andere Reihenfolge: SOCKS-Verbindung, TLS-Handshake, dann SMTP-Begrüßung innerhalb von TLS. STARTTLS beginnt mit der lesbaren Begrüßung und EHLO, aktualisiert den Stream und holt danach erneut die Fähigkeiten.
Der öffentliche Konstruktor übernimmt normalerweise die Socket-Konfiguration, gespeicherte Verbindungsparameter und Begrüßungsinformationen, die erste Antwort und EHLO mit HELO-Rückfall, wo angebracht:
use Net::SMTP;
my $smtp = Net::SMTP->new(
'smtp.example.net',
Port => 587,
Hello => 'client.example.net',
Timeout => 30,
) or die "SMTP connection failed: $@";
$smtp->starttls()
or die "STARTTLS failed: " . $smtp->message;Dieses öffentliche Beispiel verwendet STARTTLS und konfiguriert kein SOCKS. Der Servername wählt das Mailziel; Hello liefert die SMTP-Identität des Clients. Für implizites TLS verwenden Sie die dokumentierte Konstruktoroption SSL und den Port des Dienstes.
SendHello => 0 unterdrückt automatisches EHLO/HELO, nicht das Lesen der Begrüßung oder den Aufbau des Transports. Einen Zeilenleser aufzurufen und dann hello() ist ebenfalls kein dokumentierter Ersatz für die Initialisierung: Net::Cmd klassifiziert seine Antwortleser auf niedriger Ebene als geschützte Unterklassenmethoden.
Wenn SOCKS zwingend ist, wählen Sie einen Client mit unterstützter SOCKS-Schnittstelle oder pflegen Sie eine Integration gegen die konkrete Net::SMTP-Version. Verwenden Sie die obige Reihenfolge als ihren Vertrag, statt private Felder zu kopieren. Ein separater TCP-Adapter braucht ebenfalls bewussten Umgang mit der TLS-Identität: Das Zertifikat muss den echten Maildienst ausweisen, und Proxy-Anmeldedaten bleiben getrennt vom SMTP-Login.