Net::SMTP 3.16 har ingen föransluten SOCKS-konstruktor
Net::SMTP 3.16 dokumenterar inget konstruktörsalternativ för en föransluten socket. Behåll SMTP-hälsningen, EHLO och TLS-ordningen intakta när du väljer en proxytransportintegration.
Net::SMTP 3.16 dokumenterar ingen SOCKS- eller föransluten socket-konstruktorparameter. Att linda in en filbeskrivning med den ärvda new_from_fd kör inte dess SMTP-konstruktor. En lyckad SOCKS-anslutning ger en ström, inte en initierad e-postsession.
För vanlig SMTP, inklusive en senare STARTTLS-uppgradering, talar servern först:
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 ...Detta är schematiskt; annonserade tillägg varierar. Hälsningen kan själv sträcka sig över flera rader: en svarskod följd av ett bindestreck fortsätter svaret, medan dess sista rad avslutar det. Förbruka hela hälsningen före EHLO. Annars kan klienten läsa en gammal 220 när den väntar på EHLO:s 250 och hamna ur takt på en frisk anslutning.
Implicit TLS har en annan ordning: SOCKS-anslutning, TLS-handskakning, sedan SMTP-hälsning inuti TLS. STARTTLS börjar med den läsbara hälsningen och EHLO, uppgraderar strömmen och hämtar därefter förmågorna igen.
Den offentliga konstruktorn hanterar normalt socketkonfiguration, sparade anslutningsparametrar och hälsningsinformation, det första svaret och EHLO med HELO-återfall där det passar:
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;Detta offentliga exempel använder STARTTLS och konfigurerar inte SOCKS. Servernamnet väljer e-postmålet; Hello ger klientens SMTP-identitet. För implicit TLS, använd det dokumenterade konstruktörsalternativet SSL och tjänstens port.
SendHello => 0 undertrycker automatisk EHLO/HELO, inte läsningen av hälsningen eller uppbyggnaden av transporten. Att anropa en radläsare och sedan hello() är inte heller en dokumenterad ersättning för initiering: Net::Cmd klassificerar sina lågnivåsvarsläsare som skyddade underklassmetoder.
Om SOCKS är obligatoriskt, välj en klient med ett stödt SOCKS-gränssnitt eller underhåll en integration mot den specifika Net::SMTP-versionen. Använd sekvensen ovan som dess kontrakt i stället för att kopiera privata fält. En separat TCP-adapter kräver också medveten hantering av TLS-identitet: certifikatet måste identifiera den riktiga e-posttjänsten, och proxyuppgifterna förblir åtskilda från SMTP-inloggningen.