[sql] Envío de mail desde SQL Server 2008

Hola de nuevo a todos/as!!

Esta vez toca SQL Server 2008. Hace unos días un exprofesor mío y amigo mio Jose Cousiño ,que podriamos decir que ha sido mi mentor en .net y al cúal le debo mucho :) , me explico cómo enviar correos des de SQL Server. El caso es que muchas veces necesitamos mandar correos cuando se realiza una operación en nuestra base de datos, y el envío de correo lo realizamos desde la aplicación, pero debemos de saber que se puede hacer desde el mismo servidor de bases de datos.

Para enviar los correos desde el servidor debemos de hacer varias cosas:

1.     Crear un Profile para mandar los correos (Un Profile es un perfil de base de datos)
2.     Envío del correo con el procedimiento almacenado msdb.dbo.sp_send_dbmail

Para crear el Profile hay dos formas, por diseño o por código. Nosotros únicamente vermos cómo se hace por diseño si a alguién le interesa por código que lo pida y lo envío.. A ello! los pasos a seguir serán los siguientes:

1.     En Sql Server Managment Studio, vamos al nodo Administración / Correo electrónico de base de datos

 2. Botón derecho envima del nodo "Correo electrónico de base de datos", y seleccionamos "Configurar Correo Electrónico de base de datos". Aparece un asistente que vamos a explicar detalladamente. En el primer forumlario pulsamos siguiente,

3. En el siguiente formulario, tenemos las siguientes opciones

a.     Instalar Correo electrónico de base de datos
b.     Administrar cuentas y perfiles de Correo electrónico
c.     Administrar seguridad de Perfil
d.     Ver o cambiar parámetros del sistema

Seleccionamos la primera opción para crear el Profile.

4. En el siguiente formulario vamos a crear ya el Profile y luego le añadiremos la cuenta de correo



Rellenamos el nombre de Perfil y pulsamos el botón agregar, en el cual vamos a configurar una cuenta de correo. Esta cuenta de correo puede ser cualquiera, pero generalmente cuando lo utilicemos en una empresa, utilizaremos una cuenta del servidor Exchange corporativo.
Para indicar la cuenta de correo, tendremos que rellenar el siguiente formulario



-      
Nombre de cuenta: Nombre de la cuenta de correo

-       Descripción: Breve descripción del nombre de cuenta.

-       Servidor smtp saliente

  • Dirección de correo electrónico: dirección de la cuenta de correo que enviará los correos, ejemplo sql@servidor.com
  • Nombre para mostrar: ponemos el nombre que se quiere mostrar, por ejemplo “Correo Sql”
  • Nombre del servidor: Indicamos el servidor smtp que utilizaremos para enviar al correo.

-      Autenticación: Muchas veces nuestro servidor smtp necesita autenticación para poder enviar los correos. Las posibilidades son

  • Autenticación de Windows.
  • Autenticación básica: Tenemos que indicar usuario y password
  • Autenticación anónima: La cuenta de correo no necesita auteticación

Una vez configurado todos los valores necesarios, aceptamos y pulsamos siguiente para que se cree el Profile. Bien, ya tenemos configurado todo para que nos funcione, ahora veremos cómo se envía el correo y ya estará listo para usar. Para enviar el correo debemos ejecutar el procedimiento alamacenado de la base de datos msdbsp_send_dbmail”. Este procedimiento almacenado tiene algunos parámetros importantes:

-       @profile_name: nombre del Profile con el que se va a enviar el correo.
-       @recipients: lista de direcciones de correo electrónico, separadas por punto y coma, a las que se va enviar el correo.
-       @copy_recipients: lista de direcciones de correo electrónico, separadas por punto y coma a las que se va a mandar el correo en “con copia”.
-       @subject: asunto del correo.
-       @body: cuerpo del correo.
-       @body_format: Indica el formato del correo. Solamente puede tener alguno de estos dos valores: TEXT O HTML.
-       @importance: indica la importancia del correo. Solamente puede contener alguno de estos valores: low, normal o high.
-       @sesitivity: indica la confidencialidad del correo. Solamente puede contener alguno de estos valores: normal, personal, prívate o confidential.
-       @file_attachments: Lista de nombre, separados por punto y coma de los archivos que se adjuntan al correo. Se debe de indicar las rutas absolutas.
-       @query: consulta que se ejecuta para rellenar el correo.
-       @mailitem_id: identificador del correo que se ha enviado.

Veamos un ejemplo que envía un correo en formato html.

EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'NombreProfile',
@recipients = 'contoso@contoso.com',
@body = '<p style="color:blue">Esto es una prueba de html</p>',
@body_format = 'HTML',
@subject = 'Correo de prueba desde Sql Server'

Para poder ejecutar el procedimiento almacenado, el usuario debe tener permisos en la base de datos msdb para execute. Si el usuario con el que estamos ejecutando el procedimiento almacenado no tiene permisos sobre el procedimiento almacenado sp_send_dbmail dará un error. Para solucionarlo tenemos que ir a la base de datos msdb, a su nodo seguridad, y damos botón derecho encima del usuario y seleccionamos propiedades. En la pantalla que aparece seleccionamos la función DatabaseMailUserRole, y con eso ya podemos ejecutar el procedimiento almacenado.

¡Espero que os guste y podaís utilizarlo en vuestros code's! :)

Published 26/10/2009 0:55 por Francesc Jaumot
Archivado en:
Comparte este post:

Comentarios

# re: [sql] Envío de mail desde SQL Server 2008

Monday, October 26, 2009 4:51 PM por Jose Ibáñez

Muy interesante Francesc. La verdad es que nunca me había planteado enviar los correos desde SQL Server. Un saludo.

# re: [sql] Envío de mail desde SQL Server 2008

Monday, October 26, 2009 6:14 PM por Francesc Jaumot

Hola Jose!

No te acostarás sin saber una cosa más ;) La verdad es que según cómo se haga incluso puede ser mejor que lo haga el SQL server que la propia aplicación. En el @recipients puedes poner todas las direcciones de @mail que quiees enviar y por lo tanto ya no sería necesario gestionar ese proceso des de la aplicación ¿Que creeís? ¿Es más optimo desde SQL o desde la aplicación?

# re: [sql] Envío de mail desde SQL Server 2008

Monday, October 26, 2009 6:51 PM por El Bruno

Francesc, gracias por el ejemplo; pero yo tengo una premisa en mi haber es que la base de datos es para manejar datos, porque cuando comenzamos a jugar con estos procedimientos y empezamos a hacer que la DB haga cosas que son propias del negocio ... pues acoplamos y complicamos los sistemas.

Una vez más, no es crítica, sino una opinión. ¿podés contarnos en que tipo de escenarios reales necesitas que la DB envie correo para tenerlos como referencia?

Saludos

# re: [sql] Envío de mail desde SQL Server 2008

Monday, October 26, 2009 8:47 PM por Francesc Jaumot

Hola Bruno!

Cómo ya sabrás el correo usado des de base de datos permite realizar envíos de forma asíncrona lo cúal nos resulta útil cúando un proceso es llamado des de la aplicación, web en este caso, debe enviar miles de emails para hacer una notificación y puede durar, horas e incluso días.

Suponte que el director de la empresa "x" solicita a finales de año a la aplicación web que usa un resumen a enviar a todos los accionistas de la actividad del año en el que estan.

Existe un stored procedure que debe realizar calculos y resumenes con los datos para cada accionista y al final llamar al procedimiento msdb.dbo.sp_send_dbmail para enviar cada uno de los resumenes a cada uno de los accionsitas en un formato específico, html.

También me sirve para que SQL Server me notifique de un fallo en la copia de seguridad, una importación de datos costosa...

¿Cómo lo harías tú?

Gracias por tu opinión :)

Saludos!!

# re: [sql] Envío de mail desde SQL Server 2008

Monday, October 26, 2009 11:23 PM por Jose Mª Cousiño

El envío de correo desde nuestra aplicación o desde la base de datos dependerá de nuestra logica de la aplicación o nuestra forma de trabajar. Y a veces la elección de una o otra es tan valida como la otra.

Supongamos que tenemos una aplicación en el cual hay unos procesos que pasan por estados, y dependiendo de los estados tienen que enviar correos a varias personas o grupos de personas de la empresa para realizar el seguimiento del proceso.

En este caso, es mucho mas fácil mandar los correos desde la base de datos, ya que cuando realizamos el cambio de estado en la base de datos podemos enviar los correos en el mismo proceso, que tener que cambiar el estado y luego recuperar los datos de los usuarios a los que se tiene que enviar el correo y realizar los envios desde la aplicación.

En cambio habra otras aplicaciones, en las que el envío de correo sea una cosa puntual y lo podamos hacer desde la aplicación, por ejemplo, una aplicación en la que el usuario realiza un test y luego se envía el correo con la nota. En este caso el envío es más puntual.

En conclusión, el envío del correo desde la aplicación o desde la base de datos depende de nuestros gustos y nuestras necesidades de la aplicación.

Si tenemos que realizar varias operaciones en base de datos (y despues informar a varios usuarios) antes del envío de los correos, realizar procesos automaticos, devolución de conjunto de datos sin procesamiento alguno aconsejo poder aprovechar la oportunidad que nos da Sql Server para el envío de los correos desde la base de datos, en caso contrario realizar los envios de correos desde la aplicación.

# re: [sql] Envío de mail desde SQL Server 2008

Tuesday, October 27, 2009 12:05 PM por El Bruno

@Francesc y @Jose, muchas gracias por las explicaciones. Yo principalmente dejo la DB para tareas de DB, porque cuando existe un SP que tiene muchos cálculos y realiza procesos muy pesados, eso significa que seguramente este SP tiene muchas lineas y tiene logica de negocio dentro de la base de datos. Por más que digan lo que digan, picar logica de negocio en T-SQL suele ser un infierno; y cuando veo SPs que tienen miles de líneas .. pues me da miedo. Prefiero hacer un proceso un poco más pesado y dejar separado los limites de negocio, de aplicacion y de datos ... pero claro, también entiendo que existen muchas casuísticas, muchos proyectos diferentes, y que no hay una solución única para todo. :D

Saludos

# re: [sql] Envío de mail desde SQL Server 2008

Tuesday, October 27, 2009 1:21 PM por Juan Irigoyen

@Bruno, no estoy muy deacuerdo con la afirmación en la que dices 'empezamos a hacer que la DB haga cosas que son propias del negocio', creo que esto esta muy bien para evitar problemas, pero la realidad es que una base de datos hace muchas mas cosas que pueden ser propias de la capa de negocios, de hecho en las últimas versiones incluso de expositora de servicios web, dts y un largo etc. Hay ciertas funciones que en la base de datos nos proporcionan muchas ventajas, por ejemplo notificaciones automáticas cuando modificamos cierto valor en una tabla, esto es muy dificil de implementar si la tabla es accedida por sistemas diferentes, imagina que tienes un cliente en Access, comercio electronico, hojas excel y desde ellas cambias algun valor..., ¿ Como implementas esta funcionalidad en capa de negocios ?, seguramente se pueda, pero el coste sera mucho mayor.

Ciertos aspectos de la base de datos nos facilitan el desarrollo de determinadas funciones. Aunque entiendo tu punto de vista, en el que la capa de negocios deberia encargarse de todos estos apartados, lo cierto es que en mi opinión algunas de estas funciones pueden presentar mas ventajas que incovenientes, pero que han de usarse con precaución porque tambien son fruto de muchos errores.

Un Saludo.

# re: [sql] Envío de mail desde SQL Server 2008

Tuesday, October 27, 2009 4:39 PM por El Bruno

Hey @Juan que bueno leerte por aquí. Pues yo trato de ser siempre SOA compliant, es decir publicar mi lógica por servicios y luego consumirla desde servicios !!!

Se que es mucho más costoso en algunas ocasiones que "abrir la base de datos a los usuarios", pero es que mis experiencias con este tipo de escenarios han sido realmente funestas; tanto en mantenimiento (ya comentaba lo feo que es tener SPs de miles de lineas de largo) como a nivel tecnología.

Por poner un ejemplo, tu bien comentas que hoy las DBs tienen muchas más funciones que las de un simple CRUD; por ejemplo los EndPoints (webservices exponiendo funciones o SPs) o la capacidad de generar ensamplados .Net e incorporarlos a la base de datos. Pues esta combinación no sabes los dolores de cabeza que nos trajo en un proyecto hace un tiempo, porque claro, nadie pensó en lo complicado que es el despliegue de estos ensamblados en las bases de datos porque ademas de no ser un proceso trivial, es necesario desplegar respetando el orden de referencias y tal vez para cambiar el ensamblado X necesites hacere 20 pasos !!!. Ni en que los EndPoints solo eran compatibles con Html 1.1 (eso no se sigue siendo así), etc y otro monton de problemas más; que a la larga hacían el mantenimiento de la aplicación un infierno ...

Es por eso que en mi caso, y siempre que se pueda, servicios desacopladitos, con todas sus pruebas por debajo; pero claro la realidad no siempre lo permite.

Saludetes :D

# re: [sql] Envío de mail desde SQL Server 2008

Tuesday, October 27, 2009 7:16 PM por Juan Irigoyen

Hola Bruno, estoy completamente deacuerdo con lo que comentas, ensamblados .net, procedimientos almacenados complejos y otros aspectos pueden suponer muchos dolores de cabeza, pero creo que ciertas capacidades pueden llegar a ser muy útiles en ciertos entornos (por supuesto extremando las precauciones). Nosotros utilizamos un sistema de notificaciones automatico desde Sql server basado en el servidor de correo, de forma que cada vez que se realiza un impagado independientemente que este se realice a traves del sistema de comercio electronico, programa winforms del cliente, o a traves de una simple hoja de cálculo excel o access envie una notificación de forma automatica al responsable financiero, agente y comercial, este tipo de servicios nos han funcionado muy bien, incluso cuando hemos actualizado a la versión 2005 y 2008, tanto que hemos extendido estas notificaciones automáticas a través de este método, creo recordar que en el sistema de gestión actual tenemos mas de 60 tipos diferentes.

Estoy deacuerdo en que hacerlo a traves de SOA es una excelente solución, pero tambien creas dependencia con IIS y tienes mayor complejidad ya que en ciertos entornos acceder a través de SOA con clientes como excel o access  puede complejo.

En mi caso, las notificaciones automáticas a traves de la base de datos pueden ser una buena solución en determinados entornos.

A ver si coincidimos en alguna evento y charlamos un rato.

Un saludo.

# re: [sql] Envío de mail desde SQL Server 2008

Wednesday, October 28, 2009 5:18 AM por Christian

Muchachos(que algun dia fueron XD) lean esta entrada de un blog de un amigo mío respecto al punto de discusión.Gracias

geeks.ms/.../159080.aspx

# re: [sql] Envío de mail desde SQL Server 2008

Wednesday, March 03, 2010 10:30 PM por fernando

hola como estas me prodrias ayudar como publicar un servidor web en sql server 2008 te lo agradecere mucho

# re: [sql] Envío de mail desde SQL Server 2008

Friday, May 21, 2010 10:25 AM por chema

genial, me ha servido perfectamente!!!

# re: [sql] Envío de mail desde SQL Server 2008

Thursday, August 05, 2010 10:27 PM por Andy

Hola que tal, la verdad me parecio muy interesante pero me gustaria crear el profile mediante codigo, mencionaste inicialmente que se podia y te agradeceria si me podrias enviar algo te dejo mi email: andy.r3@gmail.com

Gracias..

# re: [sql] Envío de mail desde SQL Server 2008

Wednesday, August 11, 2010 8:55 PM por F.A.S.

Hola,

Me parecio muy bueno este blog, al igual que Andy, me gustaría tener el código para la creación del perfil, podrías enviarmelo, también me gustaría poreguntarte, ¿La version express te permite el envío de correo electronico?

# re: [sql] Envío de mail desde SQL Server 2008

Tuesday, November 30, 2010 5:34 PM por José Reyes

Hola,

Estoy de acuerdo contigo, pero todos deben de saber que todas las herramientas no son generica o aplicada para todos los casos usted elije en que le pude dar utilidad.

Gracias por tu gran aporte. Favor de enviarme el código crear el profile mediante

# re: [sql] Envío de mail desde SQL Server 2008

Thursday, June 09, 2011 10:12 PM por joanna

Por fa tu crees que podrias enviarme todo lo que has explicado en tu post  pero en codigo, yo tmb he hecho la configuracion del envio de correo mediante el wizard, pero necesito tenerlo en codigo.

Gracias