Envío del HTML de un WebControl por E-mail
[Envía secciones de tu página por correo]

Fecha: 25/Ene/2005 (Enero 24, 2005)
Autor: Gabriel Rodríguez Plancarte (grodriguez @ silversites . com)

 


Muchas veces nos vemos en la necesidad de proveer a nuestros visitantes, usuarios o clientes con una impresión o copia de una de las paginas web de nuestro sistema. Ya sea un recibo de compra, un listado del inventario, o alguna situación similar. Una de las primeras opciones que viene a la mente es generar un PDF. Sin embargo, esto significaría que cada máquina tendría que tener el Acrobar Reader instalado y cuando se trata de diseño de aplicaciones, no podemos hacer suposiciones.

Gracias a las ventajas que el Framework del .NET nos provee, podemos solucionar este tipo de situaciones de una manera mucho más sencilla. Para este artículo, es necesario comprender que en una aplicación de ASP.NET, todos los controles se derivan de la clase Control del Framework de .NET, la cual contiene un método llamado Render. Este método acepta como parámetro único, un objeto del tipo HtmlTextWriter, y así, cada control en nuestra aplicación web es responsable de regresar su propio HTML a través de ese HtmlTextWriter.

Para poder regresarle a nuestra aplicación el texto HTML, sería lógico crear nuestro HtmlTextWriter, pasarlo como parametro del método Render del control que queremos, y solamente leer el HTML que queda guardado en el HtmlTextWriter. Sin embargo, el método Render es del tipo protected lo cual significa que solamente métodos dentro de la misma clase (o la del control, o derivadas de esta) pueden accesarlo.

Sin embargo, la clase Control también provee un método del tipo public llamado RenderControl, el cual recibe también un HtmlTextWriter como único parámetro. Hasta ahora las cosas van bien en cuanto a accesos.

Sin embargo, ahora nos topamos con el problema de que como el nombre lo implica, el HtmlTextWriter solamente sirve para escribir información. Tiene métodos como Write y WriteLine pero ningún método Read o algo similar. Sin embargo, el Constructor del HtmlTextWriter acepta como parámetro una instancia de un objeto TextWriter. Pero, la clase TextWriter es abstracta, asi que no se puede instanciar tal cual, sino que hay que instanciar una clase que derive de ella, como el StringWriter. El StringWriter si puede regresar un objeto del tipo String lo cual nos soluciona todos los problemas de este escenario.

El último párrafo puede sonar confuso, pero las cosas en código se ven mucho mas sencillas de lo que sonaron. En resumidas palabras, los pasos son:

1. Crear una instancia del tipo StringBuilder.
2. Crear una instancia del tipo StringWriter pasándole el objeto StringBuilder del paso 1 como parámetro.
3. Crear una instancia del tipo HtmlTextWriter pasándole como parametro el objeto StringWriter del paso 2.
4. Mandar llamar el método RenderControl del objeto del cual queremos obtener el codigo HTML, pasándole como parámetro el objeto HtmlTextWriter del paso 3.

Es así de sencillo y a continuación veremos un ejemplo sencillo. En mi aplicación web, tengo un DataGrid que despliega la lista de los mejores 5 jugadores de mi equipo de futbol y quiero que a través de un botón, los usuarios puedan recibir una copia idéntica de ese DataGrid en un mensaje de correo electrónico. El datagrid se llama dgJugadores, y simplemente necesitamos este codigo en el boton btnEmail que dispara el evento de mandar por email.

Private Sub btnEmail_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEmail.Click
    'Obtener el HTML

    Dim MiStringBuilder As New StringBuilder
    Dim MiStringWriter As New StringWriter(MiStringBuilder)
    Dim MiHTMLTextWriter As New HtmlTextWriter(MiStringWriter)

    'Mandamos llamar el metodo RenderControl con el control TextWriter como parametro
    dgJugadores.RenderControl(MiHTMLTextWriter)

    'Así obtenemos el texto HTML que el browser tomaría como entrada para desplegarlo gráficamente.
    Dim TextoControlHTML As String = MiStringBuilder.ToString()

    'Mandando el texto por correo
    Dim Mensaje As New MailMessage

    'Asignar propiedades provenientes de parametros, o estáticas, según la necesidad del sistema.
    Mensaje.To = "tu@email.com"
    Mensaje.From = "emailer@localhost.com"
    Mensaje.Subject = "Probando mandar controles web por Correo Electronico"

    'Es importante especificar el formato del mensaje como HTML
    Mensaje.BodyFormat = MailFormat.Html

    'Escribir el cuerpo del mensaje
    Dim strCuerpoMensaje As String
    strCuerpoMensaje = "Este es el datagrid que vimos en la pagina y ahora tenemos en nuestro "
    strCuerpoMensaje = strCuerpoMensaje & "buzon de correo." & vbCrLf & TextoControlHTML
    Mensaje.Body = strCuerpoMensaje

    'Asignar el servidor de correo electronico
    SmtpMail.SmtpServer = "localhost"

    'Finalmente, enviar el mensaje.
    SmtpMail.Send(Mensaje)
End Sub

Es así de sencillo. Una vez que obtienen el string, pueden utilizarlo para cualquier cosa que les sirva. Espero que este artículo les haya servido.

Espacios de nombres usados en el código de este artículo:

System.Text
System.IO
System.Web.Mail


ir al índice