smtp.Dial deschide o conexiune nouă către adresa sa. După ce obții o conexiune printr-un proxy HTTP CONNECT, transmite acel flux existent către smtp.NewClient în schimb.

Pentru un server SMTP care cere STARTTLS pe portul său de trimitere, predarea poate fi:

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
}

Pachetele sunt net, net/smtp și crypto/tls. Apelantul furnizează un tunel deja conectat la gazda și portul SMTP dorite, cu schimbul CONNECT al proxy-ului finalizat. Doar deschiderea TCP către proxy nu este suficientă: un răspuns HTTP nu este un salut SMTP.

mailHost este numele de gazdă al serverului SMTP, fără port. Păstrează această identitate pentru autentificarea SMTP și verificarea certificatului. O conexiune TLS către un proxy HTTPS protejează un alt segment al rutei.

Clientul returnat este pregătit pentru autentificarea SMTP și tranzacția de mail existente ale aplicației. Închide-l când ai terminat. Limitează formarea, CONNECT și operațiile de protocol ulterioare cu politica de termene a aplicației.

Proxy-ul trebuie să permită CONNECT către portul de mail ales. Unele îl restricționează la destinații HTTPS pe portul 443. Pentru SMTP cu TLS implicit, stabilește sesiunea TLS a destinației înainte de a apela NewClient în loc să emiți STARTTLS.

Articole similare