結果:70%+ DBA 放棄 SQL Mail,尋找替代方案。
在 SQL Server 存儲過程中,通過 OLE 自動化調用 JMail COM 組件發送郵件,無需 Outlook/Exchange,輕量級、穩定、易部署。
-- 創建 OLE 對象
sp_OACreate 'JMail.Message', @obj OUT
-- 設置屬性
sp_OASetProperty @obj, 'Logging', true
sp_OASetProperty @obj, 'Silent', true
sp_OASetProperty @obj, 'Charset', 'UTF-8'
sp_OASetProperty @obj, 'MailServer', 'smtp.example.com'
sp_OASetProperty @obj, 'MailServerUser', 'user'
sp_OASetProperty @obj, 'MailServerPass', 'pass'
-- 設置發件人/收件人/主題/正文
sp_OASetProperty @obj, 'From', 'noreply@example.com'
sp_OASetProperty @obj, 'FromName', '系統通知'
sp_OASetProperty @obj, 'Subject', @subject
sp_OASetProperty @obj, 'Body', @body
sp_OASetProperty @obj, 'AddRecipient', @to_email
-- 發送
sp_OAMethod @obj, 'Send'
-- 釋放對象
sp_OADestroy @obj
CREATE PROCEDURE dbo.sp_SendMail_JMail
@to_email VARCHAR(200),
@subject NVARCHAR(200),
@body NVARCHAR(MAX),
@attachment VARCHAR(500) = NULL
AS
BEGIN
DECLARE @hr INT, @obj INT, @src VARCHAR(255), @desc VARCHAR(255)
-- 創建對象
EXEC @hr = sp_OACreate 'JMail.Message', @obj OUT
IF @hr <> 0 BEGIN
EXEC sp_OAGetErrorInfo @obj, @src OUT, @desc OUT
RAISERROR('JMail 創建失敗: %s - %s', 16, 1, @src, @desc)
RETURN
END
-- 通用設置
EXEC sp_OASetProperty @obj, 'Logging', 1
EXEC sp_OASetProperty @obj, 'Silent', 1
EXEC sp_OASetProperty @obj, 'MailServer', 'smtp.corp.com'
EXEC sp_OASetProperty @obj, 'MailServerUser', 'sqlagent'
EXEC sp_OASetProperty @obj, 'MailServerPass', 'P@ssw0rd'
-- 郵件內容
EXEC sp_OASetProperty @obj, 'From', 'sqlagent@corp.com'
EXEC sp_OASetProperty @obj, 'FromName', 'SQL Agent'
EXEC sp_OASetProperty @obj, 'Subject', @subject
EXEC sp_OASetProperty @obj, 'Body', @body
EXEC sp_OASetProperty @obj, 'Priority', 3 -- 正常優先級
-- 收件人(支持多個,分號分隔)
DECLARE @email VARCHAR(200), @pos INT
SET @to_email = @to_email + ';'
WHILE CHARINDEX(';', @to_email) > 0 BEGIN
SET @pos = CHARINDEX(';', @to_email)
SET @email = LTRIM(RTRIM(SUBSTRING(@to_email, 1, @pos-1)))
IF @email <> '' EXEC sp_OASetProperty @obj, 'AddRecipient', @email
SET @to_email = SUBSTRING(@to_email, @pos+1, LEN(@to_email))
END
-- 附件
IF @attachment IS NOT NULL AND @attachment <> ''
EXEC sp_OASetProperty @obj, 'AddAttachment', @attachment
-- 發送
EXEC @hr = sp_OAMethod @obj, 'Send'
IF @hr <> 0 BEGIN
EXEC sp_OAGetErrorInfo @obj, @src OUT, @desc OUT
RAISERROR('JMail 發送失敗: %s - %s', 16, 1, @src, @desc)
END
-- 清理
EXEC sp_OADestroy @obj
END
EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
EXEC sp_configure 'Ole Automation Procedures', 1; RECONFIGURE;
EXEC dbo.sp_SendMail_JMail 'test@corp.com', '測試', '正文內容'