Net::SMTP 3.16 SOCKS या पूर्व-जुड़े सॉकेट के लिए कोई कंस्ट्रक्टर पैरामीटर प्रलेखित नहीं करता। फ़ाइल डिस्क्रिप्टर को विरासत में मिले new_from_fd से लपेटने पर उसका SMTP कंस्ट्रक्टर नहीं चलता। सफल SOCKS कनेक्शन एक स्ट्रीम देता है, आरंभित मेल सत्र नहीं।

सादे SMTP के लिए, बाद के STARTTLS उन्नयन सहित, सर्वर पहले बोलता है:

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

यह योजनाबद्ध है; घोषित एक्सटेंशन बदलते रहते हैं। अभिवादन स्वयं कई पंक्तियों में फैल सकता है: प्रतिक्रिया कोड के बाद हाइफ़न प्रतिक्रिया जारी रखता है, जबकि उसकी अंतिम पंक्ति उसे समाप्त करती है। EHLO से पहले पूरा अभिवादन ग्रहण करें। अन्यथा क्लाइंट EHLO के 250 की प्रतीक्षा में पुराना 220 पढ़ सकता है और स्वस्थ कनेक्शन पर लय खो सकता है।

अंतर्निहित TLS का क्रम भिन्न है: SOCKS कनेक्शन, TLS हैंडशेक, फिर TLS के भीतर SMTP अभिवादन। STARTTLS पठनीय अभिवादन और EHLO से शुरू होता है, स्ट्रीम को उन्नत करता है और उसके बाद फिर क्षमताएँ प्राप्त करता है।

सार्वजनिक कंस्ट्रक्टर सामान्यतः सॉकेट कॉन्फ़िगरेशन, सहेजे गए कनेक्शन पैरामीटर और अभिवादन जानकारी, प्रारंभिक प्रतिक्रिया तथा जहाँ उपयुक्त हो HELO फ़ॉलबैक के साथ EHLO संभालता है:

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;

यह सार्वजनिक उदाहरण STARTTLS का उपयोग करता है और SOCKS कॉन्फ़िगर नहीं करता। सर्वर नाम मेल गंतव्य चुनता है; Hello क्लाइंट की SMTP पहचान देता है। अंतर्निहित TLS के लिए प्रलेखित SSL कंस्ट्रक्टर विकल्प और सेवा का पोर्ट उपयोग करें।

SendHello => 0 स्वचालित EHLO/HELO को दबाता है, अभिवादन पढ़ने या ट्रांसपोर्ट बनाने को नहीं। पंक्ति पाठक बुलाकर फिर hello() बुलाना भी आरंभीकरण का प्रलेखित विकल्प नहीं है: Net::Cmd अपने निम्न-स्तरीय प्रतिक्रिया पाठकों को संरक्षित उपवर्ग विधियों के रूप में वर्गीकृत करता है।

यदि SOCKS अनिवार्य है, तो समर्थित SOCKS इंटरफ़ेस वाला क्लाइंट चुनें या विशिष्ट Net::SMTP संस्करण के विरुद्ध एकीकरण बनाए रखें। निजी फ़ील्ड की नकल करने के बजाय उपर्युक्त क्रम को उसका अनुबंध मानें। अलग TCP अडैप्टर को भी सुविचारित TLS पहचान प्रबंधन चाहिए: प्रमाणपत्र को वास्तविक मेल सेवा की पहचान करनी चाहिए, और प्रॉक्सी क्रेडेंशियल SMTP लॉगिन से अलग रहते हैं।

संबंधित लेख