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.

Aiheeseen liittyvät artikkelit