El correo de la base de datos, como se podría esperar de su nombre, es una solución para poder enviar mensajes de correo electrónico desde el motor de base de datos de SQL Server a los usuarios. Utilizando Database Mail, las aplicaciones de base de datos pueden enviar mensajes de correo electrónico que por ejemplo pueden, contener resultados de consultas o simplemente alertar a un usuario sobre un evento que ocurrió en la base de datos.
El proceso para poder configurar el correo de base de datos contiene tres principales pasos. Para completar esto con éxito, necesitamos lo siguiente:
- crear una cuenta de correo de base de datos,
- crear un perfil de correo de base de datos,
- y configurar esos dos para trabajar juntos
Configurando el correo de la base de datos
Para que podamos crear el perfil de correo de base de datos, tendremos que usar el Asistente de configuración de correo de base de datos o el código T-SQL. Usar el Asistente de configuración es muy fácil, pero hay que tener en cuenta que el Correo de la base de datos está desactivado en las ediciones de SQL Server Express.
Por lo tanto, todo lo que tenemos que hacer es dirigirnos al Explorador de objetos, conectarnos a la instancia de SQL Server en la que queremos configurar el correo de la base de datos y expandir el árbol del servidor. Después, expanda el nodo Administración y haga doble clic en Correo de base de datos o haga clic con el botón derecho y elija Configurar correo de base de datos para abrir el Asistente de configuración de correo de base de datos:
Puesto que la edición de Microsoft SQL Server 2016 Express se usa en este artículo como ejemplo, el nodo de administración no tiene correo de base de datos:
Esto no quiere decir que no podamos usarlo porque no solo está disponible como interfaz, sino que aún está disponible en el Motor de base de datos de SQL Server. Solo necesitamos poder habilitarlo utilizando el T-SQL.
Para poder habilitar el correo de base de datos, ejecute el siguiente código:
1 2 3 4 5 6 |
sp_configure 'Database Mail XPs', 1; GO RECONFIGURE GO |
En este caso, hay que ejecutar el código que desencadenó un error:
Msg 15123, Level 16, State 1, Procedure sp_configure, Line 62 [Batch Start Line 0] La opción de configuración ‘Database Mail XPs ‘no existe, o puede ser una opción avanzada.
Esto podrá suceder de vez en cuando, porque esta es una opción avanzada. Para poder solucionar este problema, debemos cambiar el valor predeterminado de las opciones avanzadas de mostrar de 0 a 1.
Para ello ejecuta el siguiente código:
1 2 3 4 5 6 7 8 9 |
sp_configure 'show advanced options', 1; GO RECONFIGURE; GO sp_configure 'Database Mail XPs', 1; GO RECONFIGURE GO |
Esta vez, la consulta se ejecuta con éxito. Una vez que estas dos opciones se cambian de “0” a “1”, el correo de la base de datos se activa:
Ahora ya podemos volver a configurar el perfil de correo electrónico y poder agregar una cuenta de correo electrónico. Para poder hacer esto usaremos algunos procedimientos almacenados en la base de datos msdb.
Para lograr crear un nuevo perfil de correo de base de datos denominado “Notificaciones”, utilizaremos el procedimiento almacenado sysmail_add_profile_sp y el siguiente código:
1 2 3 4 5 |
-- Create a Database Mail profile EXECUTE msdb.dbo.sysmail_add_profile_sp @profile_name = 'Notifications', @description = 'Profile used for sending outgoing notifications using Gmail.' ; GO |
Para permitir otorgar permiso a un usuario o rol de la base de datos para usar este perfil de correo de base de datos, vamos a usar el procedimiento de almacenado sysmail_add_principalprofile_sp y el siguiente código:
1 2 3 4 5 6 |
-- Grant access to the profile to the DBMailUsers role EXECUTE msdb.dbo.sysmail_add_principalprofile_sp @profile_name = 'Notifications', @principal_name = 'public', @is_default = 1 ; GO |
Para poder crear una nueva cuenta de correo de base de datos con información sobre una cuenta SMTP, usaremos el procedimiento almacenado sysmail_add_account_sp y el código a continuación:
1 2 3 4 5 6 7 8 9 10 11 12 |
-- Create a Database Mail account EXECUTE msdb.dbo.sysmail_add_account_sp @account_name = 'Gmail', @description = 'Mail account for sending outgoing notifications.', @email_address = 'Use a valid e-mail address', @display_name = 'Automated Mailer', @mailserver_name = 'smtp.gmail.com', @port = 465, @enable_ssl = 1, @username = 'Use a valid e-mail address', @password = 'Use the password for the e-mail account above' ; GO |
Para que podamos agregar la cuenta de Correo de base de datos al perfil de Correo de base de datos, vamos a usar el procedimiento sysmail_add_profileaccount_sp stored y el siguiente código:
1 2 3 4 5 6 |
-- Add the account to the profile EXECUTE msdb.dbo.sysmail_add_profileaccount_sp @profile_name = 'Notifications', @account_name = 'Gmail', @sequence_number =1 ; GO |
Ejecute el código desde todos los procedimientos almacenados, y debería recibir el mensaje de que todo el código se ejecuta correctamente:
Si por alguna razón, la ejecución del código anterior devuelve un error, use el siguiente código para revertir los cambios:
1 2 3 4 |
EXECUTE msdb.dbo.sysmail_delete_profileaccount_sp @profile_name = 'Notifications' EXECUTE msdb.dbo.sysmail_delete_principalprofile_sp @profile_name = 'Notifications' EXECUTE msdb.dbo.sysmail_delete_account_sp @account_name = 'Gmail' EXECUTE msdb.dbo.sysmail_delete_profile_sp @profile_name = 'Notifications' |
Si algo sale mal, hay que ejecutar los procedimientos almacenados individualmente y esto podría ayudar a solucionar el problema. Solo hay que asegurarse de ejecutar el procedimiento almacenado ‘sysmail_add_profileaccount_sp’ después de que se cree la cuenta de la base de datos y se cree un perfil de la base de datos.
Configuración de prueba de correo de base de datos
Ahora que hemos configurado una cuenta de correo electrónico, ¿qué sigue? Bueno, enviemos un correo electrónico de prueba y veamos si funciona.
Como mencionamos anteriormente, podríamos enviar un correo electrónico para alertar a un usuario sobre un evento que ocurrió en la base de datos y esto es exactamente lo que haremos más adelante con un simple activador de DML. Pero ahora, enviemos un correo electrónico al destinatario especificado mediante el procedimiento almacenado sp_send_dbmail.
1 2 3 4 5 6 |
EXEC msdb.dbo.sp_send_dbmail @profile_name = 'Notifications', @recipients = 'Use a valid e-mail address', @body = 'The database mail configuration was completed successfully.', @subject = 'Automated Success Message'; GO |
La cuadrícula de resultados le mostrará el mensaje de que el correo electrónico está en cola y el número de identificación:
El código anterior debe enviar un correo electrónico usando el perfil que se creó anteriormente para un argumento @recipients especificado por el destinatario. El asunto y el cuerpo están especificados en los argumentos @body y @subject.
Bastante simple, ¿verdad? Bueno no exactamente. En este caso y en la mayoría de las situaciones en el mundo real, el correo no se enviará con éxito a pesar de que cada paso durante la configuración fue exitoso.
Solución de problemas de correo de base de datos
En este caso, el mensaje de correo electrónico se puso en cola correctamente, pero el mensaje nunca se entregó.
Lo primero es lo primero, hay que comprobar si el Correo de base de datos está habilitado ejecutando el siguiente código:
1 2 3 4 5 6 |
sp_configure 'show advanced', 1; GO RECONFIGURE; GO sp_configure; GO |
En la cuadrícula de resultados, asegúrese de que la columna “valor de ejecución” para Database Mail XPs esté establecida en 1:
Para poder enviar correos electrónicos, el usuario también tiene que ser miembro del rol del servidor DatabaseMailUserRole. Los miembros del roles fijos del servidor sysadmin y la función msdb db_owner son miembros automáticamente. Esto se puede verificar de forma muy fácil, yendo a Seguridad > Inicios de sesión, haga clic con el botón derecho en el usuario actual y seleccione Propiedades. En el cuadro de diálogo Propiedades de inicio de sesión, haga clic en la página “Funciones del servidor” y asegúrese de que la función del servidor “administrador de sistemas” esté marcada:
El sistema Database Mail registra la actividad del correo electrónico en la base de datos “msdb”. Para ver los mensajes de error devueltos por Database Mail, ejecute el siguiente código:
1 2 3 |
SELECT * FROM msdb.dbo.sysmail_event_log; |
La declaración devolverá los registros y, en un caso como el nuestro, cuando no se lleguen a entregar correos electrónicos, busque los errores en la columna “tipo de evento”:
Estos registros tienen todo tipo de información útil que podría ayudar en la resolución de problemas y, en especial, estamos interesados en la columna “descripción”, ya que contiene información detallada sobre el error y de todo lo que salió mal.
El primer error registrado dice:
2 error 2017-11-13 00:18:27.800 No se pudo enviar el correo a los destinatarios debido a un error en el servidor de correo. (Envío de correo con la cuenta 5 (2017-11-13T00: 18: 27). Mensaje de excepción: No se pueden enviar correos al servidor de correo. (El servidor SMTP requiere una conexión segura o el cliente no fue autenticado. La respuesta del servidor fue: 5.5. 1 Se requiere autenticación. Obtenga más información en).) 12092 1 NULL 2017-11-13 00: 18: 27.800 sa
No obstante, esta información no será útil a menos que haya alguna documentación, por ejemplo, en la biblioteca de TechNet. Hay un artículo sobre Solución de problemas del Correo electrónico de base de datos que proporciona información para que los usuarios aíslen y corrijan rápidamente los problemas comunes con el Correo electrónico de base de datos, pero al revisar la documentación no fue útil en este caso y genero una pérdida de tiempo sin tener éxito.
Otro mensaje que se registró de este tipo fue:
28 error 2017-11-14 16: 20: 01.107 No se pudo enviar el correo a los destinatarios debido a un error en el servidor de correo. (Envío de correo usando la Cuenta 6 (2017-11-14T16: 20: 01). Mensaje de excepción: No se pueden enviar correos al servidor de correo. (Error al enviar el correo.).) 14452 8 NULL 2017-11-14 16: 20: 01.107 sa
El problema, por lo general, no está relacionado con el Correo electrónico de la base de datos y su funcionalidad. Sino que los mensajes de descripción de error no están predefinidos en el motor de SQL Server. Esto explica la documentación faltante de Microsoft. Estos mensajes suelen ser respuestas de autenticación de los servidores SMTP que se requieren antes de permitir el acceso a los servicios de correo.
Para poder solucionar este problema aún más, tenemos que tomar el problema desde otra perspectiva.
Hasta ahora en la resolución de problemas hemos verificado los siguientes pasos generales:
- El correo de la base de datos se encuentra habilitado
- El usuario está configurado correctamente para enviar correo de base de datos
- El envío de un correo electrónico de prueba no funciona
- No se pudo encontrar documentación de la biblioteca de TechNet para los mensajes de registro de errores
Si tomamos otro enfoque podría ser el configurar la cuenta de correo electrónico utilizada para enviar notificaciones salientes en otro cliente de correo electrónico como Microsoft Outlook. Esto tendrías que ser bastante simple, ya que tanto Gmail como MS Outlook son servicios bien conocidos que deberían funcionar juntos y la documentación en línea está disponible en los sitios web oficiales.
Para usar la cuenta de Gmail con MS Outlook, debemos configurarlo para que funcione con POP3 o IMAP.
Inicie sesión en su cuenta de Gmail en www.gmail.com y haga clic en Configuración en la esquina superior derecha:
Elija la pestaña de Reenvío y POP / IMAP en la parte superior de la página:
En la sección Acceso a IMAP, asegúrese de que la opción Habilitar IMAP esté seleccionada y haga clic en el enlace de Instrucciones de configuración en la parte inferior:
Esto abrirá una página web de instrucciones sobre cómo podemos configurar IMAP. Omita el primer paso porque ya verificamos que IMAP está activado.
Ejecute el Outlook client para agregar una cuenta de correo electrónico de Gmail. Una vez que se abra Outlook, tiene que hacer clic en la pestaña Archivo y seleccione Agregar cuenta:
En el cuadro de diálogo Agregar cuenta, hay que seleccionar la opción Configuración manual o tipos de servidor adicionales y haga clic en el botón Siguiente:
En el siguiente paso, tiene que elegir la opción POP o IMAP y haga clic en el botón Siguiente:
Use la información de la tabla a continuación para poder configurar el Outlook client con la configuración correcta:
Incoming Mail (IMAP) Server |
imap.gmail.com
Requires SSL: Yes Port: 993 |
Outgoing Mail (SMTP) Server |
smtp.gmail.com
Requires SSL: Yes Requires TLS: Yes (if available) Requires Authentication: Yes Port for SSL: 465 Port for TLS/STARTTLS: 587 |
En la sección Información del usuario, asegúrese de ingresar una dirección de correo electrónico que sea válida. La dirección de correo electrónico ingresada se establecerá automáticamente como el Nombre de usuario para la Información de inicio de sesión una vez que se seleccione el Tipo de cuenta en el cuadro desplegable. Una vez que haya esto se haya terminado, haga clic en el botón Más configuraciones a la derecha para configurar las configuraciones adicionales antes de poder continuar:
Esto generara el diálogo de configuración de correo electrónico de Internet. Deja todo como está en la pestaña General. A continuación, tiene que hacer clic en la pestaña Servidor de salida, marque la casilla de verificación de Mi servidor de salida (SMTP) requiere autenticación y hay que seleccionar la opción Usar misma configuración que mi servidor de correo entrante:
Vaya a la pestaña de Avanzado. Una vez más, tiene que usar la información de la tabla anterior para configurar los números de puerto del servidor. Establezca el servidor entrante (IMAP) en 993 y el servidor saliente (SMTP) en 465. En los cuadros desplegables, seleccione el tipo de conexión cifrada SSL/ TLS para los servidores IMAP y SMTP. Deje todo el resto como está y haga clic en el botón Aceptar para confirmar la configuración:
Es ahora el momento de poder probar la configuración de la cuenta de correo electrónico para poder verificar que las entradas sean correctas. Haga clic en el botón Siguiente y esto va a abrir dos cuadros de diálogo de adición. En el primer diálogo, Outlook realizará dos tareas:
- Inicie sesión en el servidor de correo entrante (IMAP)
- Enviar mensaje de correo electrónico de prueba
Este paso es crucial ya que anteriormente esta tarea falló para el Correo de base de datos. En el segundo cuadro de diálogo, Outlook le va a pedir el nombre de usuario y la contraseña. Esto ya estaba configurado, opcionalmente tiene que marcar la opción Guardar esta contraseña en su paleta de contraseña, si su cuenta de usuario de Windows está protegida por contraseña, y ninguna otra persona tiene acceso a ella:
Nota: El cuadro de diálogo de credenciales puede que aparezca más de una vez. Solamente haga clic en el botón Aceptar cada vez, hasta que el servidor deje de solicitar información de inicio de sesión. Esto suele pasar cuando algo no está configurado de forma correcta, como por ejemplo. Nombre de usuario o contraseña, números de puerto, etc.
En este caso, la primera tarea falló y el envío del mensaje de correo electrónico de prueba también falló justo después:
Algunas de las aplicaciones y dispositivos utilizan una tecnología de inicio de sesión menos segura y esto hace que sus respectivas cuentas sean más vulnerables y Gmail las va a bloquear estas solicitudes de inicio de sesión. De forma predeterminada, el acceso para estas aplicaciones está desactivado, pero a su vez podemos activar el acceso para poder usarlas a pesar de los riesgos. En este caso también tenemos que hacerlo.
Este problema se puede resolver iniciando sesión en la cuenta de Gmail y asegurándose de que la opción Menos aplicaciones seguras esté habilitada para la cuenta deseada. Vaya a la sección Aplicaciones menos seguras de la cuenta de Gmail y habilite el acceso para aplicaciones menos seguras.
Nota: esta configuración no está disponible para cuentas que tienen la verificación de 2 pasos habilitada. Estas cuentas requieren una contraseña específica de la aplicación para un acceso menos seguro a las aplicaciones.
Como esta cuenta tiene habilitada la verificación de 2 pasos, debemos primero desactivarla para poder continuar.
Diríjase a la sección ‘Iniciar sesión y seguridad’ de Mi cuenta, hay que seleccionar la Verificación en 2 pasos, tiene que iniciar sesión con sus credenciales e ingrese el código de verificación si se le solicita, lo recibirá por mensaje de texto con un código de verificación de 6 dígitos o una llamada telefónica, y haga clic en la tecla de apagado:
Ahora, aparecerá un cuadro de diálogo emergente que informa al usuario sobre la seguridad y la vulnerabilidad. Nosotros somos conscientes de esto, así que solamente haga clic en el botón Apagar para continuar:
Ahora ya podemos volver a la sección de aplicaciones Menos seguras y poder permitir el acceso a aplicaciones menos seguras:
Vuelta al Outlook y haga clic en el botón Siguiente una vez más para poder probar la configuración de la cuenta de correo electrónico y, finalmente, se generará un mensaje sin errores. Entonces ambas tareas se completaron con éxito:
El mensaje de correo electrónico de prueba también se entregó con éxito, Esto significa que el envío de otro correo electrónico de prueba desde el Correo de base de datos debería también funcionar esta vez:
Ya que solo hay una manera de descubrirlo. Vuelva a SSMS y ejecute el código para poder enviar el correo electrónico de prueba:
1 2 3 4 5 6 |
EXEC msdb.dbo.sp_send_dbmail @profile_name = 'Notifications', @recipients = 'Use a valid e-mail address', @body = 'The database mail configuration was completed successfully.', @subject = 'Automated Success Message'; GO |
Lamentablemente, incluso después de todo este problema, el correo electrónico de prueba no está llegando. Le damos una mirada rápida a los archivos de registro y nos muestra otro mensaje de error de otro tipo:
51 error 2017-11-18 16: 21: 22.803 No se pudo enviar el correo a los destinatarios debido a un error en el servidor de correo. (Envío de correo con la cuenta 10 (2017-11-18T16: 21: 22). Mensaje de excepción: No se pueden enviar correos al servidor de correo. (Error al enviar correo).) 3564 14 NULL 2017-11-18 16: 21: 22.803 sa
En este caso, veamos de forma rápida para poder asegurarnos de que el perfil de correo electrónico esté configurado de la misma forma que para Outlook. Ejecuta el código desde abajo:
1 2 3 4 5 6 7 |
SELECT [sysmail_server].[account_id], [sysmail_account].[name] AS [Account Name], [servertype], [servername] AS [SMTP Server Address], [Port] FROM [msdb].[dbo].[sysmail_server] INNER JOIN [msdb].[dbo].[sysmail_account] ON [sysmail_server].[account_id] = [sysmail_account].[account_id]; |
Esto devolverá la configuración del nombre de la cuenta, el tipo de servidor, la dirección del servidor y el número de puerto:
Todo se ve bien hasta ahora, pero el correo electrónico sigue sin salir. Una rápida búsqueda en línea acerca del mensaje de error nos conduce a un hilo de desbordamiento en el que un usuario tiene exactamente el mismo mensaje de error. En la sección de comentarios, otro usuario dice que al cambiar el número de puerto a 587 en lugar de 465, aunque la información de Gmail dice lo contrario, eso llego a solucionar el problema para él. Como hasta ahora nos estamos quedando sin opciones, probemos eso y veamos qué es lo que pasa.
Usaremos el procedimiento de almacenado sysmail_update_account_sp para poder cambiar el número de puerto en la cuenta de correo de base de datos existente.
Ejecuta el siguiente código:
1 2 3 4 |
EXECUTE msdb.dbo.sysmail_update_account_sp @account_name = 'Gmail', @port = 587; GO |
Ejecute el código del paso anterior para poder verificar que se aplique el cambio. El número de puerto cambiará dejando intacta toda otra información de la cuenta:
Por alguna razón la cual no puedo explicar, las instrucciones de configuración para SSL proporcionadas por Google no funcionan en el puerto 465 para el sistema de Correo de base de datos, pero el puerto 587 que se especifica para TLS / STARTTLS funcionó a la perfección.
A fin de cuentas, después de intentarlo nuevamente, hay un nuevo correo electrónico en la bandeja de entrada de enviados desde el sistema de Correo de base de datos:
Enviar correo electrónico desde un disparador
Para poder demostrar cómo se puede enviar una notificación por correo electrónico a un usuario cuando ocurre un evento específico en la base de datos, podemos crear un disparador simple.
Use el siguiente código a continuación para poder crear un activador llamado iProductNotification en la tabla de productos que se encuentra en el esquema de producción:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
USE AdventureWorks2014 GO IF OBJECT_ID ('Production.iProductNotification', 'TR') IS NOT NULL DROP TRIGGER Purchasing.iProductNotification GO CREATE TRIGGER iProductNotification ON Production.Product FOR INSERT AS DECLARE @ProductInformation nvarchar(255); SELECT @ProductInformation = 'A new product, ' + Name + ', is now available for $' + CAST(StandardCost AS nvarchar(20)) + '!' FROM INSERTED i; EXEC msdb.dbo.sp_send_dbmail @profile_name = 'Notifications', @recipients = 'Use a valid e-mail address', @body = @ProductInformation, @subject = 'New product notification' GO |
Este desencadenador se activará el momento que se ejecute una instrucción Insertar en la tabla Producto. La idea detrás de todo esto es el poder recopilar información básica sobre un nuevo producto que esté disponible como el nombre, el precio y resumir esa información en un simple mensaje de correo electrónico que se enviará a las direcciones deseadas utilizando el perfil de correo de base de datos anteriormente configurado:
Una vez que se ya crea el activador, actualice el nodo “Desencadenadores” debajo de la tabla “Producto” solo para poder asegurarse de que el activador se cree en la tabla derecha:
En lugar de escribir el código para la sentencia Insertar y porque es más fácil, use la opción “Editar las 200 filas más importantes” en el menú contextual de la derecha con el disparador. Además, complete alguna información como, trabajar con hojas de cálculo Excel. Una vez que haya hecho esto, pulse la tecla Enter para continuar:
Esto generará una sentencia Insertar en el fondo y disparará el desencadenador. Como resultado, el activador recopilará cierta información sobre la sentencia de inserción, solicitará el perfil de correo de la base de datos y lo usará para poder enviar un correo electrónico al destinatario deseado:
Enviar mensaje de correo electrónico de resultados de una consulta
Otro ejemplo podríamos probar en enviar un mensaje de correo electrónico que contenga los resultados de la consulta. Ejecuta el siguiente código:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
EXEC msdb.dbo.sp_send_dbmail @profile_name = 'Notifications', @recipients = 'Use a valid e-mail address, @query = 'USE AdventureWorks2014; GO SELECT Name, ProductNumber, ListPrice AS Price FROM Production.Product WHERE ProductLine = ''R'' AND DaysToManufacture < 4 ORDER BY Name ASC; GO', @subject = 'Product list', @attach_query_result_as_file = 1; |
Esta sentencia Seleccionar nos devuelve una lista de productos con una condición específica en mente:
Pero lo más importante es que nos envía un correo electrónico con los resultados de esa sentencia Seleccionar como un archivo adjunto a los destinatarios del correo electrónico:
Y si abrimos el archivo adjunto, ahí se encuentra, el resultado de nuestra consulta:
Deseo que hayas encontrado útil este artículo. ¡Y que seas feliz enviando un correo electrónico!