Augusto Humire Martinez web blog

algo de web-in

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

dbm1el asistente nos guiara en el proceso de configuracion del database mail, como las imagenes hablan mas que las palabras, entonces vean las imagenes…

dbm2

dbm31

la siguiente ventana habilita la caracteristica para el envio de correo, por supuesto haga click en SI (Yes)

dbm41

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

dbm51

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

dbm61

dbm72

dbm8

dbm9

dbm10

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.

noviembre 30, 2008 - Posted by | Base de Datos

19 comentarios »

  1. 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

  2. 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

  3. 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

  4. 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

  5. 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

  6. !!! 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

  7. 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

  8. fue de muchisima utilidad!

    Comentario por Vivi | febrero 15, 2010

  9. 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

  10. Que tal muchas gracias, buen articulo,
    solo yo quiero que no me mande ese mjs de Mail queued

    Comentario por carlos | abril 25, 2011

  11. Muchas gracias por la ayuda…
    = )

    Comentario por Krajisejck | octubre 23, 2012

  12. Reblogged this on Nelson Amaya and commented:
    Enviar correo desde Sql Server

    Comentario por Nelson Amaya | febrero 8, 2013

  13. 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

  14. 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

  15. 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

  16. 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

  17. 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

  18. 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

  19. 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


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s

A %d blogueros les gusta esto: