smtp.Dial apre una nuova connessione verso il suo indirizzo. Dopo aver ottenuto una connessione tramite un proxy HTTP CONNECT, passa quel flusso esistente a smtp.NewClient invece.

Per un server SMTP che richiede STARTTLS sulla sua porta di invio, la consegna può essere:

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
}

I pacchetti sono net, net/smtp e crypto/tls. Il chiamante fornisce un tunnel già connesso all'host e alla porta SMTP desiderati, con lo scambio CONNECT del proxy completato. Aprire solo TCP verso il proxy non basta: una risposta HTTP non è un saluto SMTP.

mailHost è il nome host del server SMTP, senza porta. Conserva quell'identità per l'autenticazione SMTP e la verifica del certificato. Una connessione TLS verso un proxy HTTPS protegge un altro tratto della rotta.

Il client restituito è pronto per l'autenticazione SMTP e la transazione di posta esistenti dell'applicazione. Chiudilo quando hai finito. Limita composizione, CONNECT e le successive operazioni di protocollo con la politica di scadenza dell'applicazione.

Il proxy deve consentire CONNECT verso la porta di posta scelta. Alcuni lo limitano a destinazioni HTTPS sulla porta 443. Per SMTP con TLS implicito, stabilisci la sessione TLS di destinazione prima di chiamare NewClient invece di emettere STARTTLS.

Articoli correlati