傳統 SQL Server Database Mail 需配置 Exchange/Outlook,設定繁瑣且常失敗。利用 sp_OA* 系列預存程序建立 COM 物件,呼叫 IIS 內建 CDO.Message 元件,可直接透過外部 SMTP 伺服器發信,無需郵件用戶端。
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
| 屬性 | 值 | 說明 |
|---|---|---|
| sendusing | 2 | 透過網路連接埠發送 |
| smtpserver | smtp.xxx.com | SMTP 伺服器 FQDN 或 IP |
| smtpauthenticate | 1 | Basic 驗證(0=匿名,2=NTLM) |
| sendusername | 帳號 | SMTP 登入帳號 |
| sendpassword | 密碼 | SMTP 登入密碼 |