CONNECT సొరంగాన్ని Go యొక్క SMTP క్లయింట్కు అప్పగించండి
ఇప్పటికే ఏర్పాటైన సొరంగంతో smtp.NewClient ఉపయోగించి, SMTP హోస్ట్పేరు మరియు STARTTLS హ్యాండ్షేక్ను ప్రాక్సీ సెటప్ నుండి వేరుగా ఉంచండి.
smtp.Dial దాని చిరునామాకు కొత్త కనెక్షన్ తెరుస్తుంది. HTTP CONNECT ప్రాక్సీ ద్వారా కనెక్షన్ పొందిన తర్వాత, ఆ ఉన్న స్ట్రీమ్ను దానికి బదులుగా smtp.NewClientకు అప్పగించండి.
తన సబ్మిషన్ పోర్ట్లో STARTTLS అవసరమయ్యే SMTP సర్వర్ కోసం, అప్పగింత ఇలా ఉండవచ్చు:
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 సెషన్ను ఏర్పాటు చేయండి.