Perduokite CONNECT tunelį Go SMTP klientui
Naudokite smtp.NewClient su jau suformuotu tuneliu ir laikykite SMTP pagrindinio kompiuterio vardą bei STARTTLS rankos paspaudimą atskirai nuo proxy nustatymų.
smtp.Dial atidaro naują ryšį su savo adresu. Gavę ryšį per HTTP CONNECT proxy, perduokite tą esamą srautą funkcijai smtp.NewClient.
SMTP serveriui, kuris reikalauja STARTTLS jo siuntimo prieveiksme, perdavimas gali atrodyti taip:
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
}Paketai yra net, net/smtp ir crypto/tls. Kviečiantysis pateikia tunelį, jau prijungtą prie norimo SMTP pagrindinio kompiuterio ir prievado, kai proxy CONNECT mainai baigti. Vien atidaryti TCP į proxy nepakanka: HTTP atsakymas nėra SMTP pasveikinimas.
mailHost yra SMTP serverio pagrindinio kompiuterio vardas be prievado. Išsaugokite šią tapatybę SMTP autentifikavimui ir sertifikato tikrinimui. TLS ryšys su HTTPS proxy apsaugo kitą maršruto atkarpą.
Grąžintas klientas paruoštas esamam programos SMTP autentifikavimui ir pašto operacijai. Uždarykite jį, kai baigsite. Apribokite rinkimą, CONNECT ir vėlesnes protokolo operacijas programos terminų politika.
Proxy turi leisti CONNECT į pasirinktą pašto prievadą. Kai kurie apriboja jį HTTPS paskirties vietomis 443 prievade. SMTP su implicitiniu TLS atveju nustatykite paskirties TLS sesiją prieš kviesdami NewClient, o ne išduokite STARTTLS.