martes, 4 de mayo de 2010

Correo electronico de Base de Datos

El Correo electrónico de base de datos permite a las aplicaciones de base de datos enviar mensajes de correo electrónico a los usuarios. Los mensajes enviados pueden incluir resultados de consultas y archivos de cualquier recurso de la red. (esto ultimo solo si nuestro servidor es parte del dominio de nuestra Red, caso contrario es muy posible que no podamos enviar archivos de un recurso compartido y solo lo que este en el equipo donde este corriendo nuestro servidor SqlServer) Lo interesante aqui, es que no necesitamos tener un outlook o algun tipo de interfaz de mensajeria (MAPI), nuestro servidor SqlServer entrega los mensajes a algun servidor SMTP que tenemos que tener (en nuestra red) y listo. Podemos usar un servidor SMTP cualquiera, hay muchos en la red, yo personalemente uso uno que me da muy buenos resultados y es muy facil de configurar, http://www.argosoft.com/ Tiene su version full pero la free esta buena. Se configurar los datos minimos, autenticacion del servidor si queremos o anonima (no es recomendable). Y si queremos enviar correos afuera de nuestra red (dominio) tenemos que setear un DNS valido y listo. Ya podemos desde SqlServer mandar mail a usuarios de la empresa y a casillas de gmail, yahoo, etc. Una vez que tenemos nuestro servidor SMTP andando, nos olvidamos de el y hacemos unos seteos en nuestro servidor SqlServer. El primer paso es tener habilitada esta funcionalidad, por defecto esta habilitada en la base de datos msdb. Esto lo podemos chequear desde el administrador de superficie de SqlServer Chequeado esto hay basicamente dos pasos a realizar. Uno es crear un perfil de correo de base de datos y el segundo es agregarle a este perfil una o varias cuentas de correo de base de datos. La idea aqui es que estas cuentas tengan un orden de prioridad y de quererse cada una puede apuntar a distintos servidores SMTP que tengamos configurados, de modo que si hay alguno caido, el proceso de envio sigue con la siguiente cuenta. (Para SqlServer el correo es enviado cuando es recibido por el servidor SMTP, el hecho que este pueda finalmente enviar el correo a la cuenta indicada no es responsabilidad de SqlServer y por tanto escapa de el informar del arribo).

Como lo h
ace
mos.... Desde el SSMS nos habirmos camino hasta correo electronico de base de datos, dentro de la administracion del servidor.



Boton derecho sobre este y eleginos configuracion de correo electronico de datos. Nos da una bienvenida clasica, seguimos y elegimos la opcion 1




Aqui damos de alta nuestro primer perfil y al mismo tiempo nuestra primera cuenta.... despues podremos seguir agregando cuentas al perfil o crear otros perfiles. El nombre de la cuenta no tiene que corresponder a una cuenta de SqlServer ni al servidor SMTP. Lo importante aqui es colocar bien el correo electronico y la direccion IP del servidor SMTP o su nombre. Por defecto estos servidores tienen el puesto 25 definido para ellos. Si configuramos nuestro servidor SMTP con autenticacion, entonces aqui tambien devemos indicar usuario y clave (si configuro al servidor de SMTP que admita autenticaciones anonimas deje en blanco estas entradas.





Confirme estas entradas y siguamos adelante. Llegaremos al punto donde tenemos que indicar si el perfil es publico o privado y cual es el perfil por defecto en cada caso.


Tenemos que tener claro que podran usar correo de base de datos aquellos usuarios que sean mienbros del rol de base da datos DataBaseMailUserRole y sean usuarios de la base de datos usada para el correo (por defecto ya dijimos que es la msdb)

A su vez, usuarios particulares podran tener perfiles privados y solo ellos podran enviar correos con ese perfil.

Continuemos con el seteo de estas entradas y terminaremos con dar de alta nuestro primer perfil y su cuenta asociada
al mismo.







Son pocas las tablas y/ vistas que usamos. Basicamente:


- sysmail_profile: Podemos ver aqui los perfiles que existan

- sysmail_account: Nos muestra las cuentas de correo electronico en nuestra base de datos.

- sysmail_mailitems: Un detalle de los correos electronicos enviados.

A modo de ejemplo vamos a ver una pequeña configuracion para ver como todo esto realmente funciona.

Paso 1: Setear un servidor SMTP

Comezamos por el Servidor de SMTP. El que yo uso es uno muy simple. Basicamente seteamos 3 cosas:

1.- La direccion de nuestro DNS (para poder mandar mails afuera de nuestra red). O sea a un yahoo, gmail, etc. Sino todos los mails van a ser internos. Esto lo podemos ver, en "detalles" de la lengueta "soporte" de nuestra conexion a internet



2.- Los dominios locales que le indican al servidor SMTP que no tiene que salir afuera de nuestra organizacion (red). Normalmente es el nombre de nuestra empresa, pero no necesariamente.












3.- Los usuarios (las cuentas) de este dominio interno. Y que le indica al servidor SMTP que no tiene que salir afuera.











Paso 2: Alta de perfiles y cuentas

Como explique al comienzo de esta nota... damos de alta algun perfil y asociamos algunas cuentas de correo.
Despues de hacer esto podriamos tener una configuracion como esta:



Aclaremos que los perfiles son nombres logicos que agrupan varias cuentas de correo. Aca a modo de empleo solo hice 2 perfiles y c/u tiene una sola cuenta de correo. Vemos tambien que los correos son internos dado que el dominio usado es tincho.com.ar (y es el mismo que usamos cuando configuramos en dominio interno en el servidor SMTP).


Paso 3: Envio de correo

Usando la store procedure sp_send_dbmail podemos enviar correos de base de datos. Esta sp tiene varios parametros (la mayoria opcionales)

sp_send_dbmail [ [ @profile_name = ] 'profile_name' ]     [ , [ @recipients = ] 'recipients [ ; ...n ]' ]     [ , [ @copy_recipients = ] 'copy_recipient [ ; ...n ]' ]     [ , [ @blind_copy_recipients = ] 'blind_copy_recipient [ ; ...n ]' ]     [ , [ @subject = ] 'subject' ]      [ , [ @body = ] 'body' ]      [ , [ @body_format = ] 'body_format' ]     [ , [ @importance = ] 'importance' ]     [ , [ @sensitivity = ] 'sensitivity' ]     [ , [ @file_attachments = ] 'attachment [ ; ...n ]' ]     [ , [ @query = ] 'query' ]     [ , [ @execute_query_database = ] 'execute_query_database' ]     [ , [ @attach_query_result_as_file = ] attach_query_result_as_file ]     [ , [ @query_attachment_filename = ] query_attachment_filename ]     [ , [ @query_result_header = ] query_result_header ]     [ , [ @query_result_width = ] query_result_width ]     [ , [ @query_result_separator = ] 'query_result_separator' ]     [ , [ @exclude_query_output = ] exclude_query_output ]     [ , [ @append_query_error = ] append_query_error ]     [ , [ @query_no_truncate = ] query_no_truncate ]     [ , [ @mailitem_id = ] mailitem_id ] [ OUTPUT ]

Aqui un ejemplo de un envio de correo :
sp_send_dbmail @profile_name ='CLAUDIO',@recipients = 'claudio@tincho.com.ar',@subject ='Listo el informe'

Paso 4: Consulta de correos

Consultando la tabla sysmail_sentitems podemos ver los correos enviados.






Algo increible es ver como esto funciona tambien a una cuenta de correo externa, como gmail. De la misma forma como enviamos el correo a la cuenta de claudio@tincho.com.ar podemos hacerlo a martinoscardeleo@gmail.com

Por ejemplo, escribiendo:

sp_send_dbmail @profile_name ='CLAUDIO', @recipients = 'martinoscardeleo@gmail.com',@subject ='Prueba de correo', @body = 'Esto funciona muy bien'


El servidor de SMTP entiende que es una cuenta externa, y la enruta a la direccion correcta. Una muestra de la casilla de martinoscardeleo@gmail.com muestra esto.


Donde trabajo, los usuarios envian correos electronicos a los mismos usuarios internos de la empresa. El sistema propio de la empresa gestiona esta tabla para que cada usuario pueda enviar y recibir correos de sus compañeros y supervisores. Resulta muy util.

Es bueno volver a aclarar que esto no funciona sino se tiene entre otras cosas permisos de ejecucion sobre la sp sp_send_dbmail El mensaje de error es:

Mens 229, Nivel 14, Estado 5, Procedimiento sp_send_dbmail, Línea 1
Se denegó el permiso EXECUTE en el objeto 'sp_send_dbmail', base de datos 'msdb', esquema 'dbo'.

Para ello hay el usuario tiene que ser miembro del rol DatabaseMailUserRole

Usamos la siguiente sp para darlo de alta :

sp_addrolemember 'DatabaseMailUserRole','nombre_del_user'

















jueves, 29 de abril de 2010

Hola ! Bienvenidos a mi blog !!!

En poco tiempo entre uds. y yo pondremos aqui nuestras inquietudes, nuestas ideas y porque no nuestros logoros. Todos los que formamos parte de este planeta SqlServer sabemos los dolores de cabeza y las alegrias que giran en torno a este tema.

La idea original es que "Este Lugar" sea la casa de todos !!!