首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 利用 CDO 元件透過 SMTP 發送郵件的新作法

     編輯:關於SqlServer

背景與動機

傳統 SQL Server Database Mail 需配置 Exchange/Outlook,設定繁瑣且常失敗。利用 sp_OA* 系列預存程序建立 COM 物件,呼叫 IIS 內建 CDO.Message 元件,可直接透過外部 SMTP 伺服器發信,無需郵件用戶端。

發信預存程序:sys_sendmail

CREATE PROCEDURE sys_sendmail
    @From VARCHAR(100),
    @To VARCHAR(100),
    @Bcc VARCHAR(500),
    @Subject VARCHAR(400) = '',
    @Body NTEXT = ''
AS
DECLARE @obj INT, @hr INT

-- 建立 CDO.Message 物件
EXEC @hr = sp_OACreate 'CDO.Message', @obj OUT
IF @hr <> 0 GOTO ErrorHandler

-- 設定使用 SMTP 發送 (2 = cdoSendUsingPort)
EXEC @hr = sp_OASetProperty @obj, 'Configuration.Fields("https://schemas.microsoft.com/cdo/configuration/sendusing").Value', '2'

-- SMTP 伺服器位址(請修改為實際可用伺服器)
EXEC @hr = sp_OASetProperty @obj, 'Configuration.Fields("https://schemas.microsoft.com/cdo/configuration/smtpserver").Value', 'smtp.163.com'

-- SMTP 驗證設定(若伺服器需驗證必須設定)
EXEC @hr = sp_OASetProperty @obj, 'Configuration.Fields("https://schemas.microsoft.com/cdo/configuration/smtpauthenticate").Value', '1'  -- Basic Auth
EXEC @hr = sp_OASetProperty @obj, 'Configuration.Fields("https://schemas.microsoft.com/cdo/configuration/sendusername").Value', 'your_username'
EXEC @hr = sp_OASetProperty @obj, 'Configuration.Fields("https://schemas.microsoft.com/cdo/configuration/sendpassword").Value', 'your_password'

-- 更新設定
EXEC @hr = sp_OAMethod @obj, 'Configuration.Fields.Update', NULL

-- 郵件內容
EXEC @hr = sp_OASetProperty @obj, 'To', @To
EXEC @hr = sp_OASetProperty @obj, 'Bcc', @Bcc
EXEC @hr = sp_OASetProperty @obj, 'From', @From
EXEC @hr = sp_OASetProperty @obj, 'Subject', @Subject
EXEC @hr = sp_OASetProperty @obj, 'TextBody', @Body

-- 發送
EXEC @hr = sp_OAMethod @obj, 'Send', NULL

-- 錯誤處理
IF @hr <> 0
BEGIN
    EXEC sp_OAGetErrorInfo @obj
    RETURN @hr
END

PRINT 'success'
EXEC @hr = sp_OADestroy @obj
RETURN 0

ErrorHandler:
EXEC sp_OAGetErrorInfo @obj
EXEC sp_OADestroy @obj
RETURN @hr
GO

關鍵設定說明

前置需求與注意事項

  • SQL Server 服務帳號需具備網路存取權限
  • 伺服器需安裝 CDO 元件(Windows 2000/XP/2003 內建;較新版 OS 需確認)
  • 防火牆需開放 SMTP 埠(預設 25、587、465)
  • sp_OA* 需啟用 Ole Automation Procedures 伺服器選項
  • 生產環境建議將帳號密碼加密儲存,由預存程序解密後使用

呼叫範例

EXEC sys_sendmail 
    'sender@company.com', 
    'receiver@company.com', 
    '', 
    '測試主旨', 
    '這是測試郵件內文。'

此作法繞過 SQL Server 內建郵件系統,直接以 SMTP 發信,相容性高、除錯容易,適合無 Exchange 環境或需跨網域發信的案例。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
屬性值說明
sendusing2透過網路連接埠發送
smtpserversmtp.xxx.comSMTP 伺服器 FQDN 或 IP
smtpauthenticate1Basic 驗證(0=匿名,2=NTLM)
sendusername帳號SMTP 登入帳號
sendpassword密碼SMTP 登入密碼