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.

Rilataj artikoloj