Cómo enviar mensajes de correo electrónico sin utilizar SQL Mail en SQL Server

Seleccione idioma Seleccione idioma
Id. de artículo: 312839 - Ver los productos a los que se aplica este artículo
Este artículo se publicó anteriormente con el número E312839
Expandir todo | Contraer todo

En esta página

Resumen

SQL Mail proporciona una manera sencilla de enviar y leer correo electrónico desde SQL Server. Sin embargo, puesto que SQL Mail es una aplicación MAPI, en el servidor debe estar presente un subsistema MAPI. Microsoft Windows NT 4.0 instala un subsistema MAPI cuando se instala Mensajería de Windows. Sin embargo, Microsoft Windows 2000 no proporciona un subsistema MAPI. Por tanto, si desea utilizar SQL Mail debe instalar un cliente MAPI como Microsoft Outlook.

Puede utilizar otros métodos para enviar directamente correo electrónico del Protocolo simple de transferencia de correo (SMTP) desde SQL Server. Por ejemplo, puede utilizar Collaboration Data Objects para NT Server (CDONTS) o Collaboration Data Objects para Windows 2000 (CDOSYS) junto con los procedimientos almacenados sp_OA de Automatización OLE de SQL Server. Este artículo contiene ejemplos de cómo utilizar estas técnicas para enviar correo electrónico a un servidor de correo Internet. Puede modificar las técnicas para proporcionar un sistema de correo más robusto. Por ejemplo, quizás desee agregar código de control de errores. Los métodos de los ejemplos no proporcionan ningún medio para leer o procesar correo electrónico.

Nota:
CDOSYS está disponible a partir de Windows 2000 y recomendamos que utilice CDOSYS en lugar de CDONTS. CDONTS no es compatible con Windows Server 2003 y sistemas operativos posteriores.

Nota:
Estos ejemplos de programación ilustran técnicas que puede utilizar para invocar el modelo de objetos de CDO en Transact-SQL. Usted es responsable de cualquier extensión de programación de los ejemplos o de cualquier prueba de esfuerzo necesaria para ejecutar el código en un entorno de producción.

Microsoft proporciona ejemplos de programación con fines ilustrativos únicamente, sin ninguna garantía tanto expresa como implícita. Esto incluye, entre otras, las garantías implícitas de comerciabilidad e idoneidad para un fin determinado. En este artículo se da por supuesto que ya conoce el lenguaje de programación que se muestra, así como las herramientas empleadas para crear y depurar procedimientos. Los profesionales de soporte técnico de Microsoft pueden explicarle la funcionalidad de un determinado procedimiento, pero no modificarán estos ejemplos para ofrecer mayor funcionalidad ni crearán procedimientos adaptados a sus necesidades específicas.

Cómo utilizar CDO para Microsoft Windows NT Server (CDONTS)

CDONTS es un servidor OLE específico del Protocolo simple de transferencia de correo (SMTP) diseñado específicamente para proporcionar funcionalidad de mensajería a las aplicaciones basadas en Web. Como tal, CDONTS permite el envío de correo electrónico basado en HTML. Las aplicaciones basadas en MAPI, como SQL Mail, no lo permiten. De forma predeterminada, Microsoft Internet Information Server (IIS) 4.0 o posterior instala CDONTS. De forma predeterminada, Microsoft Windows 2000 instala Microsoft Internet Information Server (IIS) 5.0.

Para obtener más información acerca de CDONTS, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
177850 Diferencia entre CDO 1.2 y CDONTS
CDONTS envía el correo electrónico al servidor local a través de SMTP. Si no tiene un servidor SMTP en su servidor local, puede utilizar el servidor virtual SMTP que IIS instala para enrutar el correo electrónico SMTP al servidor de correo SMTP adecuado. Si desea utilizar CDONTS para enviar correo electrónico desde SQL Server, siga estos pasos:
  1. Instale y ejecute IIS en el equipo con SQL Server.
  2. Designe su servidor de correo SMTP como "host inteligente" para que el Servicio SMTP de IIS enrute automáticamente cualquier mensaje de correo electrónico SMTP que se envíe al servidor local hacia el servidor de correo SMTP para entregarse.
  3. Cree un procedimiento almacenado en SQL Server que pueda utilizar para enviar correo electrónico.
Cuando se utiliza CDONTS en lugar de SQL Mail, no es necesario tener un cliente de correo como Microsoft Outlook instalado en el equipo donde se ejecuta SQL Server. Tampoco hay que tener un servidor de Microsoft Exchange. Como "host inteligente" puede utilizar cualquier servidor de correo que admita correo electrónico SMTP. Sin embargo, no puede leer ni procesar el correo electrónico enviado al equipo que ejecuta SQL Server utilizando CDONTS. Tampoco puede reemplazar la funcionalidad de SQL Agent Mail.

Las instrucciones siguientes están concebidas para Microsoft Windows 2000. Si IIS 4.0 está instalado en el equipo, puede configurar Microsoft Windows NT 4.0 de manera similar. Sin embargo, los pasos diferirán ligeramente.

Para obtener más información acerca de cómo configurar el "host inteligente" en Microsoft Windows NT 4.0, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
230235 Cómo configurar el servicio SMTP de IIS para retransmitir correo SMTP

Configurar el host inteligente

  1. Haga clic en Inicio, seleccione Programas, Herramientas administrativas y, a continuación,
    haga clic en Administrador de servicios Internet para abrir el Administrador de IIS.
  2. Abra el árbol correspondiente a su servidor. Haga clic con el botón secundario del mouse (ratón) en Servidor virtual SMTP predeterminado y, a continuación, haga clic en Propiedades.
  3. Busque la ficha Entrega y haga clic en Opciones avanzadas.
  4. Escriba el nombre de su servidor de correo SMTP en el cuadro de texto Host inteligente. Si no conoce el nombre del servidor de correo SMTP, póngase en contacto con el administrador de correo.
  5. Asegúrese de que el servicio Protocolo simple de transferencia de correo (SMTP) está en ejecución. El servicio SMTP forma parte del servicio de administración de IIS. Por tanto, el servicio de administración de IIS también debe estar en ejecución.

Crear un procedimiento almacenado para enviar correo electrónico CDONTS

Nota: las compañías, organizaciones, productos, nombres de dominio, direcciones de correo electrónico, logotipos, personas, lugares y acontecimientos descritos en este artículo son ficticios. No se pretende indicar ni debe deducirse ninguna asociación con compañías, organizaciones, productos, nombres de dominio, direcciones de correo electrónico, logotipos, personas, lugares o acontecimientos reales.

Puede utilizar código similar al siguiente para crear un procedimiento almacenado en la base de datos que envíe correo electrónico utilizando los procedimientos almacenados de Automatización OLE de SQL Server para invocar el modelo de objetos CDONTS.

 CREATE PROCEDURE [dbo].[sp_send_cdontsmail] 
@From varchar(100),
@To varchar(100),
@Subject varchar(100),
@Body varchar(4000),
@CC varchar(100) = null,
@BCC varchar(100) = null
AS
Declare @MailID int
Declare @hr int
EXEC @hr = sp_OACreate 'CDONTS.NewMail', @MailID OUT
EXEC @hr = sp_OASetProperty @MailID, 'From',@From
EXEC @hr = sp_OASetProperty @MailID, 'Body', @Body
EXEC @hr = sp_OASetProperty @MailID, 'BCC',@BCC
EXEC @hr = sp_OASetProperty @MailID, 'CC', @CC
EXEC @hr = sp_OASetProperty @MailID, 'Subject', @Subject
EXEC @hr = sp_OASetProperty @MailID, 'To', @To
EXEC @hr = sp_OAMethod @MailID, 'Send', NULL
EXEC @hr = sp_OADestroy @MailID

A continuación, utilice el procedimiento almacenado que creó y proporcione los parámetros correctos:
exec sp_send_cdontsmail 'alguien@example.com','alguien2@example.com','Prueba de CDONTS','Funciona'
Nota: sólo podrán ejecutar los procedimientos almacenados de Automatización OLE los miembros de la función de servidor fija sysadmin. Si el usuario de SQL Server no es miembro de la función fija sysadmin del servidor, no puede utilizar el procedimiento almacenado que se menciona en el ejemplo para enviar correo electrónico. En este caso, tendrá que desarrollar una aplicación cliente para enviar correo electrónico con CDONTS. Por ejemplo, puede utilizar una aplicación de Microsoft Visual Basic.

CDONTS envía el correo electrónico al servidor virtual SMTP local. El servidor enruta a continuación el correo electrónico al servidor de correo SMTP que se especifica en el cuadro de texto Host inteligente. El servidor de correo SMTP envía el correo a la dirección de correo electrónico que se especifica en el argumento To: argument ("alguien2@example.com" en el ejemplo). El nombre que se especifica en el argumento From:
aparece como remitente del mensaje de correo electrónico ("alguien@example.com" en este ejemplo) con el asunto "Prueba de CDONTS" y el mensaje "Funciona" como cuerpo del mensaje de correo electrónico. No se incluye a nadie en la copia del mensaje de correo electrónico porque no proporcionó ningún argumento para los campos CC o BCC.

Puede modificar el ejemplo para que envíe correo electrónico basado en HTML o datos adjuntos. Para ver documentación acerca de CDONTS, visite el siguiente sitio Web de Microsoft:
http://msdn.microsoft.com/library/SPA/
En el panel izquierdo, expanda sucesivamente Messaging and Collaboration, Collaboration Data Objects y CDO 1.2.1.

Puede encontrar documentación de los procedimientos almacenados de Automatización OLE de SQL Server en los Libros en pantalla de SQL Server 2000.

Cómo utilizar CDO para Microsoft Windows 2000 (CDOSYS)

CDOSYS proporciona un modelo de objetos para desarrollar aplicaciones de mensajería en Microsoft Windows 2000. También proporciona funcionalidad mejorada con respecto a la biblioteca existente de CDO para Windows NT Server (CDONTS). CDOSYS requiere Windows 2000 y un servidor SMTP local o remoto.

Puede configurar CDOSYS para que mediante programación señale a servidores SMTP para proporcionar flexibilidad a los programadores a la hora de configurar servidores SMTP.

Para obtener más información acerca de CDOSYS, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
195683 Relación existente entre las bibliotecas de CDO 1.x y CDOSYS.DLL
Puesto que CDOSYS puede enviar correo electrónico a un servidor SMTP remoto, CDOSYS no requiere que tenga Internet Information Server instalado y en ejecución en el equipo con SQL Server. Tampoco tiene que configurar el servidor virtual SMTP. Basta con crear un procedimiento almacenado en SQL Server que pueda utilizar para enviar correo electrónico.

Cuando se utiliza CDOSYS en lugar de SQL Mail, no es necesario tener un cliente de correo como Microsoft Outlook instalado en el equipo donde se ejecuta SQL Server. Tampoco tiene que tener un servidor de Exchange. Se puede utilizar como servidor de correo SMTP remoto cualquier servidor de correo compatible con el correo SMTP. Sin embargo, no puede leer ni procesar el correo electrónico enviado a SQL Server si utiliza CDOSYS. Tampoco puede reemplazar la funcionalidad de SQL Agent Mail.

El uso de CDOSYS con el objeto de Automatización OLE de SQL Server utiliza la Automatización OLE de SQL Server para invocar el modelo de objetos de CDOSYS. Se ha probado con el Service Pack 1 (SP1) y con el Service Pack 2 (SP2) de SQL Server 2000. Microsoft no garantiza que pueda llamar a CDOSYS desde los procedimientos almacenados de Automatización OLE en las versiones de SQL Server anteriores al Service Pack 1.

Crear un procedimiento almacenado para enviar correo CDOSYS

Puede utilizar código similar al siguiente para crear un procedimiento almacenado en la base de datos que envíe correo electrónico utilizando los procedimientos almacenados de Automatización OLE de SQL Server para invocar el modelo de objetos CDOSYS.

En este ejemplo proporcionamos un grado opcional de control de errores para comprobar el hresult de cada instrucción EXEC sp_OA*. Si el hresult (@hr) es cero, la instrucción sp_OA* anterior se ejecutó correctamente. Sin embargo, si hresult es distinto de cero, la instrucción sp_OA* anterior produjo un error.

Por cada error de hresult distinto de cero se inserta una fila en la tabla [dbo].[cdosysmail_failures] que registra el lugar y la hora del error. Además, el último error se interpreta utilizando el procedimiento almacenado sp_OAGetErrorInfo para informar del origen y la descripción del error. Esa descripción del error se imprime en la conexión del cliente. Además, esa descripción, la hora y el lugar del error se insertan en la tabla [dbo].[cdosysmail_failures] de la base de datos para que pueda identificar y diagnosticar los errores después de que se hayan producido.

Si el propio procedimiento almacenado sp_OAGetErrorInfo produce un error, el ejemplo imprime el mensaje de error siguiente en la conexión del cliente:

error en sp_OAGetErrorInfo
-- drop old cdosysmail_failures table if exists
IF (EXISTS (SELECT * FROM dbo.sysobjects WHERE name = N'cdosysmail_failures' AND type='U')) DROP TABLE [dbo].[cdosysmail_failures]
GO
-- Create new cdosysmail_failures table
CREATE TABLE [dbo].[cdosysmail_failures]
		([Date of Failure] datetime, 
		[Spid] int NULL,
		[From] varchar(100) NULL,
		[To] varchar(100) NULL,
		[Subject] varchar(100) NULL,
		[Body] varchar(4000) NULL,
		[iMsg] int NULL,
		[Hr] int NULL,
		[Source of Failure] varchar(255) NULL,
		[Description of Failure] varchar(500) NULL,
		[Output from Failure] varchar(1000) NULL,
		[Comment about Failure] varchar(50) NULL)
GO

IF (EXISTS (SELECT * FROM dbo.sysobjects WHERE name = N'sp_send_cdosysmail' AND type='P')) DROP PROCEDURE [dbo].[sp_send_cdosysmail]
GO

	CREATE PROCEDURE [dbo].[sp_send_cdosysmail] 
	   @From varchar(100) ,
	   @To varchar(100) ,
	   @Subject varchar(100)=" ",
	   @Body varchar(4000) =" "
	/*********************************************************************
	
	Este procedimiento almacenado recibe los parámetros y envía correo 
	electrónico. Todas las configuraciones de correo están codificadas 
	en el procedimiento almacenado. Se agregan comentarios al procedimiento 
	almacenado donde es necesario. Las referencias a los objetos CDOSYS 
	están en el siguiente sitio Web de MSDN:
	http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cdosys/html/_cdosys_messaging.asp
	
	***********************************************************************/ 
	   AS
	   Declare @iMsg int
	   Declare @hr int
	   Declare @source varchar(255)
	   Declare @description varchar(500)
	   Declare @output varchar(1000)
	
	--************* Create the CDO.Message Object ************************
	   EXEC @hr = sp_OACreate 'CDO.Message', @iMsg OUT
	   IF @hr <>0 
	     BEGIN
	       SELECT @hr
	       INSERT INTO [dbo].[cdosysmail_failures] VALUES (getdate(), @@spid, @From, @To, @Subject, @Body, @iMsg, @hr, @source, @description, @output, 'Failed at sp_OACreate')
	       EXEC @hr = sp_OAGetErrorInfo NULL, @source OUT, @description OUT
	       IF @hr = 0
	         BEGIN
	           SELECT @output = '  Origen: ' + @source
	           PRINT  @output
	           SELECT @output = '  Descripción: ' + @description
	           PRINT  @output
                   INSERT INTO [dbo].[cdosysmail_failures] VALUES (getdate(), @@spid, @From, @To, @Subject, @Body, @iMsg, @hr, @source, @description, @output, 'sp_OAGetErrorInfo for sp_OACreate')
                   RETURN
	         END
	       ELSE
	         BEGIN
	           PRINT '  Error en  sp_OAGetErrorInfo.'
	           RETURN
	         END
	     END
	
	--***************Configuring the Message Object ******************
	-- Esto es para configurar un servidor SMTP remoto.
	-- http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cdosys/html/_cdosys_schema_configuration_sendusing.asp
	   EXEC @hr = sp_OASetProperty @iMsg, 'Configuration.fields("http://schemas.microsoft.com/cdo/configuration/sendusing").Value','2'
	   IF @hr <>0 
	     BEGIN
	       SELECT @hr
	       INSERT INTO [dbo].[cdosysmail_failures] VALUES (getdate(), @@spid, @From, @To, @Subject, @Body, @iMsg, @hr, @source, @description, @output, 'Failed at sp_OASetProperty sendusing')
	       EXEC @hr = sp_OAGetErrorInfo NULL, @source OUT, @description OUT
	       IF @hr = 0
	         BEGIN
	           SELECT @output = '  Origen: ' + @source
	           PRINT  @output
	           SELECT @output = '  Descripción: ' + @description
	           PRINT  @output
                   INSERT INTO [dbo].[cdosysmail_failures] VALUES (getdate(), @@spid, @From, @To, @Subject, @Body, @iMsg, @hr, @source, @description, @output, 'sp_OAGetErrorInfo for sp_OASetProperty sendusing')
                   GOTO send_cdosysmail_cleanup
	         END
	       ELSE
	         BEGIN
	           PRINT '  Error en sp_OAGetErrorInfo.'
	           GOTO send_cdosysmail_cleanup
	         END
	     END
	-- This is to configure the Server Name or IP address. 
	-- Replace MailServerName by the name or IP of your SMTP Server.
	   EXEC @hr = sp_OASetProperty @iMsg, 'Configuration.fields("http://schemas.microsoft.com/cdo/configuration/smtpserver").Value', cdoSMTPServerName 
	   IF @hr <>0 
	     BEGIN
	       SELECT @hr
	       INSERT INTO [dbo].[cdosysmail_failures] VALUES (getdate(), @@spid, @From, @To, @Subject, @Body, @iMsg, @hr, @source, @description, @output, 'Failed at sp_OASetProperty smtpserver')
	       EXEC @hr = sp_OAGetErrorInfo NULL, @source OUT, @description OUT
	       IF @hr = 0
	         BEGIN
	           SELECT @output = '  Origen: ' + @source
	           PRINT  @output
	           SELECT @output = '  Descripción: ' + @description
	           PRINT  @output
  	  	   INSERT INTO [dbo].[cdosysmail_failures] VALUES (getdate(), @@spid, @From, @To, @Subject, @Body, @iMsg, @hr, @source, @description, @output, 'sp_OAGetErrorInfo for sp_OASetProperty smtpserver')
                   GOTO send_cdosysmail_cleanup
	         END
	       ELSE
	         BEGIN
	           PRINT '  Error en sp_OAGetErrorInfo.'
	           GOTO send_cdosysmail_cleanup
	         END
	     END
	
	-- Guardar las configuraciones del objeto de mensaje.
	   EXEC @hr = sp_OAMethod @iMsg, 'Configuration.Fields.Update', null
	   IF @hr <>0 
	     BEGIN
	       SELECT @hr
	       INSERT INTO [dbo].[cdosysmail_failures] VALUES (getdate(), @@spid, @From, @To, @Subject, @Body, @iMsg, @hr, @source, @description, @output, 'Failed at sp_OASetProperty Update')
	       EXEC @hr = sp_OAGetErrorInfo NULL, @source OUT, @description OUT
	       IF @hr = 0
	         BEGIN
	           SELECT @output = '  Origen: ' + @source
	           PRINT  @output
	           SELECT @output = '  Descripción: ' + @description
	           PRINT  @output
  	  	   INSERT INTO [dbo].[cdosysmail_failures] VALUES (getdate(), @@spid, @From, @To, @Subject, @Body, @iMsg, @hr, @source, @description, @output, 'sp_OAGetErrorInfo for sp_OASetProperty Update')                 
		   GOTO send_cdosysmail_cleanup
	         END
	       ELSE
	         BEGIN
	           PRINT '  Error en sp_OAGetErrorInfo.'
	           GOTO send_cdosysmail_cleanup
	         END
	     END
	
	-- Establecer los parámetros de correo electrónico.
	   EXEC @hr = sp_OASetProperty @iMsg, 'To', @To
	   IF @hr <>0 
	     BEGIN
	       SELECT @hr
	       INSERT INTO [dbo].[cdosysmail_failures] VALUES (getdate(), @@spid, @From, @To, @Subject, @Body, @iMsg, @hr, @source, @description, @output, 'Failed at sp_OASetProperty To')
	       EXEC @hr = sp_OAGetErrorInfo NULL, @source OUT, @description OUT
	       IF @hr = 0
	         BEGIN
	           SELECT @output = '  Origen: ' + @source
	           PRINT  @output
	           SELECT @output = '  Descripción: ' + @description
	           PRINT  @output
  	  	   INSERT INTO [dbo].[cdosysmail_failures] VALUES (getdate(), @@spid, @From, @To, @Subject, @Body, @iMsg, @hr, @source, @description, @output, 'sp_OAGetErrorInfo for sp_OASetProperty To')                 
                   GOTO send_cdosysmail_cleanup
	         END
	       ELSE
	         BEGIN
	           PRINT '  Error en sp_OAGetErrorInfo.'
	           GOTO send_cdosysmail_cleanup
	         END
	     END

	   EXEC @hr = sp_OASetProperty @iMsg, 'From', @From
	   IF @hr <>0 
	     BEGIN
	       SELECT @hr
	       INSERT INTO [dbo].[cdosysmail_failures] VALUES (getdate(), @@spid, @From, @To, @Subject, @Body, @iMsg, @hr, @source, @description, @output, 'Failed at sp_OASetProperty From')
	       EXEC @hr = sp_OAGetErrorInfo NULL, @source OUT, @description OUT
	       IF @hr = 0
	         BEGIN
	           SELECT @output = '  Origen: ' + @source
	           PRINT  @output
	           SELECT @output = '  Descripción: ' + @description
	           PRINT  @output
  	  	   INSERT INTO [dbo].[cdosysmail_failures] VALUES (getdate(), @@spid, @From, @To, @Subject, @Body, @iMsg, @hr, @source, @description, @output, 'sp_OAGetErrorInfo for sp_OASetProperty From')                 
                   GOTO send_cdosysmail_cleanup
	         END
	       ELSE
	         BEGIN
	           PRINT '  Error en sp_OAGetErrorInfo.'
	           GOTO send_cdosysmail_cleanup
	         END
	     END

	   EXEC @hr = sp_OASetProperty @iMsg, 'Subject', @Subject
	   IF @hr <>0 
	     BEGIN
	       SELECT @hr
	       INSERT INTO [dbo].[cdosysmail_failures] VALUES (getdate(), @@spid, @From, @To, @Subject, @Body, @iMsg, @hr, @source, @description, @output, 'Failed at sp_OASetProperty Subject')
	       EXEC @hr = sp_OAGetErrorInfo NULL, @source OUT, @description OUT
	       IF @hr = 0
	         BEGIN
	           SELECT @output = '  Origen: ' + @source
	           PRINT  @output
	           SELECT @output = '  Descripción: ' + @description
	           PRINT  @output
  	  	   INSERT INTO [dbo].[cdosysmail_failures] VALUES (getdate(), @@spid, @From, @To, @Subject, @Body, @iMsg, @hr, @source, @description, @output, 'sp_OAGetErrorInfo for sp_OASetProperty Subject')
                   GOTO send_cdosysmail_cleanup
	         END
	       ELSE
	         BEGIN
	           PRINT '  Error en sp_OAGetErrorInfo.'
	           GOTO send_cdosysmail_cleanup
	         END
	     END
	
	-- Si usa correo electrónico HTML, utilice 'HTMLBody' en lugar de 'TextBody'.
	   EXEC @hr = sp_OASetProperty @iMsg, 'TextBody', @Body
	   IF @hr <>0 
	     BEGIN
	       SELECT @hr
	       INSERT INTO [dbo].[cdosysmail_failures] VALUES (getdate(), @@spid, @From, @To, @Subject, @Body, @iMsg, @hr, @source, @description, @output, 'Failed at sp_OASetProperty TextBody')
	       EXEC @hr = sp_OAGetErrorInfo NULL, @source OUT, @description OUT
	       IF @hr = 0
	         BEGIN
	           SELECT @output = '  Origen: ' + @source
	           PRINT  @output
	           SELECT @output = '  Descripción: ' + @description
	           PRINT  @output
  	  	   INSERT INTO [dbo].[cdosysmail_failures] VALUES (getdate(), @@spid, @From, @To, @Subject, @Body, @iMsg, @hr, @source, @description, @output, 'sp_OAGetErrorInfo for sp_OASetProperty TextBody')
                   GOTO send_cdosysmail_cleanup
	         END
	       ELSE
	         BEGIN
	           PRINT '  Error en sp_OAGetErrorInfo.'
	           GOTO send_cdosysmail_cleanup
	         END
	     END

	   EXEC @hr = sp_OAMethod @iMsg, 'Send', NULL
	   IF @hr <>0 
	     BEGIN
	       SELECT @hr
	       INSERT INTO [dbo].[cdosysmail_failures] VALUES (getdate(), @@spid, @From, @To, @Subject, @Body, @iMsg, @hr, @source, @description, @output, 'Failed at sp_OAMethod Send')
	       EXEC @hr = sp_OAGetErrorInfo NULL, @source OUT, @description OUT
	       IF @hr = 0
	         BEGIN
	           SELECT @output = '  Origen: ' + @source
	           PRINT  @output
	           SELECT @output = '  Descripción: ' + @description
	           PRINT  @output
  	  	   INSERT INTO [dbo].[cdosysmail_failures] VALUES (getdate(), @@spid, @From, @To, @Subject, @Body, @iMsg, @hr, @source, @description, @output, 'sp_OAGetErrorInfo for sp_OAMethod Send')
                   GOTO send_cdosysmail_cleanup
	         END
	       ELSE
	         BEGIN
	           PRINT '  Error en sp_OAGetErrorInfo.'
	           GOTO send_cdosysmail_cleanup
	         END
	     END
	

	-- Tratar los errores despúes de cada paso si es necesario.
	-- Clean up the objects created.
        send_cdosysmail_cleanup:
	If (@iMsg IS NOT NULL) -- if @iMsg is NOT NULL then destroy it
	BEGIN
		EXEC @hr=sp_OADestroy @iMsg
	
		-- Tratar el error de destroy si es necesario
		IF @hr <>0 
	     	BEGIN
			select @hr
        	        INSERT INTO [dbo].[cdosysmail_failures] VALUES (getdate(), @@spid, @From, @To, @Subject, @Body, @iMsg, @hr, @source, @description, @output, 'Failed at sp_OADestroy')
	       		EXEC @hr = sp_OAGetErrorInfo NULL, @source OUT, @description OUT
	
			-- Si sp_OAGetErrorInfo fue correcto, imprimir errores
			IF @hr = 0
			BEGIN
				SELECT @output = '  Origen: ' + @source
			        PRINT  @output
			        SELECT @output = '  Descripción: ' + @description
			        PRINT  @output
				INSERT INTO [dbo].[cdosysmail_failures] VALUES (getdate(), @@spid, @From, @To, @Subject, @Body, @iMsg, @hr, @source, @description, @output, 'sp_OAGetErrorInfo for sp_OADestroy')
			END
			
			-- else sp_OAGetErrorInfo failed
			ELSE
			BEGIN
				PRINT '  Error en sp_OAGetErrorInfo.'
			        RETURN
			END
		END
	END
	ELSE 
	BEGIN
		PRINT ' sp_OADestroy skipped because @iMsg is NULL.'
		INSERT INTO [dbo].[cdosysmail_failures] VALUES (getdate(), @@spid, @From, @To, @Subject, @Body, @iMsg, @hr, @source, @description, @output, '@iMsg is NULL, sp_OADestroy skipped')
	        RETURN
	END




A continuación, utilice el procedimiento almacenado que creó y proporcione los parámetros correctos.
 declare @Body varchar(4000) select @Body = 'Éste es un mensaje de prueba' exec sp_send_cdosysmail 'alguien@example.com','alguien2@example.com','Prueba de CDOSYS',@Body
Nota: sólo podrán ejecutar los procedimientos almacenados de Automatización OLE los miembros de la función de servidor fija sysadmin. Si el usuario de SQL Server no es miembro de la función fija sysadmin del servidor, no puede utilizar el procedimiento almacenado que se menciona en el ejemplo para enviar correo electrónico. En este caso, tendrá que desarrollar una aplicación cliente para enviar correo electrónico con CDOSYS. Por ejemplo, puede utilizar una aplicación de Microsoft Visual Basic.

CDOSYS envía el correo electrónico al servidor de correo SMTP remoto que se especifica como cdoSMTPServerName.

El servidor de correo SMTP envía el correo a la dirección de correo electrónico que se especifica en el argumento To: ("alguien2@example.com" en este ejemplo). El nombre que se especifica en el argumento From: aparece como remitente del mensaje de correo electrónico ("alguien@example.com" en este ejemplo).

Puede modificar este ejemplo para que envíe correo electrónico basado en HTML o datos adjuntos. Para ver documentación acerca de CDOSYS, visite el siguiente sitio Web de Microsoft:
http://msdn.microsoft.com/library/SPA/
En el panel izquierdo, expanda sucesivamente Messaging and Collaboration, Collaboration Data Objects y CDO for Windows 2000.

Más información

Es aconsejable enviar el correo electrónico con el directorio de recogida de SMTP local en lugar de con el nombre de correo de SMTP remoto. El procedimiento almacenado sp_send_cdosysmail de ejemplo se ejecuta en proceso con SQL Server y no funcionará si el servidor SMTP está sin conexión o se detenido. El envío de correo electrónico a través del directorio de recogida local sólo requiere que el procedimiento almacenado tenga permiso para el directorio de recogida. El servidor SMTP controlará independientemente el correo.

Para obtener más información acerca de cómo enviar correo utilizando el directorio de recogida local, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
286430 Cómo enviar correo con formato HTML utilizando CDO para Windows 2000 y el directorio de recogida local

Referencias

Para obtener más información acerca de los procedimientos almacenados de Automatización OLE de SQL Server, vea el tema "Procedimientos almacenados de Automatización OLE de SQL Server" en los Libros en pantalla de SQL Server 2000.



¿No encuentra una respuesta a su pregunta? Visite los grupos de noticias de Microsoft SQL Server en: Grupos de noticias de Microsoft SQL Server

¿Desea realizar algún comentario acerca de éste u otros artículos de Knowledge Base de Microsoft SQL Server? Envíe una nota a SQLKB@Microsoft.com

Propiedades

Id. de artículo: 312839 - Última revisión: lunes, 23 de octubre de 2006 - Versión: 10.1
La información de este artículo se refiere a:
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 7.0 Standard Edition
Palabras clave: 
kbhowtomaster KB312839

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com