CONNECT सुरंग Go के SMTP क्लाइंट को सौंपें
पहले से स्थापित सुरंग के साथ smtp.NewClient का उपयोग करें और SMTP होस्टनाम तथा STARTTLS हैंडशेक को प्रॉक्सी सेटअप से अलग रखें।
smtp.Dial अपने पते पर नया कनेक्शन खोलता है। HTTP CONNECT प्रॉक्सी के माध्यम से कनेक्शन मिलने के बाद, उस मौजूदा स्ट्रीम को इसके बजाय smtp.NewClient को दें।
जो SMTP सर्वर अपने सबमिशन पोर्ट पर STARTTLS मांगता है, उसके लिए हैंडऑफ़ इस प्रकार हो सकता है:
func smtpOverTunnel(conn net.Conn, mailHost string) (*smtp.Client, error) {
client, err := smtp.NewClient(conn, mailHost)
if err != nil {
conn.Close()
return nil, err
}
err = client.StartTLS(&tls.Config{
ServerName: mailHost,
MinVersion: tls.VersionTLS12,
})
if err != nil {
client.Close()
return nil, err
}
return client, nil
}पैकेज net, net/smtp और crypto/tls हैं। कॉलर इच्छित SMTP होस्ट और पोर्ट से पहले से जुड़ी सुरंग देता है, साथ में प्रॉक्सी का CONNECT आदान-प्रदान पूरा हो चुका होता है। प्रॉक्सी तक केवल TCP खोलना पर्याप्त नहीं है: HTTP प्रतिक्रिया SMTP अभिवादन नहीं है।
mailHost SMTP सर्वर का होस्टनाम है, बिना पोर्ट। SMTP प्रमाणीकरण और प्रमाणपत्र सत्यापन के लिए वह पहचान बनाए रखें। HTTPS प्रॉक्सी से TLS कनेक्शन मार्ग के दूसरे हिस्से की रक्षा करता है।
लौटाया गया क्लाइंट ऐप्लिकेशन के मौजूदा SMTP प्रमाणीकरण और मेल लेन-देन के लिए तैयार है। समाप्त होने पर इसे बंद करें। डायलिंग, CONNECT और आगे के प्रोटोकॉल संचालन को ऐप्लिकेशन की समय-सीमा नीति से सीमित करें।
प्रॉक्सी को चुने गए मेल पोर्ट पर CONNECT की अनुमति देनी चाहिए। कुछ इसे पोर्ट 443 पर HTTPS गंतव्यों तक सीमित रखते हैं। अंतर्निहित TLS वाले SMTP के लिए, STARTTLS जारी करने के बजाय NewClient कॉल करने से पहले गंतव्य का TLS सत्र स्थापित करें।