SQL Server 透過 SQLMail 擴充預存程序,可整合 Microsoft Exchange 或 Outlook 實現資料庫層級的郵件收發與事件驅動自動化。本文彙整核心指令語法與參數說明。
| 操作 | T-SQL 指令 | GUI 操作 |
|---|---|---|
| 啟動 | xp_startmail [@user], [@password](參數可選) | 企業管理員 → 支援服務 → SQLMail 右鍵 → 啟動 |
| 停止 | xp_stopmail | 同處 → 停止 |
xp_sendmail
[@recipients =] 'recipients[;...]'
, [@message =] 'message'
, [@query =] 'query'
, [@attachments =] 'attachments'
, [@copy_recipients =] 'cc_list'
, [@blind_copy_recipients =] 'bcc_list'
, [@subject =] 'subject'
, [@type =] 'type'
, [@attach_results =] 'TRUE|FALSE'
, [@no_output =] 'TRUE|FALSE'
, [@no_header =] 'TRUE|FALSE'
, [@width =] width
, [@separator =] 'separator'
, [@echo_error =] 'TRUE|FALSE'
, [@set_user =] 'user'
, [@dbuse =] 'database'
@recipients:必要,多位收件人以分號分隔。@query:任意有效查詢,結果可附件寄出(觸發器 inserted/deleted 表除外)。@attach_results:TRUE 時將查詢結果以附件形式附加。@no_header:TRUE 時不包含欄位標題列。@set_user:查詢執行內容用戶,預設 Guest。@dbuse:查詢使用的資料庫,預設為目前資料庫。xp_readmail
[@msg_id =] message_number
, [@type =] 'type' OUTPUT
, [@peek =] 'TRUE|FALSE' -- TRUE=不標記已讀
, [@suppress_attach =] 'TRUE|FALSE'
, [@originator =] 'sender' OUTPUT
, [@subject =] 'subject' OUTPUT
, [@message =] 'message' OUTPUT
, [@recipients =] 'recipients' OUTPUT
, [@cc_list =] 'cc_list' OUTPUT
, [@bcc_list =] 'bcc_list' OUTPUT
, [@date_received =] 'date' OUTPUT
, [@unread =] 'unread_flag' OUTPUT
, [@attachments =] 'attachments' OUTPUT
, [@skip_bytes =] bytes OUTPUT
, [@msg_length =] length OUTPUT
, [@originator_address =] 'address' OUTPUT
xp_sendmail @query='SELECT ...', @attach_results='TRUE'。xp_sendmail @recipients='dba@corp.com', @subject='Alert', @message=@errmsg。xp_readmail @peek='TRUE' 掃描特定主題/寄件者 → 解析內容 → 執行對應預存程序 → xp_readmail @msg_id=..., @peek='FALSE' 標記已處理。SQL Server 2005+ 已淘汰 SQLMail,改用 Database Mail(sp_send_dbmail),架構更穩定、不依賴 MAPI/Outlook、支援非同步佇列與重試機制。新專案請直接採用 Database Mail;現有 SQLMail 系統規劃升級路徑。