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.

Artículos relacionados