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 സെഷൻ സ്ഥാപിക്കുക.