miércoles, 1 de abril de 2009

Enviar correo con SQL SERVER (sin SQLMail)

Enviar correos desde SQL SERVER 2000 sin utilizar SQLMail es posible. Se logra utilizando CDONTS.

Lo que tenemos que hacer, es crear un objeto CDO.Message, confirgurar las propiedades tal y como lo haríamos si lo fueramos a utilizar desde una página ASP y enviar el mensaje. El siguiente codigo fuente comentarizado detalla el proceso de configuración y envío.

*** Nota: Tenemos la limitante de CDONTS, máximo 4000 caracteres en el mensaje.

Codigo fuente

CREATE PROCEDURE usp_EnviarCorreo

(

@De varchar(100),

@Para varchar(100),

@Titulo varchar(100),

@Mensaje varchar(4000),

@TipoMensaje varchar(50) -- 'HTMLBody' ó 'TextBody'

)

AS


DECLARE @ObjMensaje int,

@RC int,

@Fuente varchar(255),

@Descripcion varchar(500),

@MsjSalida varchar(1000),

@Servidor varchar(100),

@Puerto varchar(10),

@Autenticar char(1),

@Usuario varchar(100),

@Password varchar(100)


-- Aqui ahi que cambiar los valores por los reales de la cuenta a usar


SET @Autenticar = '1' -- Manda a autentificarse con una cuenta y password

SET @Servidor = 'TuServidor' -- Nombre de host o IP

SET @Usuario = 'TuUsuario' -- Nombre de usuario, en los servidores POP puede ser la direccion de correo completa

SET @Password = 'TuPassword' -- Password de la cuenta de correo

SET @Puerto = 'TuPuerto' -- Puerto de correo, normalmente es el 25, aunque esto puede cambiar dependiendo del ISP


-- Crear el objeto CDO.Message

EXEC @RC = sp_OACreate 'CDO.Message', @ObjMensaje OUT


-- Configurar el SMTP remoto

EXEC @RC = sp_OASetProperty @ObjMensaje, 'Configuration.fields("http://schemas.microsoft.com/cdo/configuration/sendusing").Value','2'

-- Set: Servidor

EXEC @RC = sp_OASetProperty @ObjMensaje, 'Configuration.fields("http://schemas.microsoft.com/cdo/configuration/smtpserver").Value', @Servidor

-- Set: Puerto

EXEC @RC = sp_OASetProperty @ObjMensaje, 'Configuration.fields("http://schemas.microsoft.com/cdo/configuration/smtpserverport").Value', @Puerto

-- Set: Autenticacion

EXEC @RC = sp_OASetProperty @ObjMensaje, 'Configuration.fields("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate").Value', @Autenticar

-- Set: Usuario

EXEC @RC = sp_OASetProperty @ObjMensaje, 'Configuration.fields("http://schemas.microsoft.com/cdo/configuration/sendusername").Value', @Usuario

-- Set: Password

EXEC @RC = sp_OASetProperty @ObjMensaje, 'Configuration.fields("http://schemas.microsoft.com/cdo/configuration/sendpassword").Value', @Password

-- Guardar cambios

EXEC @RC = sp_OAMethod @ObjMensaje, 'Configuration.Fields.Update', null


-- Parametros del correo:


-- Para:

EXEC @RC = sp_OASetProperty @ObjMensaje, 'To', @Para

-- De:

EXEC @RC = sp_OASetProperty @ObjMensaje, 'From', @De

-- Titulo:

EXEC @RC = sp_OASetProperty @ObjMensaje, 'Subject', @Titulo

-- Tipo de mensaje y mensaje:

EXEC @RC = sp_OASetProperty @ObjMensaje, @TipoMensaje, @Mensaje


-- Enviar el correo:

EXEC @RC = sp_OAMethod @ObjMensaje, 'Send', NULL



-- Obtener el mensaje de salida, tanto por éxito como por error.

IF ( @RC <> 0 )

BEGIN

EXEC @RC = sp_OAGetErrorInfo NULL, @Fuente OUT, @Descripcion OUT

IF ( @RC = 0 )

BEGIN

SET @MsjSalida = 'Error enviando el mensaje, Fuente:' +

@Fuente + ', Descripcion: ' + @Descripcion

END

ELSE

BEGIN

SET @MsjSalida = 'Error enviando el mensaje. Error obteniendo información de la falla'

END

END

ELSE

BEGIN

SET @MsjSalida = 'Envío realizado'

END


-- Limpiar el objeto

EXEC @RC = sp_OADestroy @ObjMensaje


-- Mostrar el mensaje

SELECT @MsjSalida


GO



No debes olvidar cambiar los valores de servidor, usuarios, password y puerto por los de la cuenta que desees usar. Nos leemos en la próxima entrega. Happy Mailing.

2 comentarios:

  1. gracias,,, muy buen aporte, me salvastes,,,mas q un agradecimiento un verdadero gesto de gratitud

    ResponderEliminar
  2. Muchas gracias, muy bueno el aporte, solo tengo una duda, el correo me lo envia, pero estoy buscando la forma que en lugar de un mensaje escrito sea el resultado de una consulta, es decir tengo un query que me devuelve "n" registros y quiero mandar ese resultado de la consulta como mensaje. Al realizarlo envia el mensaje pero llega el mensaje con texto "0".

    Alguna observación al respecto..

    Gracias...

    ResponderEliminar