Net::SMTP 3.16 tidak mendokumenkan parameter pembina SOCKS atau soket prabersambung. Membalut deskriptor fail dengan new_from_fd warisan tidak menjalankan pembina SMTPnya. Sambungan SOCKS yang berjaya memberikan aliran, bukan sesi mel yang dimulakan.

Untuk SMTP biasa, termasuk peningkatan STARTTLS kemudian, pelayan bercakap dahulu:

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 ...

Ini skematik; sambungan yang diiklankan berbeza-beza. Sapaan itu sendiri boleh merentangi beberapa baris: kod balasan diikuti sempang meneruskan balasan, manakala baris terakhirnya menamatkannya. Habiskan seluruh sapaan sebelum EHLO. Jika tidak, klien boleh membaca 220 lama apabila mengharapkan 250 daripada EHLO dan hilang rentak pada sambungan yang sihat.

TLS tersirat mempunyai susunan lain: sambungan SOCKS, jabat tangan TLS, kemudian sapaan SMTP di dalam TLS. STARTTLS bermula dengan sapaan yang boleh dibaca dan EHLO, meningkatkan aliran dan memperoleh keupayaan semula selepas itu.

Pembina awam biasanya mengendalikan konfigurasi soket, parameter sambungan tersimpan dan maklumat sapaan, respons awal dan EHLO dengan sandaran HELO di mana sesuai:

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;

Contoh awam ini menggunakan STARTTLS dan tidak mengkonfigurasi SOCKS. Nama pelayan memilih destinasi mel; Hello memberikan identiti SMTP klien. Untuk TLS tersirat, gunakan pilihan pembina SSL yang didokumenkan dan port perkhidmatan.

SendHello => 0 menyekat EHLO/HELO automatik, bukan pembacaan sapaan atau pembinaan pengangkutan. Memanggil pembaca baris kemudian hello() juga bukan pengganti permulaan yang didokumenkan: Net::Cmd mengklasifikasikan pembaca respons peringkat rendahnya sebagai kaedah subkelas terlindung.

Jika SOCKS wajib, pilih klien dengan antara muka SOCKS yang disokong atau kekalkan integrasi terhadap versi Net::SMTP tertentu. Gunakan urutan di atas sebagai kontraknya dan bukannya menyalin medan peribadi. Penyesuai TCP berasingan juga memerlukan pengendalian identiti TLS yang disengajakan: sijil mesti mengenal pasti perkhidmatan mel sebenar, dan kelayakan proksi kekal berasingan daripada log masuk SMTP.

Artikel berkaitan