Net::SMTP 3.16 tidak punya konstruktor SOCKS yang sudah terhubung
Net::SMTP 3.16 tidak mendokumentasikan opsi konstruktor soket yang sudah terhubung. Jaga urutan sapaan SMTP, EHLO, dan TLS tetap utuh saat memilih integrasi transport proxy.
Net::SMTP 3.16 tidak mendokumentasikan parameter konstruktor SOCKS atau soket yang sudah terhubung. Membungkus deskriptor berkas dengan new_from_fd warisan tidak menjalankan konstruktor SMTP-nya. Koneksi SOCKS yang berhasil menyediakan aliran, bukan sesi surat yang sudah diinisialisasi.
Untuk SMTP biasa, termasuk peningkatan STARTTLS di kemudian hari, server berbicara lebih dulu:
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 skematis; ekstensi yang diumumkan bervariasi. Sapaan itu sendiri dapat mencakup beberapa baris: kode balasan yang diikuti tanda hubung melanjutkan balasan, sedangkan baris terakhirnya mengakhirinya. Konsumsi seluruh sapaan sebelum EHLO. Jika tidak, klien dapat membaca 220 lama saat mengharapkan 250 dari EHLO dan kehilangan irama pada koneksi yang sehat.
TLS implisit memiliki urutan lain: koneksi SOCKS, jabat tangan TLS, lalu sapaan SMTP di dalam TLS. STARTTLS dimulai dengan sapaan yang terbaca dan EHLO, meningkatkan aliran, dan setelah itu memperoleh kemampuan lagi.
Konstruktor publik biasanya menangani konfigurasi soket, parameter koneksi tersimpan, dan informasi sapaan, respons awal, serta EHLO dengan cadangan HELO bila 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 publik ini menggunakan STARTTLS dan tidak mengonfigurasi SOCKS. Nama server memilih tujuan surat; Hello menyediakan identitas SMTP klien. Untuk TLS implisit, gunakan opsi konstruktor SSL yang terdokumentasi dan porta layanan.
SendHello => 0 menekan EHLO/HELO otomatis, bukan pembacaan sapaan atau pembangunan transport. Memanggil pembaca baris lalu hello() juga bukan pengganti inisialisasi yang terdokumentasi: Net::Cmd mengklasifikasikan pembaca respons tingkat rendahnya sebagai metode subkelas yang dilindungi.
Jika SOCKS wajib, pilih klien dengan antarmuka SOCKS yang didukung atau pertahankan integrasi terhadap versi Net::SMTP tertentu. Gunakan urutan di atas sebagai kontraknya alih-alih menyalin bidang privat. Adaptor TCP terpisah juga memerlukan penanganan identitas TLS yang disengaja: sertifikat harus mengidentifikasi layanan surat yang sebenarnya, dan kredensial proxy tetap terpisah dari login SMTP.