Entrega o túnel CONNECT ao cliente SMTP de Go
Usa smtp.NewClient cun túnel xa establecido e mantén o nome de host SMTP e o handshake STARTTLS separados da configuración do proxy.
smtp.Dial abre unha conexión nova ao seu enderezo. Despois de obter unha conexión a través dun proxy HTTP CONNECT, pasa ese fluxo existente a smtp.NewClient no seu lugar.
Para un servidor SMTP que require STARTTLS no seu porto de envío, a entrega pode ser:
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
}Os paquetes son net, net/smtp e crypto/tls. O chamador fornece un túnel xa conectado ao host e porto SMTP desexados, co intercambio CONNECT do proxy completado. Abrir só TCP cara ao proxy non abonda: unha resposta HTTP non é un saúdo SMTP.
mailHost é o nome de host do servidor SMTP, sen porto. Conserva esa identidade para a autenticación SMTP e a verificación do certificado. Unha conexión TLS a un proxy HTTPS protexe outro tramo da ruta.
O cliente devolto está listo para a autenticación SMTP e a transacción de correo existentes da aplicación. Péchao cando remates. Limita a marcación, o CONNECT e as operacións de protocolo posteriores coa política de prazos da aplicación.
O proxy debe permitir CONNECT cara ao porto de correo elixido. Algúns restrinxen iso a destinos HTTPS no porto 443. Para SMTP con TLS implícito, establece a sesión TLS de destino antes de chamar a NewClient en lugar de emitir STARTTLS.