Consegna il tunnel CONNECT al client SMTP di Go
Usa smtp.NewClient con un tunnel già stabilito e tieni il nome host SMTP e l'handshake STARTTLS separati dalla configurazione del proxy.
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.