透過Database Mail發送信件(MSSQL)

前幾篇文章有講到透過C#程式發送信件

這次來講解一下透過MSSQL發送信件的做法

首先要透過SSMS做一些設定,其方法如下:

1.在物件總管中的[管理],找到[DataBase Mail]節點,按右鍵選擇[設定DataBase Mail]

2.進入組態精靈

 

3.選取第一項新增設定

 

4.若沒有啟用DataBase Mail功能,在這裡選擇[是]啟用功能

 

5.進入設定檔頁面,先按加入設定帳戶

 

6.設定屬性

7.按確定後,SMTP帳戶會新增一欄

上面的設定檔名稱與描述也要輸入

這裡要記一下設定檔名稱,等一下會用到

 

8.按下一步,進到管理設定檔安全性,這裡就先勾選公用並按下一步

 

9.這裡可以設定一些系統參數,點選左欄的參數,下方會顯示描述

而右邊可以進行參數的修改

 

10.按完成後,就可以看到設定結果

 

11.接下來對[DataBase Mail]節點,按右鍵選擇[傳送測試電子郵件]

輸入測試信的收件者信箱後,點選傳送測試電子郵件

 

12.此時可以到信箱看有沒有收到信件

若沒收到信件,可以對[DataBase Mail]節點,按右鍵選擇[檢視DataBase Mail記錄]

裡面會列出Log,可以查看訊息來解決問題

通常無法寄出的原因有兩種

(1)加入SMTP帳戶的設定值沒設定好

這裡可以再按一次[設定DataBase Mail],選擇[管理DataBase Mail帳戶和設定檔]

選擇[檢視、變更或刪除現有的帳戶]來進行修改

(2)低安全性應用程式存取權

若是Log出現以下訊息

郵件伺服器失敗,所以無法將郵件傳送給收件者。

(使用帳戶 1 (2021-01-07T13:34:06) 傳送郵件。例外狀況訊息: 無法傳送郵件到郵件伺服器。

(SMTP 伺服器需要安全連接,或用戶端未經驗證。 伺服器回應為: 5.7.0 Authentication Required. Learn more at)。)

或者發信人信箱出現以下信件

這是因為Google對於低安全性應用程式存取權的預設值為關閉

所以只要開啟允許權限,就能順利寄出信件

設定路徑為:右上方的Google應用程式-->Google帳戶-->左邊的安全性

往下拉找到低安全性應用程式存取權

點進去後開啟即可

收到信件後,代表設定已完成,之後就可以透過MSSQL發送信件了

 

另外補充一點

若想看跟DataBase Mail相關的資料的話

可以進到物件總管中的[資料庫]-->[系統資料庫]-->[msdb]-->[資料表]-->[系統資料表]

找到dbo.sysmail開頭的table

像設定檔可以查看dbo.sysmail_profile

Log可以查看dbo.sysmail_log

 

 

接下來講解如何透過SQL語法寄出信件

主要的核心是透過SSMS內建的Stored Procedured來發信

SP的名稱為msdb.dbo.sp_send_dbmail

有興趣知道實作內容的話

可以進到物件總管中的[資料庫]-->[系統資料庫]-->[msdb]-->[可程式性]-->[預存程序]-->[系統預存程序]

裡面找到msdb.dbo.sp_send_dbmail這個SP

而一般會建立自己的SP去執行sp_send_dbmail

建立好SP後直接執行就可以寄出信了

以下為參考範例SP

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE SendMail AS
DECLARE @mail varchar(50)
DECLARE @msg varchar(1000)
DECLARE @title varchar(1000)
--下面五個是測試用table--Member的欄位
DECLARE @ID varchar(50)
DECLARE @Name varchar(50)
DECLARE @Account varchar(50)
DECLARE @Password varchar(50)
DECLARE @Email varchar(50)

--定義CURSOR取得資料
DECLARE @cur CURSOR
SET @cur = CURSOR FAST_FORWARD
FOR
select * from Member
OPEN @cur

FETCH NEXT FROM @cur
INTO @ID,@Name,@Account,@Password,@Email
WHILE @@FETCH_STATUS = 0
BEGIN

    --建立信件內容主體
    set @msg='ID:' + @ID + ',Name:' + @Name + ',Account:' + @Account + ',Password:' + @Password + ',Email' + @Email

    --透過執行sp_send_dbmail寄出信件
    exec msdb.dbo.sp_send_dbmail
    @profile_name='test',                --設定檔名稱(剛剛要讀者記住的名稱)
    @recipients='***@***',               --收件者
    --@copy_recipients='***@***',        --副本
    --@blind_copy_recipients='***@***',  --密件副本
    @subject='SQLServer測試',             --主旨
    @body=@msg,                          --內容
    --@query='select getdate()',         --可以下SQL
    --@file_attachments='C:\test.txt',   --附件
    --@attach_query_result_as_file=1,    --把query結果設為附件,若不設定就會出現在mail內容中
    @body_format=TEXT                    --內容使用text格式
    --@body_format=HTML'                 --內容使用HTML格式

    FETCH NEXT FROM @cur
    INTO @ID,@Name,@Account,@Password,@Email

END

CLOSE @cur
DEALLOCATE @cur
GO