Enviar correo desde Sql Server
Hace poco me tocó tener que informar acerca de unas fechas de vencimiento de ciertos eventos, y me pregunte como hacerlo facil y sin tener que inventarme mails senders, entonces se puede hacer con el procedimiento almacenado llamado sp_send_dbmail, y bueno la configuracion no complicada, solo saber que servidor de correos utilizar,
Configurar DataBase Mail
Abrir el management de sql server y configurar el database mail utilizando el asistente como se ve en la siguiente figura
el asistente nos guiara en el proceso de configuracion del database mail, como las imagenes hablan mas que las palabras, entonces vean las imagenes…
la siguiente ventana habilita la caracteristica para el envio de correo, por supuesto haga click en SI (Yes)
Creamos un nombre de perfil, podemos tener varios perfiles en el databse mail, eso nos permitira tener varias cuentas de correo para los diferentes objetivos en nuestros scripts
Presionando añadir(Add) crearemos la cuenta de mail en el database mail como se muestra en la imagen, atencion a este punto por que hasta aqui se necesita tener pleno conocimiento del servidor de correos que utlizaremos, necesitaremos tener datos como el nombre de smtp de nuestro servidor de correos que para todos los casos nuestros sera diferentes,
- nombre de cuenta (account name): representa el nombre de cuenta para el database mail
descripcion (description): representa la descripcion de la cuenta - Email address: es la direccion de correo
- Nombre a mostrar (Display name): es el nombre que se mostrara cuando el correo arrive
- Direccion de respuesta (Reply email): la direccion de correo a la cual se puede responder cuando el correo llegue a la bandeja del destinatario
- Server Name (Nombre del servidor): direccion del servidor de smtp el cual se encargara de enviar el correo, nomalmente los smtp usan el puerto 25, asi que ese numero 25 dejarlo tal cual se ve en la imagen, pero si la authenticación que el servidor tienes usa SSL entonces en lugar del puerto 25 use el 465 y marque la casilla que dice “Este servidor requiere una conexion segura SSL”
- Autenticacion basica (Basic authentication): sera su nombre de cuenta que dependiendo de su servidor de correo puede ser el nombre de cuenta solo (micorreo) o tal vez la direccion completa (micorreo@servidor.com) eso dependera de la autenticacion que administre su servidor de correos
Enviar Correo usando DataBase Mail
Para enviar el correo usamos un procedimiento almacenado llamado sp_send_dbmail
ejemplo
EXEC msdb.dbo.sp_send_dbmail @profile_name = 'Perfil1', @recipients = 'miotrocorreo@servidor.com', @body = 'La prueba funciono satisfactoriamente', @subject = 'Correo desde Sql Server' ; Donde:
- @profile_name es el nombre del perfil creado
- @recipients son las direcciones de correo a las que enviaremos, esta puede ser una o varias separadas por “;”
- @body es el texto o cuerpo del mensaje
- @subject es el asunto
Otro ejemplo
EXEC msdb.dbo.sp_send_dbmail @profile_name = 'Perfil1', @recipients = 'miotrocorreo@servidor.com', @query = 'SELECT COUNT(*) FROM AdventureWorks.Production.WorkOrder WHERE DueDate > ''2004-04-30'' AND DATEDIFF(dd, ''2004-04-30'', DueDate) < 2' , @subject = 'Work Order Count', @attach_query_result_as_file = 1 ;
Otro ejemplo mas
SET @tableHTML = N'<H1>Work Order Report</H1>' + N'<table border="1">' + N'<tr><th>Work Order ID</th><th>Product ID</th>' + N'<th>Name</th><th>Order Qty</th><th>Due Date</th>' + N'<th>Expected Revenue</th></tr>' + CAST ( ( SELECT td = wo.WorkOrderID, '', td = p.ProductID, '', td = p.Name, '', td = wo.OrderQty, '', td = wo.DueDate, '', td = (p.ListPrice - p.StandardCost) * wo.OrderQty FROM AdventureWorks.Production.WorkOrder as wo JOIN AdventureWorks.Production.Product AS p ON wo.ProductID = p.ProductID WHERE DueDate > '2004-04-30' AND DATEDIFF(dd, '2004-04-30', DueDate) < 2 ORDER BY DueDate ASC, (p.ListPrice - p.StandardCost) * wo.OrderQty DESC FOR XML PATH('tr'), TYPE ) AS NVARCHAR(MAX) ) + N'</table>' ; EXEC msdb.dbo.sp_send_dbmail @profile_name = 'Perfil1' @recipients='miotrocorreo@servidor.com', @body = @tableHTML, @body_format = 'HTML' @subject = 'Work Order List';
Bueno eso es todo, como veran eso de los correos usando sql server puede ayudar de manera siginificativa en tareas como envio de avisos, alertas, o reportes, la variedad en realidad podria ser infinita.
19 comentarios »
Responder
-
Recent
- Cambiar Collation a una columna
- Objetos de un esquema
- Encontrar una columna en SQL Server
- MSProject
- Regular Expressions utiles
- Obtener identity de un insert masivo o por lotes con output
- Como buscar un campo en la base de datos
- Como buscar texto en un procedimiento alamacenado
- Filas actualizadas o afectadas en un Update Sql Server
- Split in Sql Server
- RestFull con WCF y devolviendo JSON o XML
- Algunas expresiones utiles expresiones Lambda
-
Enlaces
-
Archivos
- agosto 2020 (2)
- diciembre 2019 (1)
- noviembre 2019 (1)
- octubre 2019 (1)
- mayo 2018 (2)
- diciembre 2015 (1)
- junio 2015 (1)
- agosto 2013 (1)
- mayo 2013 (1)
- abril 2013 (1)
- febrero 2013 (1)
- abril 2012 (1)
-
Categorías
-
RSS
Entries RSS
Comments RSS
Hola Augusto, gracias por el articulo me resulta muy util, pero mira tengo un problema… hice los pasos que describes… pero no me funciona… me dice el mensaje Mail queued.
Comentario por Ricardo | marzo 18, 2009
la palabra “Mail queued” quiere decir que el correo esta en cola, y eso quiere decir que el correo esta en la cola de envio, de todos modos fijate en el log, al cual puedes acceder presionando clic derecho en “Database Mail” y seleccionar “View database mail log (Ver log de mail)”, y fijete que te indica, si todo esta bien alli y no hay sintomas de error, entonces consulta con tu administrador de correo, probablemente no acepta conexiones externas.
saludos
Comentario por augustohumire | marzo 21, 2009
Muy bueno el articulo, he estado usando esta funcionalidad y trabaja bien solo que hay un incoveniente. Si por alguna razón el servicio de correo(exchange server) esta inhabilitado, aun asi el database mail pone al correo status “enviado”. Lo cual es hasta cierto punto correcto pero no quiere decir que se garantiza la entrega al destinatario(suponiendo claro que el servicio del correo del destinatario este funcionando correctamente)
Comentario por Guillermo Delgado | mayo 27, 2009
Mi problema se da cuando quiero usar el @query=’select * tabla1′)
No me funciona y me sale un error : El nombre del objeto ‘tabla1’ no es valido.
A pesar de que vario con otras tablas la consulta de prueba, me sale el mismo error.
Comentario por Mitchel | agosto 10, 2009
cuando haces el @query= ‘select * tabla1’, tienes q agregar la base de datos a la q pertenece y ademas el apartado dbo, ejemplo
@query = ‘select * mibase.dbo.tabla1’
Comentario por o IH A ID 3 S | septiembre 21, 2009
!!! Excelente Agusto !!! gracias por el aporte. Solo una consulta: Yo quiero enviar un archivo atachado pero me da el Mens. 22051, Nivel 16, Estado 1, Línea 0
El archivo adjunto C:\InfoSat.txt no es válido.
Cuando le pongo el parámetro:
@file_attachments = ‘C:\InfoSat.txt’;
Comentario por Cesar | septiembre 28, 2009
una consulta estoy utilizando el envio de correos por sql y me gustaria saber si con el parametro @attach_query_result_as_file
la salida del archivo en lugar de ser .txt puede ser .xls, u otro formato actualmente primero genero el archivo y luego lo atacho pero esto a veces demora mucho si el archivo generado contiene mucha info.
Gracias
Comentario por abarrera | enero 13, 2010
fue de muchisima utilidad!
Comentario por Vivi | febrero 15, 2010
Excelente, pero como configuro el Configurar DataBase Mail por T-sql y no por el asistente…?
Saludos.
Edward Ocando
Venezuela
Comentario por Edward Ocando | octubre 28, 2010
Que tal muchas gracias, buen articulo,
solo yo quiero que no me mande ese mjs de Mail queued
Comentario por carlos | abril 25, 2011
Muchas gracias por la ayuda…
= )
Comentario por Krajisejck | octubre 23, 2012
Reblogged this on Nelson Amaya and commented:
Enviar correo desde Sql Server
Comentario por Nelson Amaya | febrero 8, 2013
muy bueno el artículo, mi duda es como comprimir el archivo (y asignarle una constraseña) antes de mandarlo
Comentario por Anónimo | marzo 6, 2013
me sirvió mucho el artículo, mi duda es como comprimir el archivo antes de enviarlo y de ser posible como agregarle una contraseña…
Comentario por Ana | marzo 7, 2013
muy bueno el artículo!!, mi duda es como comprimir el archivo antes de enviarlo y como agregarle una contraseña…
Comentario por Ani | marzo 18, 2013
Esto funciona como todos los correos, se envia un adjunto, el adjunto puede ser o no un comprimido, pero eso no lo hace el mailsender, es decir si quieres comprimirlo te sugiero que lo comprimas ejecutando commandos con cmd antes de enviar el mail, por lo que respecta a “archivo con contraseña”, escapa a lo que el mailer de sql server hace, es decir no hace cosa semejante.
En resumen para la contraseña, en lugar de contraseña encripta tu archivo, para comprimir usa comandos de cmd y una vez que lo tengas adjuntalo, es metodo nada ortodoxo pero es una sugerencia.
Comentario por Augusto Humire Martinez | marzo 21, 2013
Hice todos los pasos en una instancia de pruebas y funcionó correctamente. Ahora que lo quiero realizar en la instancia real no me funciona. Al enviar el mail de prueba me genera este registro:
Exception Type: Microsoft.SqlServer.Management.SqlIMail.Server.Common.BaseException
Message: No se puede leer la información de configuración de correo de la base de datos.
Data: System.Collections.ListDictionaryInternal
TargetSite: Microsoft.SqlServer.Management.SqlIMail.Server.Objects.Account GetAccount(Int32)
HelpLink: NULL
Source: DatabaseMailEngine
StackTrace Information
===================
en Microsoft.SqlServer.Management.SqlIMail.Server.DataAccess.DataAccessAdapter.GetAccount(Int32 accountID)
en Microsoft.SqlServer.Management.SqlIMail.Server.Controller.CommandFactory.CreateSendMailCommand(DBSession dbSession)
en Microsoft.SqlServer.Management.SqlIMail.Server.Controller.CommandFactory.CreateCommand(DBSession dbSession)
en Microsoft.SqlServer.Management.SqlIMail.Server.Controller.CommandRunner.Run(DBSession db)
en Microsoft.SqlServer.Management.SqlIMail.IMailProcess.ThreadCallBack.MailOperation(Object o)
Agradezco tu ayuda!
Comentario por Anita | abril 4, 2013
Buenos días
como se configura para que una job de respaldo mande correo, en caso de que falle..
ya puedo mandar correos de mi servidor
podrás apoyarnos con este caso
Comentario por omar | noviembre 1, 2016
Hola, una pregunta que no es mi campo y no logro ver ningún ejemplo.
A mi me gustaría que el asunto del correo este basado en una query de los datos que se muestran en la tabla y no un texto fijo.
¿como se puede hacer eso?
Comentario por GGG | diciembre 19, 2019