PDA

Ver la versión completa : Enviar Correo electronico desde SQL Server




Shell Root
10-31-2009, 09:40 PM
Enviar Correo electronico desde SQL Server



Introducción:

Desarrollando una aplicación web, para un colegio, tuve la necesidad de enviar un correo electrónico con ciertos datos, que estaban almacenados en la base de datos (en este caso el motor de base de datos es, SQL Server 2008). Así que tenía 2 opciones:

Quemar los recursos desde el Visual Studio (Herramienta de desarrollo que ando usando… xD)
Quemar los recursos del SQL.


Pensando las cosas, llegue a la conclusión de que… si se hace un Insert u otra instrucción SQL dentro del Visual Studio el tiempo de ejecución es de unos 3 o 4 Seg. (Dependiendo de la consulta), pero si se hace desde un store procedure tarda 1 seg (desde el punto de vista de la aplicación por parte del usuario), entonces me pregunte a mí mismo, ¿Mi mismo, cual opción usamos en esta ocasión? Y me respondí, ¿Pues, mi mismo, deberíamos de experimentar un poco con el SQL?, y asi fue… Usé xp_sendmail... xD




¿Que es xp_sendmail?
Envía un mensaje de correo electrónico, que puede incluir un conjunto de resultados de una consulta como datos adjuntos, a los destinatarios especificados. Este procedimiento almacenado ampliado utiliza SQL Mail para enviar el mensaje.




Sintaxis
Procedimiento Almacenado: xp_sendmail


{ [ @recipients= ] 'recipients [ ;...n ]' } -- Es la lista, separada por puntos y comas, de los destinatarios del mensaje de correo.
[ ,[ @message= ] 'message' ] -- Es el cuerpo del mensaje que se va a enviar. messagepuede tener hasta 8.000 bytes.
[ ,[ @query= ] 'query' ] -- Es una consulta de SQL Server válida, cuyo resultado se envía en un mensaje de correo electrónico. xp_sendmail utiliza una conexión enlazada para el parámetro query. La conexión query realizada por SQL Mail no está bloqueada por los bloqueos que mantiene el cliente que emite la solicitud xp_sendmail. Esto hace que xp_sendmail sea más fácil de utilizar en desencadenadores. Sin embargo, la instrucción query no puede hacer referencia a las tablas lógicas insertadas y eliminadas, ya que estas tablas sólo están disponibles con un desencadenador. querypuede tener hasta 8.000 bytes.
[ ,[ @attachments= ] 'attachments [ ;...n ]' ] -- Es una lista de archivos separados por punto y coma para adjuntarlos al mensaje de correo. Si utiliza el parámetro @query cuando @attach_results es TRUE, el parámetro @attachments sólo puede especificar un archivo para adjuntarlo al mensaje de correo electrónico. Para enviar más de un archivo, debe ejecutar xp_sendmail por separado para cada archivo adjunto.
[ ,[ @copy_recipients= ] 'copy_recipients [ ;...n ]' -- Es la lista, separada por puntos y comas, que identifica a los destinatarios de copias del mensaje de correo.
[ ,[ @blind_copy_recipients= ] 'blind_copy_recipients [ ;...n ]' -- Es una lista opcional, separada por puntos y comas, que identifica a los destinatarios de copias ocultas del mensaje de correo.
[ ,[ @subject= ] 'subject' ] -- Es un parámetro que especifica el asunto del mensaje. Si subjectno se ha especificado, el valor predeterminado es "Mensaje de SQL Server".
[ ,[ @attach_results= ] 'attach_value' ] -- Es un parámetro opcional que especifica si el conjunto de resultados de una consulta se envía como archivo adjunto en el mensaje, en lugar de en el propio mensaje. Si @attachments no es NULL y @attach_results es TRUE, el primer nombre de archivo de attachments se utiliza como nombre de archivo de los resultados. Si @attachments es NULL, se genera un nombre de archivo con la extensión .txt. El valor predeterminado es FALSE, que significa que el conjunto de resultados se incluye en el mensaje.
[ ,[ @no_output= ] 'output_value' ] -- Es un parámetro opcional que envía el mensaje pero no devuelve ninguna salida a la sesión del cliente que lo envía. El valor predeterminado es FALSE, lo que significa que la sesión del cliente de SQL Server recibe su salida.
[ ,[ @no_header= ] 'header_value' ] -- Es un parámetro opcional que envía los resultados de la consulta en el mensaje, pero no envía información de los encabezados de las columnas junto con los resultados de la consulta. El valor predeterminado es FALSE, que significa se envía información de los encabezados de las columnas junto con los resultados de la consulta.
[ ,[ @width= ] width ] -- Es un parámetro opcional que establece el ancho de la línea del texto de salida de la consulta. Este parámetro es idéntico al parámetro /w de la utilidad isql. Para consultas que producen filas de salida largas, use width con attach_results para enviar la salida sin saltos de línea entre las líneas de salida. El ancho predeterminado es 80 caracteres.
[ ,[ @separator= ] 'separator' ] -- Es la cadena de separador de columna para cada columna del conjunto de resultados. De manera predeterminada, el separador de columna es un espacio en blanco. El uso de un separador de columna facilita el análisis del conjunto de resultados en hojas de cálculo y otras aplicaciones. Por ejemplo, use separator con attach_results para enviar archivos con valores separados por comas.
[ ,[ @echo_error= ] 'echo_value' ] -- Cuando es TRUE, hace que SQL Mail capture los mensajes del servidor o los errores de DB-Library encontrados al ejecutar la consulta, y que los adjunte al mensaje de correo en lugar de escribirlos en el registro de errores. Asimismo, se adjunta al mensaje el recuento de las filas devueltas o afectadas.
[ ,[ @set_user= ] 'user' ] -- Es el contexto de seguridad en el que se debe ejecutar la consulta. Si user no se ha especificado, el contexto de seguridad predeterminado adopta el valor del usuario que ejecuta xp_sendmail.
[ ,[ @dbuse= ] 'database' ] -- Es el contexto de la base de datos en la que se tiene que ejecutar la consulta. El valor predeterminado es NULL, que significa que el usuario se encuentra en la base de datos predeterminada.



Ejemplo

EXEC master.dbo.xp_sendmail
@recipients=N'[email protected]',
@message=N'La base de datos principal está llena.' ;




Fuente: http://msdn.microsoft.com

Espero que les sea de ayuda esta info...

Saludos!