smtp.Dial új kapcsolatot nyit a címére. Miután HTTP CONNECT proxyn keresztül kapcsolatot szerzett, adja át a meglévő adatfolyamot a smtp.NewClientnek.

Egy olyan SMTP-kiszolgáló esetén, amely STARTTLS-t követel a beküldési portján, az átadás így nézhet ki:

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
}

A csomagok: net, net/smtp és crypto/tls. A hívó egy már a kívánt SMTP-géphez és porthoz kapcsolódó alagutat biztosít, a proxy CONNECT-cseréje befejeződött. Önmagában TCP-t nyitni a proxy felé nem elég: a HTTP-válasz nem SMTP-köszöntés.

mailHost az SMTP-kiszolgáló gépneve, port nélkül. Őrizze meg ezt az azonosságot az SMTP-hitelesítéshez és a tanúsítvány-ellenőrzéshez. Az HTTPS-proxyhoz irányuló TLS-kapcsolat az útvonal másik szakaszát védi.

A visszaadott kliens készen áll az alkalmazás meglévő SMTP-hitelesítésére és levélügyletére. Zárja be, ha végzett. A tárcsázást, a CONNECT-et és a további protokollműveleteket az alkalmazás határidő-szabályzatával korlátozza.

A proxynak engedélyeznie kell a CONNECT-et a kiválasztott levélport felé. Egyesek csak a 443-as port HTTPS-céljaira korlátozzák. Implicit TLS-es SMTP esetén a STARTTLS kiadása helyett a cél TLS-munkamenetét hozza létre a NewClient meghívása előtt.

Kapcsolódó cikkek