核心擴充程序
| 程序 | 功能 | 關鍵參數 |
xp_startmail | 啟動 SQL Mail 工作階段 | @user, @password (選填) |
xp_stopmail | 停止 SQL Mail | 無 |
xp_sendmail | 寄送郵件 | @recipients (必填), @subject, @message, @query, @attachments, @copy_recipients, @blind_copy_recipients, @attach_results, @no_header, @width, @separator, @set_user, @dbuse |
xp_readmail | 讀取收件匣郵件 | @msg_id, @peek, @suppress_attach, @originator (OUTPUT), @subject (OUTPUT), @message (OUTPUT), @recipients (OUTPUT), @skip_bytes, @msg_length |
xp_findnextmsg | 尋找下一封郵件 | 類似 xp_readmail,用於迴圈處理 |
xp_deletemail | 刪除郵件 | @msg_id |
典型應用流程
- SQL Agent 作業排程呼叫
xp_startmail。
- 觸發器/作業步驟呼叫
xp_sendmail 發送警報、報表(@query 附件查詢結果)。
- 接收端系統/人工處理郵件,或另一 Agent 作業定期呼叫
xp_readmail + xp_findnextmsg 迴圈讀取指令郵件,解析內容動態執行 T-SQL(需極度謹慎防注入)。
- 處理完成呼叫
xp_deletemail 清理。
- 作業結束呼叫
xp_stopmail。
重要限制與遷移建議
- SQL Mail 依賴 MAPI 子系統(Outlook/Exchange),需在伺服器安裝 32 位元 MAPI 用戶端,配置複雜且穩定性差。
- SQL Server 2005 引入 Database Mail(
msdb.dbo.sp_send_dbmail),基於 SMTP、無 MAPI 相依、支援 SSL、重試、排程、多設定檔,強烈建議全面遷移。
xp_sendmail 的 @query 參數執行內容為呼叫者權限,動態 SQL 風險高,避免在非受信任輸入中使用。
快速範例:發送查詢結果附件
EXEC xp_startmail;
EXEC xp_sendmail
@recipients = 'dba@company.com',
@subject = '每日備份狀態報表',
@query = 'SELECT database_name, backup_finish_date, type FROM msdb..backupset WHERE backup_finish_date > DATEADD(day, -1, GETDATE())',
@attach_results = 'TRUE',
@width = 200,
@separator = ',';
EXEC xp_stopmail;