Entrega el túnel CONNECT al cliente SMTP de Go
Usa smtp.NewClient con un túnel ya establecido y mantén el nombre de host SMTP y el handshake STARTTLS separados de la configuración del proxy.
smtp.Dial abre una conexión nueva a su dirección. Después de obtener una conexión a través de un proxy HTTP CONNECT, pasa ese flujo existente a smtp.NewClient en su lugar.
Para un servidor SMTP que exige STARTTLS en su puerto de envío, la entrega puede 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
}Los paquetes son net, net/smtp y crypto/tls. El llamador proporciona un túnel ya conectado al host y puerto SMTP deseados, con el intercambio CONNECT del proxy completado. Abrir solo TCP hacia el proxy no basta: una respuesta HTTP no es un saludo SMTP.
mailHost es el nombre de host del servidor SMTP, sin puerto. Conserva esa identidad para la autenticación SMTP y la verificación del certificado. Una conexión TLS a un proxy HTTPS protege otro tramo de la ruta.
El cliente devuelto está listo para la autenticación SMTP y la transacción de correo existentes de la aplicación. Ciérralo cuando termines. Limita el marcado, el CONNECT y las operaciones de protocolo posteriores con la política de plazos de la aplicación.
El proxy debe permitir CONNECT hacia el puerto de correo elegido. Algunos lo restringen a destinos HTTPS en el puerto 443. Para SMTP con TLS implícito, establece la sesión TLS de destino antes de llamar a NewClient en lugar de emitir STARTTLS.