SQL Server 2005 引入 Database Mail 取代舊版 SQL Mail:
DBA_Alert_Profile、描述。Gmail_SMTPalert@company.comSQL Server Alertdba@company.comsmtp.gmail.com (或內部 Exchange)587 (TLS) 或 465 (SSL) 或 25











-- 1. 確認 msdb 啟用 Service Broker (Database Mail 依賴佇列)
SELECT is_broker_enabled FROM sys.databases WHERE name = 'msdb';
-- 若為 0,需獨佔模式啟用:
-- ALTER DATABASE msdb SET ENABLE_BROKER WITH ROLLBACK IMMEDIATE;
-- 2. 啟用 Database Mail XPs (預設關閉)
EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
EXEC sp_configure 'Database Mail XPs', 1; RECONFIGURE;
-- 立即生效,無需重啟服務
USE msdb;
GO
EXEC dbo.sp_send_dbmail
@profile_name = 'DBA_Alert_Profile', -- 精靈建立的設定檔名
@recipients = 'dba@company.com', -- 多位址用 ; 分隔
@subject = 'SQL Server Database Mail 測試',
@body = '這是來自 ' + @@SERVERNAME + ' 的測試郵件,時間:' + CONVERT(VARCHAR, GETDATE(), 120),
@body_format = 'TEXT'; -- 或 'HTML'
GO

EXEC dbo.sp_send_dbmail
@profile_name = 'DBA_Alert_Profile',
@recipients = 'dba@company.com',
@subject = '每日備份狀態報表',
@query = 'SELECT database_name, backup_start_date, backup_finish_date, backup_size/1024/1024 AS Size_MB FROM msdb..backupset WHERE backup_start_date >= DATEADD(DAY,-1,GETDATE()) ORDER BY backup_start_date DESC',
@attach_query_result_as_file = 1,
@query_attachment_filename = 'BackupReport.csv',
@query_result_separator = CHAR(9), -- Tab
@query_result_header = 1;
EXEC dbo.sp_send_dbmail
@profile_name = 'DBA_Alert_Profile',
@recipients = 'dba@company.com',
@subject = '錯誤日誌備份',
@body = '請參閱附件錯誤日誌。',
@file_attachments = 'C:\Logs\ERRORLOG.1;C:\Logs\ERRORLOG.2';
DECLARE @html NVARCHAR(MAX) = N'備份失敗警報
資料庫 時間 錯誤 ';
SELECT @html += '' + database_name + ' ' + CONVERT(VARCHAR, backup_finish_date, 120) + ' ' + message + ' '
FROM msdb..backupset WHERE backup_finish_date >= DATEADD(HOUR,-1,GETDATE()) AND backup_size = 0; -- 示意
SET @html += '
';
EXEC dbo.sp_send_dbmail @profile_name='DBA_Alert_Profile', @recipients='dba@company.com', @subject='備份失敗', @body=@html, @body_format='HTML';
-- 1. 郵件事件日誌 (發送/失敗/重試)
SELECT * FROM msdb.dbo.sysmail_log ORDER BY log_date DESC;
-- 2. 郵件項目狀態 (sent/unsent/retrying/failed)
SELECT
mailitem_id, profile_id, recipients, subject,
sent_status, sent_date, last_mod_date, retry_count
FROM msdb.dbo.sysmail_mailitems
ORDER BY sent_date DESC;
-- 3. 失敗郵件詳細錯誤
SELECT
mi.mailitem_id, mi.recipients, mi.subject,
l.description AS error_description, l.log_date
FROM msdb.dbo.sysmail_mailitems mi
JOIN msdb.dbo.sysmail_log l ON mi.mailitem_id = l.mailitem_id
WHERE mi.sent_status = 3 -- 3 = failed
ORDER BY l.log_date DESC;


| 現象 | 可能原因 | 排查步驟 |
|---|---|---|
| 郵件卡在 unsent | Service Broker 未啟用 / Database Mail XPs 關閉 / msdb 佇列停用 | 檢查 is_broker_enabled、sp_configure、sys.service_queues |
| SMTP 驗證失敗 | 帳號/密碼錯誤、未啟用 SMTP/SSL、防火牆阻擋 587/465/25 | Telnet 測試連接埠、郵件用戶端驗證設定、啟用應用程式專用密碼 (Gmail) |
| 附件過大被擋 | 超過 @max_file_size (預設 1MB) 或 SMTP 伺服器限制 | 調整 sysmail_configure_sp @max_file_size、壓縮附件 |
| 中文亂碼 | @body_format='TEXT' 但編碼不符 | 改用 @body_format='HTML' 並加 ,或確認資料庫/伺服器定序 |
Database Mail 是 SQL Server 內建、企業級、無相依的郵件發送方案。核心設定三步驟:SMTP 帳戶/設定檔 → 啟用 Service Broker + Database Mail XPs → sp_send_dbmail 發送。善用查詢結果附件、HTML 格式、日誌監控,可建立完整的自動化警報、報表分發、審計通知體系。後續可整合 Agent 作業、WMI 警示、AlwaysOn 事件通知,實現全方位資料庫營運感知。