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

SQL Server 配置 Database Mail 發送郵件完整教程(無 Exchange 環境)

     編輯:關於SqlServer

現代 SQL Server (2005+) 推薦使用 Database Mail 替代舊版 xp_sendmail/SQLMail(依賴 MAPI/Outlook/Exchange)。Database Mail 基於 SMTP,無需 Outlook/Exchange,支援 SSL/TLS、多設定檔、異步佇列、重試機制,配置更簡單、穩定。

環境準備

  • SQL Server 2005/2008/2012/2016/2019/2022
  • 可達的 SMTP 伺服器(如 smtp.163.com、smtp.gmail.com、內網郵件網關)
  • 有效郵箱帳號/密碼(或授權碼)

步驟一:啟用 Database Mail(若未啟用)

EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
EXEC sp_configure 'Database Mail XPs', 1; RECONFIGURE;

步驟二:創建郵件帳號

EXEC msdb.dbo.sysmail_add_account_sp
    @account_name = 'MySmtpAccount',
    @email_address = 'sender@company.com',
    @display_name = 'SQL Server Auto Mailer',
    @replyto_address = 'noreply@company.com',
    @description = 'SMTP account for DB alerts',
    @mailserver_name = 'smtp.company.com',      -- SMTP 伺服器
    @port = 587,                                -- 587(TLS) / 465(SSL) / 25(無加密)
    @username = 'sender@company.com',
    @password = 'YourAuthCodeOrPassword',
    @enable_ssl = 1;                            -- 1=SSL/TLS, 0=無加密

步驟三:創建郵件設定檔並關聯帳號

EXEC msdb.dbo.sysmail_add_profile_sp
    @profile_name = 'DefaultProfile',
    @description = 'Default mail profile for all DBs';

EXEC msdb.dbo.sysmail_add_profileaccount_sp
    @profile_name = 'DefaultProfile',
    @account_name = 'MySmtpAccount',
    @sequence_number = 1;  -- 優先級,多帳號時生效

步驟四:授予用戶/角色使用權限

EXEC msdb.dbo.sysmail_add_principalprofile_sp
    @profile_name = 'DefaultProfile',
    @principal_name = 'public',  -- 或特定用戶/角色
    @is_default = 1;             -- 設為預設

步驟五:發送測試郵件

EXEC msdb.dbo.sp_send_dbmail
    @profile_name = 'DefaultProfile',
    @recipients = 'admin@company.com',
    @subject = 'Test from SQL Server',
    @body = 'Database Mail 配置成功!',
    @body_format = 'HTML';  -- 或 'TEXT'

進階功能範例

發送查詢結果附件

EXEC msdb.dbo.sp_send_dbmail
    @profile_name = 'DefaultProfile',
    @recipients = 'dba@company.com',
    @subject = 'Daily Backup Report',
    @body = '附件為今日備份狀態',
    @query = 'SELECT Database_Name, Backup_Start_Date, Backup_Finish_Date, Backup_Size_MB FROM msdb.dbo.Backup_History WHERE Backup_Start_Date >= DATEADD(DAY, -1, GETDATE())',
    @attach_query_result_as_file = 1,
    @query_attachment_filename = 'BackupReport.csv',
    @query_result_separator = ',',
    @query_result_header = 1;

發送文件附件

EXEC msdb.dbo.sp_send_dbmail
    @profile_name = 'DefaultProfile',
    @recipients = 'admin@company.com',
    @subject = 'Error Log',
    @body = '請查收錯誤日志',
    @file_attachments = 'C:\Logs\ERRORLOG';

故障排查清單

現象排查方向
郵件卡在佇列 (sent_status = unsent)查看 msdb.dbo.sysmail_event_log 錯誤碼;檢查 SMTP 連通性、防火牆、端口、SSL 設定
認證失敗確認帳號/密碼/授權碼;Gmail/Outlook 需開啟「低安全性應用」或生成應用專用密碼
發件人被拒SMTP 伺服器要求發件人與認證帳號一致;設置 @email_address = @username
大附件失敗調整 @max_attach_size (預設 1MB) 或 SMTP 伺服器限制

遺留 xp_sendmail 遷移提示

舊代碼 EXEC master..xp_sendmail ... 需逐一改為 sp_send_dbmail,參數映射:

  • @recipients → @recipients
  • @subject → @subject
  • @message → @body
  • 附件/查詢結果 → 新增參數 @file_attachments/@query

總結

Database Mail 是 SQL Server 發送郵件的標準、現代、無依賴方案。棄用 SQLMail/MAPI/Outlook,擁抱 SMTP + Database Mail,獲得更好的可靠性、安全性與可維護性。

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