smtp.Dial obre una connexió nova a la seva adreça. Després d'obtenir una connexió a través d'un proxy HTTP CONNECT, passeu aquest flux existent a smtp.NewClient en lloc seu.

Per a un servidor SMTP que requereix STARTTLS al seu port de submissió, el lliurament pot ser:

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
}

Els paquets són net, net/smtp i crypto/tls. El cridador proporciona un túnel ja connectat a l'amfitrió i port SMTP desitjats, amb l'intercanvi CONNECT del proxy completat. Només obrir TCP cap al proxy no és suficient: una resposta HTTP no és una salutació SMTP.

mailHost és el nom d'amfitrió del servidor SMTP, sense port. Manteniu aquesta identitat per a l'autenticació SMTP i la verificació del certificat. Una connexió TLS a un proxy HTTPS protegeix una altra part de la ruta.

El client retornat està a punt per a l'autenticació SMTP i la transacció de correu existents de l'aplicació. Tanqueu-lo quan hàgiu acabat. Limiteu la marcació, el CONNECT i les operacions de protocol posteriors amb la política de terminis de l'aplicació.

El proxy ha de permetre CONNECT cap al port de correu triat. Alguns el restringeixen a destinacions HTTPS al port 443. Per a SMTP amb TLS implícit, establiu la sessió TLS de destinació abans de cridar NewClient en lloc d'emetre STARTTLS.

Articles relacionats