Predajte tunel CONNECT odjemalcu SMTP v Go
Uporabite smtp.NewClient z že vzpostavljenim tunelom in ime gostitelja SMTP ter rokovanje STARTTLS držite ločeno od nastavitve posrednika.
smtp.Dial odpre novo povezavo na svoj naslov. Ko pridobite povezavo prek posrednika HTTP CONNECT, ta obstoječi tok predajte smtp.NewClient.
Za strežnik SMTP, ki zahteva STARTTLS na svojem vratih za pošiljanje, je predaja lahko takšna:
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
}Paketi so net, net/smtp in crypto/tls. Klicatelj zagotovi tunel, ki je že povezan z želenim gostiteljem in vrati SMTP, z zaključeno izmenjavo CONNECT posrednika. Samo odpiranje TCP proti posredniku ni dovolj: odgovor HTTP ni pozdrav SMTP.
mailHost je ime gostitelja strežnika SMTP, brez vrat. Ohranite to identiteto za preverjanje pristnosti SMTP in preverjanje potrdila. Povezava TLS s posrednikom HTTPS ščiti drug odsek poti.
Vrnjeni odjemalec je pripravljen za obstoječe preverjanje pristnosti SMTP in poštno transakcijo aplikacije. Zaprite ga, ko končate. Omejite klicanje, CONNECT in nadaljnje protokolarne operacije s politiko rokov aplikacije.
Posrednik mora dovoliti CONNECT na izbrana poštna vrata. Nekateri ga omejujejo na cilje HTTPS na vratih 443. Za SMTP z implicitnim TLS vzpostavite sejo TLS cilja pred klicem NewClient, namesto da izdate STARTTLS.