SQL Server 內建 msdb.dbo.sp_send_dbmail 預存程序,配合 Database Mail 功能,可直接從 T-SQL 發送郵件通知、報表、警示。本文以圖文並茂方式,完整記錄從建立郵件設定檔、SMTP 帳戶、啟用功能到發送測試的全流程。
sysadmin 固定伺服器角色權限db_mail_profile)、描述 → 新增...| 欄位 | 說明與範例 |
|---|---|
| 帳戶名稱 | 識別用,如 smtp_gmail |
| 電子郵件地址 | 寄件者信箱,如 alert@company.com |
| 顯示名稱 | 收件端顯示的寄件者名稱,如 SQL Server Alert |
| 回覆電子郵件 | 可同寄件信箱 |
| 伺服器名稱 | SMTP 伺服器,Gmail 為 smtp.gmail.com,Outlook 為 smtp.office365.com |
| 連接埠號 | SSL 通常 465,TLS 通常 587 |
| SMTP 驗證 | 選 基本驗證,輸入完整信箱與密碼(Gmail 需應用程式密碼) |
| 啟用 SSL | 勾選 |
EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
EXEC sp_configure 'Database Mail XPs', 1; RECONFIGURE;
在 msdb 資料庫執行:
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'db_mail_profile', -- 步驟1建立的設定檔名稱
@recipients = 'admin@company.com', -- 收件者,多個用分號分隔
@subject = 'SQL Server 測試郵件',
@body = '這是從 SQL Server sp_send_dbmail 發送的測試郵件。',
@body_format = 'TEXT'; -- 或 'HTML'
| 參數 | 說明 |
|---|---|
@copy_recipients | 副本收件者 |
@blind_copy_recipients | 密件副本收件者 |
@file_attachments | 附件完整路徑,多個用分號分隔(需檔案存在於 SQL Server 機器) |
@query | 附加查詢結果文字 |
@execute_query_database | 查詢執行的資料庫內容 |
@attach_query_result_as_file | 1=將查詢結果存為附件 |
@query_attachment_filename | 附件檔名 |
@importance | LOW / NORMAL / HIGH |
@sensitivity | NORMAL / PERSONAL / PRIVATE / CONFIDENTIAL |
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'db_mail_profile',
@recipients = 'manager@company.com',
@subject = '每日銷售報表 ' + CONVERT(varchar(10), GETDATE(), 120),
@body = '附件為今日銷售明細,請查收。',
@query = 'SELECT OrderID, CustomerID, OrderDate, TotalAmount FROM Sales.Orders WHERE OrderDate = CAST(GETDATE() AS DATE)',
@execute_query_database = 'ERP_DB',
@attach_query_result_as_file = 1,
@query_attachment_filename = 'DailySales_' + CONVERT(varchar(8), GETDATE(), 112) + '.csv',
@query_result_separator = ',',
@query_result_header = 1;
發送後可查詢以下系統檢視表:
msdb.dbo.sysmail_allitems:所有郵件項目msdb.dbo.sysmail_sentitems:已發送(sent_status = 1)msdb.dbo.sysmail_unsentitems:未發送(sent_status = 3)msdb.dbo.sysmail_faileditems:發送失敗(sent_status = 2)msdb.dbo.sysmail_log:詳細錯誤日誌常見失敗原因:
EXECUTE 權限僅授予必要角色/使用者:GRANT EXECUTE ON msdb.dbo.sp_send_dbmail TO [AppRole];@importance、@sensitivity 協助收件端分類sysmail_* 歷史記錄避免 msdb 膨脹完成上述設定,即可在預存程序、Agent 作業、觸發器中直接呼叫 sp_send_dbmail 實現自動化郵件通知,大幅提升營運監控與業務流程的即時觸達能力。