Como lo hacemos.... 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
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'
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'
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'