Transdonu la CONNECT-tunelon al la SMTP-kliento de Go
Uzu smtp.NewClient kun jam establita tunelo kaj tenu la SMTP-gastigantnomon kaj la STARTTLS-manpremon aparte de la proksia agordo.
smtp.Dial malfermas novan konekton al sia adreso. Post kiam vi ricevis konekton tra HTTP CONNECT-prokzio, transdonu tiun ekzistantan fluon al smtp.NewClient anstataŭe.
Por SMTP-servilo, kiu postulas STARTTLS ĉe sia eniga pordo, la transdono povas esti:
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
}La pakaĵoj estas net, net/smtp kaj crypto/tls. La alvokanto liveras tunelon jam konektitan al la celata SMTP-gastiganto kaj pordo, kun la CONNECT-interŝanĝo de la prokzio finita. Nur malfermi TCP al la prokzio ne sufiĉas: HTTP-respondo ne estas SMTP-saluto.
mailHost estas la gastigantnomo de la SMTP-servilo, sen pordo. Konservu tiun identecon por SMTP-aŭtentikigo kaj atestila kontrolo. TLS-konekto al HTTPS-prokzio protektas alian parton de la itinero.
La redonita kliento pretas por la ekzistanta SMTP-aŭtentikigo kaj poŝta transakcio de la aplikaĵo. Fermu ĝin kiam vi finos. Limigu alvokadon, CONNECT kaj sekvajn protokolajn operaciojn per la limdato-politiko de la aplikaĵo.
La prokzio devas permesi CONNECT al la elektita poŝta pordo. Iuj limigas ĝin al HTTPS-celoj ĉe pordo 443. Por SMTP kun implica TLS, starigu la TLS-sesion de la celo antaŭ ol voki NewClient anstataŭ eldoni STARTTLS.