Anna CONNECT-tunneli Gon SMTP-asiakkaalle
Käytä smtp.NewClientiä valmiiksi muodostetulla tunnelilla ja pidä SMTP-isäntänimi ja STARTTLS-kättely erillään välityspalvelimen asetuksista.
smtp.Dial avaa uuden yhteyden osoitteeseensa. Kun olet saanut yhteyden HTTP CONNECT -välityspalvelimen kautta, välitä olemassa oleva virta smtp.NewClientille sen sijaan.
SMTP-palvelimelle, joka vaatii STARTTLS:n lähetysportissaan, luovutus voi näyttää tältä:
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
}Paketit ovat net, net/smtp ja crypto/tls. Kutsuja toimittaa tunnelin, joka on jo yhdistetty aiottuun SMTP-isäntään ja -porttiin, kun välityspalvelimen CONNECT-vaihto on valmis. Pelkkä TCP:n avaaminen välityspalvelimelle ei riitä: HTTP-vastaus ei ole SMTP-tervehdys.
mailHost on SMTP-palvelimen isäntänimi ilman porttia. Säilytä tämä identiteetti SMTP-todennuksessa ja varmennevarmennuksessa. TLS-yhteys HTTPS-välityspalvelimeen suojaa reitin toista osuutta.
Palautettu asiakas on valmis sovelluksen olemassa olevaan SMTP-todennukseen ja postitapahtumaan. Sulje se, kun olet valmis. Rajaa valinta, CONNECT ja sitä seuraavat protokollatoiminnot sovelluksen määräaikakäytännöllä.
Välityspalvelimen on sallittava CONNECT valittuun postiporttiin. Jotkin rajoittavat sen HTTPS-kohteisiin portissa 443. Implisiittisen TLS:n SMTP:tä varten muodosta kohteen TLS-istunto ennen NewClientin kutsumista sen sijaan, että lähettäisit STARTTLS:n.