Predă tunelul CONNECT clientului SMTP din Go
Folosește smtp.NewClient cu un tunel deja stabilit și ține numele de gazdă SMTP și handshake-ul STARTTLS separate de configurarea proxy-ului.
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.