如何不使用 SQL Server 中的 SQL Mail 來傳送電子郵件

文章翻譯 文章翻譯
文章編號: 312839 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

結論

SQL Mail 會提供從 Microsoft SQL Server 傳送和讀取電子郵件的簡易方式。但是因為 SQL Mail 屬於 MAPI 應用程式,所以伺服器上必須出現 MAPI 子系統。Microsoft Windows NT 4.0 會在您安裝 Windows Messaging 時,安裝 MAPI 子系統。但是 Microsoft Windows 2000 並不會提供 MAPI 子系統。因此,如果您要使用 SQL Mail,您就必須安裝類似 Microsoft Outlook 的 MAPI 用戶端。

您可以使用其他方法,直接從 SQL Server 傳送「簡易郵件傳送通訊協定」(SMTP) 電子郵件。例如,您可以使用 Collaboration Data Objects for NT Server (CDONTS) 或 Collaboration Data Objects for Windows 2000 (CDOSYS),來配合 sp_OA SQL Server OLE Automation 預存程序使用。本文包含如何使用這些技巧將電子郵件傳送到網際網路郵件伺服器的範例。您可以修改這些技巧,使其提供更穩定的郵件系統。例如,您可能會希望新增錯誤處理程式碼。這些範例中介紹的技巧並不會提供讀取或處理電子郵件的方法。

注意 CDOSYS 是由 Windows 2000 之後版本才提供使用,而且我們建議您使用 CDOSYS,而不要使用 CDONTS。Windows Server 2003 和更新版本的作業系統不再支援 CDONTS。

注意 這些程式設計範例會說明可用於在 Transact-SQL 中叫用 CDO 物件模型的技巧。您要自行負責這些範例的任何程式設計延伸使用,或是在生產環境中執行程式碼時所必須通過的任何壓力測試。

Microsoft 僅提供示範性的程式設計範例,不做任何明示或默示的保證。其中包括 (但不限於) 其適售性與適合某特定用途之默示擔保。本文將假設您已相當熟悉示範所使用的程式設計語言,以及用於建立和偵錯程序的工具。Microsoft 技術支援工程師可以協助說明特定程序的功能,但不會修改這些範例以提供附加功能或建構程序來滿足您的特定需求。

如何使用 CDO for Microsoft Windows NT Server (CDONTS)

CDONTS 是專門為網路應用程式提供訊息功能所開發的「簡易訊息傳送通訊協定」(SMTP) 特定 OLE 伺服器。所以,CDONTS 支援傳送 HTML 格式電子郵件。Mapi 應用程式 (例如 SQL Mail) 則不支援這類傳送。根據預設,Microsoft Internet Information Server (IIS) 4.0 或更新版本會安裝 CDONTS。根據預設,Microsoft Windows 2000 會安裝 Microsoft Internet Information Server (IIS) 5.0。

如需有關 CDONTS 的詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
177850 INFO:CDO 1.2 與 CDONTS 之間的差異
CDONTS 會透過 SMTP 將電子郵件傳送到本機伺服器。如果您的本機伺服器上沒有安裝 SMTP 伺服器,您可以使用 IIS 安裝的 SMTP 虛擬伺服器,將 SMTP 電子郵件路由傳送到適當的 SMTP 郵件伺服器。如果要使用 CDONTS 從 SQL Server 傳送電子郵件,請依照下列步驟執行:
  1. 安裝 IIS,並在執行 SQL Server 的電腦上執行。
  2. 指定您的 SMTP 郵件伺服器為「智慧主機」,以便 IIS SMTP 服務自動將傳送到本機伺服器的任何 SMTP 電子郵件,路由傳送到您的 SMTP 郵件伺服器,以便進行傳送。
  3. 在您可以用來傳送電子郵件的 SQL Server 中建立預存程序。
當您是使用 CDONTS 而不是使用 SQL Mail 時,您就不需要在執行 SQL Server 的電腦上安裝類似 Microsoft Outlook 的郵件用戶端。您也不需要安裝 Microsoft Exchange Server。您可以使用任何支援 SMTP 電子郵件的郵件伺服器來作為「智慧主機」。但是,您不能使用 CDONTS 來讀取和處理傳送到正在執行 SQL Server 的電腦的電子郵件。您也不能替換 SQL Agent Mail 的功能。

下面是在 Microsoft Windows 2000 上執行的指示。如果電腦上已經安裝有 IIS 4.0,您就可以用類似方式來設定 Microsoft Windows NT 4.0。但是步驟會有些差異。

如需有關如何在 Microsoft Windows NT 4.0 上設定「智慧主機」的詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
230235 XCON: How to Configure the IIS SMTP Service to Relay SMTP Mail

設定智慧主機

  1. 按一下 [開始],依序指向 [程式集][系統管理工具],然後
    按一下 [Internet 服務管理員] 以開啟「IIS 管理員」。
  2. 開啟伺服器的樹狀目錄。用滑鼠右鍵按一下 [預設 SMTP 虛擬伺服器],然後按一下 [內容]
  3. 找出 [傳遞] 索引標籤,然後按一下 [進階]
  4. [智慧主機] 文字方塊中輸入 SMTP 郵件伺服器的名稱。如果您不知道您的 SMTP 郵件伺服器名稱,請連絡您的郵件系統管理員。
  5. 確定「簡易郵件傳送通訊協定」(SMTP) 服務正在執行。SMTP 服務是 IIS 管理服務的一部分。因此,IIS 管理服務也必須是執行狀態。

建立預存程序來傳送 CDONTS 電子郵件

注意 本文件範例中所提到的公司、組織、產品、網域名稱、電子郵件地址、公司標誌、個人、地點及事件皆屬虛構。並無意圖亦不應將其影射為任何實際之公司、組織、產品、網域名稱、電子郵件地址、標誌、個人、地點及事件。

您可以使用類似下面的程式碼,在傳送電子郵件的資料庫中建立預存程序,以便透過 SQL Server OLE Automation 預存程序來叫用 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

接著使用您已建立的預存程序,並提供正確參數:
exec sp_send_cdontsmail 'someone@example.com','someone2@example.com','Test of CDONTS','It works'
注意 只有 sysadmin 固定伺服器角色的成員可以執行 OLE Automation 預存程序。如果 SQL Server 使用者不是 sysadmin 固定伺服器角色的成員,您就不能使用此範例所提到的預存程序來傳送電子郵件。在這種情況下,您可能需要開發用戶端應用程式,透過 CDONTS 來傳送電子郵件。例如,您可以使用 Microsoft Visual Basic 應用程式。

CDONTS 會將電子郵件傳送到本機 SMTP 虛擬伺服器。接著,伺服器會將電子郵件路由傳送到已在 [智慧主機] 文字方塊中指定的 SMTP 郵件伺服器。SMTP 郵件伺服器會將郵件傳送到在 To: 引數中指定的電子郵件地址 (在此範例中是 someone2@example.com)。在 From:引數中指定的名稱
會顯示為電子郵件的寄件人 (在此範例中是 someone@example.com),同時此封電子郵件的主旨是「Test of CDONTS」,而本文內容是「It works」。這封電子郵件沒有任何副本收件人,因為您並沒有在 [副本][密件副本] 欄位中提供任何引數。

您可以修改這個範例,以便用來傳送 HTML 電子郵件或是附件。如需有關 CDONTS 的文件,請至下列 Microsoft 網站:
http://msdn.microsoft.com/library/CHT/
在左邊窗格中,依序展開 [Messaging and Collaboration][Collaboration Data Objects],接著再展開 [CDO 1.2.1]

您可以在《SQL Server 2000 線上叢書》中尋找有關 SQL Server OLE Automation 預存程序的說明文件。

如何使用 CDO for Microsoft Windows 2000 (CDOSYS)

CDOSYS 會提供在 Microsoft Windows 2000 上開發訊息應用程式的物件模型。它也會提供優於現有 CDO for Windows NT Server (CDONTS) 程式庫的增強功能。CDOSYS 需要 Windows 2000 以及本機或遠端 SMTP 伺服器。

您可以用程式設計方法設定 CDOSYS 指向 SMTP 伺服器,為開發人員提供設定 SMTP 伺服器的彈性。

如需有關 CDOSYS 的詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
195683 Relationship between 1.x CDO Libraries and CDOSYS.DLL
由於 CDOSYS 可以傳送電子郵件到遠端 SMTP 伺服器,因此 CDOSYS 不會要求您在執行 SQL Server 的電腦上安裝並執行 Internet Information Server。您也不需要設定 SMTP 虛擬伺服器。您所需要做的,就只是在用來傳送電子郵件的 SQL Server 中建立預存程序。

當您是使用 CDOSYS 而不是使用 SQL Mail 時,您就不需要在執行 SQL Server 的電腦上安裝像 Microsoft Outlook 的郵件用戶端。您也不需要安裝 Exchange Server。您可以使用任何支援 SMTP 郵件的郵件伺服器,來作為自己的遠端 SMTP 郵件伺服器。但是如果是使用 CDOSYS,您就不能讀取或處理傳送到 SQL Server 的電子郵件。您也不能替換 SQL Agent Mail 的功能。

搭配 SQL Server OLE Automation 物件來使用 CDOSYS 時,會依賴 SQL Server OLE Automation 來叫用 CDOSYS 物件模型。這點已經過 SQL Server 2000 Service Pack 1 (SP1) 和 SQL Server 2000 Service Pack 2 (SP2) 的測試。Microsoft 不保證可以從 SQL Server 2000 SP1 之前所發行版本 SQL Server 上的 OLE Automation 預存程序呼叫 CDOSYS。

建立預存程序來傳送 CDOSYS 電子郵件

您可以使用類似下面的程式碼在資料庫中建立預存程序,以便透過 SQL Server OLE Automation 預存程序叫用 CDOSYS 物件模型來傳送電子郵件。

在本範例中,我們會提供錯誤處理的選擇層級,來檢查每個 EXEC sp_OA* 陳述式的 hresult。如果 hresult (@hr) 是零,表示之前的 sp_OA* 陳述式成功。但是如果該 hresult 不是零,就表示之前的 sp_OA* 陳述式失敗。

針對每個不是零的 hresult 失敗,記錄失敗發生位置和時間的 [dbo].[cdosysmail_failures] 表格都會插入一行資料列。此外,系統會使用 sp_OAGetErrorInfo 預存程序來解譯最後一個錯誤,以便報告該錯誤的來源和說明。用戶端連線會列印該項錯誤說明。資料庫的 [dbo].[cdosysmail_failures] 表格中,也會插入該錯誤說明、時間和失敗位置,讓您在錯誤發生之後用來識別並診斷失敗情形。

如果 sp_OAGetErrorInfo 預存程序本身發生失敗,此範例就會在用戶端連線列印下列錯誤訊息:

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) =" "
	/*********************************************************************
	
	This stored procedure takes the parameters and sends an e-mail. 
	All the mail configurations are hard-coded in the stored procedure. 
	Comments are added to the stored procedure where necessary.
	References to the CDOSYS objects are at the following MSDN Web site:
	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 = '  Source: ' + @source
	           PRINT  @output
	           SELECT @output = '  Description: ' + @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 '  sp_OAGetErrorInfo failed.'
	           RETURN
	         END
	     END
	
	--***************Configuring the Message Object ******************
	-- This is to configure a remote SMTP server.
	-- 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 = '  Source: ' + @source
	           PRINT  @output
	           SELECT @output = '  Description: ' + @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 '  sp_OAGetErrorInfo failed.'
	           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 = '  Source: ' + @source
	           PRINT  @output
	           SELECT @output = '  Description: ' + @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 '  sp_OAGetErrorInfo failed.'
	           GOTO send_cdosysmail_cleanup
	         END
	     END
	
	-- Save the configurations to the message object.
	   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 = '  Source: ' + @source
	           PRINT  @output
	           SELECT @output = '  Description: ' + @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 '  sp_OAGetErrorInfo failed.'
	           GOTO send_cdosysmail_cleanup
	         END
	     END
	
	-- Set the e-mail parameters.
	   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 = '  Source: ' + @source
	           PRINT  @output
	           SELECT @output = '  Description: ' + @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 '  sp_OAGetErrorInfo failed.'
	           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 = '  Source: ' + @source
	           PRINT  @output
	           SELECT @output = '  Description: ' + @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 '  sp_OAGetErrorInfo failed.'
	           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 = '  Source: ' + @source
	           PRINT  @output
	           SELECT @output = '  Description: ' + @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 '  sp_OAGetErrorInfo failed.'
	           GOTO send_cdosysmail_cleanup
	         END
	     END
	
	-- If you are using HTML e-mail, use 'HTMLBody' instead of '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 = '  Source: ' + @source
	           PRINT  @output
	           SELECT @output = '  Description: ' + @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 '  sp_OAGetErrorInfo failed.'
	           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 = '  Source: ' + @source
	           PRINT  @output
	           SELECT @output = '  Description: ' + @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 '  sp_OAGetErrorInfo failed.'
	           GOTO send_cdosysmail_cleanup
	         END
	     END
	

	-- Do some error handling after each step if you have to.
	-- 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
	
		-- handle the failure of the destroy if needed
		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
	
			-- if sp_OAGetErrorInfo was successful, print errors
			IF @hr = 0
			BEGIN
				SELECT @output = '  Source: ' + @source
			        PRINT  @output
			        SELECT @output = '  Description: ' + @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 '  sp_OAGetErrorInfo failed.'
			        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

接著使用您已建立的預存程序,並提供正確參數。
   declare @Body varchar(4000)
   select @Body = 'This is a Test Message'
   exec sp_send_cdosysmail 'someone@example.com','someone2@example.com','Test of CDOSYS',@Body
注意 只有 sysadmin 固定伺服器角色的成員可以執行 OLE Automation 預存程序。如果您的 SQL Server 使用者不是 sysadmin 固定伺服器角色的成員,您就不能使用此範例所提到的預存程序來傳送電子郵件。在這種情況下,您可能需要開發用戶端應用程式,透過 CDOSYS 來傳送郵件。例如,您可以使用 Microsoft Visual Basic 應用程式。

CDOSYS 會將電子郵件傳送到 cdoSMTPServerName 所指定的遠端 SMTP 郵件伺服器。

SMTP 郵件伺服器會將郵件傳送到在 To:引數指定的電子郵件地址 (在此範例中是 someone2@example.com)。在 From: 引數中指定的名稱會顯示為電子郵件的寄件人 (在此範例中是 someone@example.com)。

您可以修改這個範例,以便用來傳送文字電子郵件或是附件。如需有關 CDOSYS 的文件,請至下列 Microsoft 網站:
http://msdn.microsoft.com/library/CHT/
在左邊窗格中,依序展開 [Messaging and Collaboration][Collaboration Data Objects],接著再展開 [CDO for Windows 2000]

其他相關資訊

我們強烈建議您在傳送電子郵件時使用本機 SMTP 收取目錄,而不要使用遠端 SMTP 郵件名稱。sp_send_cdosysmail 範例預存程序會同時和 SQL Server 一起執行,而且會在 SMTP 伺服器離線或中斷時失敗。透過本機收取目錄傳送電子郵件的唯一要求,就是預存程序必須具有該收取目錄的權限。此 SMTP 伺服器將會獨立處理郵件。

如需有關如何使用本機收取目錄來傳送郵件的詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
286430 How To Send HTML Formatted Mail Using CDO for Windows 2000 and the Local Pickup Directory

?考

如需有關 SQL Server OLE Automation 預存程序的詳細資訊,請參閱《SQL Server 2000 線上叢書》的「SQL Server OLE Automation 預存程序」主題。



沒有找到解答您心中問題的答案?請造訪下列 Microsoft SQL Server 新聞群組:Microsoft SQL Server 新聞群組

您是否對本文或其他「Microsoft SQL Server 知識庫」文件有任何意見呢?請來信 SQLKB@Microsoft.com 表達您的意見。

屬性

文章編號: 312839 - 上次校閱: 2011年5月18日 - 版次: 11.0
這篇文章中的資訊適用於:
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 7.0 Standard Edition
關鍵字:?
kbsqldeveloper kbhowtomaster KB312839
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

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