Předejte tunel CONNECT SMTP klientovi Go
Použijte smtp.NewClient s již navázaným tunelem a držte název hostitele SMTP a handshake STARTTLS odděleně od nastavení proxy.
smtp.Dial otevírá nové připojení na svou adresu. Poté, co získáte připojení přes HTTP CONNECT proxy, předejte tento existující proud funkci smtp.NewClient.
Pro SMTP server, který vyžaduje STARTTLS na svém odesílacím portu, může předání vypadat takto:
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
}Balíčky jsou net, net/smtp a crypto/tls. Volající dodá tunel již připojený k zamýšlenému hostiteli a portu SMTP, s dokončenou výměnou CONNECT na proxy. Pouhé otevření TCP k proxy nestačí: odpověď HTTP není SMTP pozdrav.
mailHost je název hostitele SMTP serveru bez portu. Zachovejte tuto identitu pro autentizaci SMTP a ověření certifikátu. TLS připojení k HTTPS proxy chrání jiný úsek trasy.
Vrácený klient je připraven pro stávající autentizaci SMTP a poštovní transakci aplikace. Po dokončení jej zavřete. Omezte vytáčení, CONNECT a následné protokolové operace politikou termínů aplikace.
Proxy musí povolit CONNECT na zvolený poštovní port. Některé jej omezují na cíle HTTPS na portu 443. Pro SMTP s implicitním TLS navážte relaci TLS cíle před voláním NewClient místo vydání STARTTLS.