首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server SQL Mail 完整操作指南:啟動、發送、附件、查詢附件與參數詳解

     編輯:關於SqlServer

核心擴展預存程序

1. 啟動/停止 SQL Mail

-- 啟動 (參數可選)
EXEC xp_startmail @user = 'ProfileName', @password = 'Password';

-- 或企業管理員 → 支援服務 → SQL Mail 右鍵 → 啟動

-- 停止
EXEC xp_stopmail;

2. 發送郵件 - xp_sendmail 完整參數

EXEC xp_sendmail
    @recipients = 'recipient1@domain.com;recipient2@domain.com',  -- 必填,分號分隔
    @message = '郵件內文',
    @query = 'SELECT * FROM Orders WHERE OrderDate > GETDATE()-7',  -- 查詢結果附件
    @attachments = 'C:\Reports\Monthly.pdf',                        -- 檔案附件
    @copy_recipients = 'cc@domain.com',                             -- 副本
    @blind_copy_recipients = 'bcc@domain.com',                      -- 密件副本
    @subject = '每週訂單報表',
    @type = 'text/html',                                            -- 內容類型
    @attach_results = 'TRUE',                                       -- 查詢結果作附件
    @no_output = 'FALSE',                                           -- 是否抑制輸出
    @no_header = 'FALSE',                                           -- 是否省略欄位標題
    @width = 80,                                                    -- 文字模式行寬
    @separator = ',',                                               -- 欄位分隔符
    @echo_error = 'TRUE',                                           -- 回傳錯誤訊息
    @set_user = 'guest',                                            -- 查詢執行身分
    @dbuse = 'Northwind';                                           -- 查詢資料庫

參數詳細說明

參數說明預設值
@recipients收件人,分號分隔多位址必填
@message純文字郵件內文空字串
@queryT-SQL 查詢,結果可附件或內文NULL
@attachments檔案完整路徑,多檔分號分隔NULL
@attach_resultsTRUE=查詢結果存檔附件,FALSE=內文內嵌FALSE
@no_headerTRUE=不包含欄位名稱標題列FALSE
@set_user查詢執行權限內容guest
@dbuse查詢預設資料庫目前資料庫

3. 進階應用範例

範例 A:每日自動發送查詢報表

-- 建立排程作業步驟
EXEC msdb.dbo.sp_add_jobstep
    @job_name = 'Daily Sales Report',
    @step_name = 'Send Report',
    @subsystem = 'TSQL',
    @command = N'
        EXEC xp_sendmail
            @recipients = ''sales@company.com'',
            @subject = ''Daily Sales '' + CONVERT(VARCHAR(10), GETDATE(), 120),
            @query = ''SELECT ProductName, SUM(Quantity) AS TotalQty, SUM(Amount) AS TotalAmt 
                       FROM OrderDetails od JOIN Orders o ON od.OrderID = o.OrderID
                       WHERE o.OrderDate >= DATEADD(DAY, -1, GETDATE())
                       GROUP BY ProductName ORDER BY TotalAmt DESC'',
            @attach_results = ''TRUE'',
            @width = 200,
            @no_header = ''FALSE''';

範例 B:錯誤通知機制

BEGIN TRY
    -- 業務邏輯
END TRY
BEGIN CATCH
    EXEC xp_sendmail
        @recipients = 'dba@company.com',
        @subject = 'SQL Job Error: ' + ERROR_PROCEDURE(),
        @message = 'Error: ' + ERROR_MESSAGE() + CHAR(13) + 
                   'Line: ' + CAST(ERROR_LINE() AS VARCHAR) + CHAR(13) +
                   'Time: ' + CONVERT(VARCHAR, GETDATE(), 120),
        @echo_error = 'TRUE';
END CATCH

限制與注意事項

  • 依賴 MAPI 與 Outlook,需互動式登入桌面
  • SQL Server Agent 服務帳戶必須擁有 Outlook 設定檔
  • 不支援現代認證、OAuth2、TLS 1.2+ 強制環境
  • 附件大小受限於 Exchange/郵件伺服器策略
  • 已標記為 Deprecated,SQL Server 2005+ 建議遷移至 Database Mail

遷移路徑:SQL Mail → Database Mail

  1. 建立 Database Mail 帳戶與設定檔 (參考前文章)
  2. 逐一替換作業步驟:xp_sendmail → sp_send_dbmail
  3. 測試驗證:附件、查詢結果、HTML 格式、編碼
  4. 停用 SQL Mail:xp_stopmail,移除啟動項目

SQL Mail 是 SQL Server 2000 時代的產物,理解其參數有助於平滑遷移至 Database Mail,但新專案請直接採用原生 SMTP 方案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved