在一資料庫伺服器(Microsoft SQL Server 2014 (SP2) (KB3171021) - 12.0.5000.0 (X64))發現有個作業調用Database Mail發送郵件時,有時候出現同樣的郵件發送兩封的情況,經過詳細檢查,排除了該作業裡面業務邏輯有問題的情況,確實存在重覆... ...
在一資料庫伺服器(Microsoft SQL Server 2014 (SP2) (KB3171021) - 12.0.5000.0 (X64))發現有個作業調用Database Mail發送郵件時,有時候出現同樣的郵件發送兩封的情況,經過詳細檢查,排除了該作業裡面業務邏輯有問題的情況,確實存在重覆發送郵件的情況, 檢查Database Mail日誌,發現在0:00~0.03報“The mail could not be sent to the recipients because of the mail server failure. (Sending Mail using Account 1 (2016-10-27T00:03:21). Exception Message: Cannot send mails to mail server”這類的錯誤,具體信息如下所示
Date 2016/10/27 0:03:21
Log Database Mail (Database Mail Log)
Log ID 29022
Process ID 11300
Mail Item ID 747326
Last Modified 2016/10/27 0:03:21
Last Modified By sa
Message
The mail could not be sent to the recipients because of the mail server failure. (Sending Mail using Account 1 (2016-10-27T00:03:21). Exception Message: Cannot send mails to mail server. (Mailbox unavailable. The server response was: 5.7.1 Unable to relay for [email protected]).
)
從上面日誌可以看到是SMTP反饋[email protected]這個郵箱無法送達。Mail Item ID就可以查到相關,然後和開發人員一排查,就找到了發送郵件的存儲過程,檢查發現還是因為其中一個郵箱地址弄錯了,導致這些錯誤出現在Database Mail日誌中,當然如果遇到這類錯誤,必須查看Exception Message: Cannot send mails to mail server後面括弧裡面詳細的報錯信息,然後檢查、分析確認(Mailbox unavailable. The server response was: 5.7.1 Unable to relay for [email protected]). 不同的日誌信息,往往反饋不同的問題。也正是這種情況的郵件,都出現了重覆發送情況。
手工測試這樣的情形(發送給多個收件人,其中一個郵件名稱故意寫錯),發現郵箱確實會收到兩封這樣的郵件。
EXEC msdb.dbo.sp_send_dbmail @subject='郵件重覆發生問題測試——1',@recipients='[email protected];[email protected]',@body='test the email send twice problem';
然後我想定位到底是SQL Server版本問題,還是SMTP設置問題,結果測試過程讓我更迷惑了
1: 測試了SQL Server 2008配置了同樣SMTP伺服器的資料庫,發現這種情況,郵件不會重覆發送。那麼可以排除SMTP的一些設置問題導致。
2: 測試了SQL Server 2014相同版本,相同SMTP配置的資料庫,發現這種情況,居然不會發生郵件重覆發送的情況。吶呢,讓人懵了。也就是只有那台環境下才會出現這種情況,其它環境都無法重現。
3: 檢查了Database Mail配置信息以及系統參數設置,基本一致,沒有區別。也不應該是這個導致郵件重覆發送問題。
4: 系統管理員幫忙檢查了SMTP伺服器的日誌,發現重覆發送的郵件除了下麵Message ID不一樣外,其它一樣,但是檢查msdb.dbo.sysmail_mailitems表裡面記錄,只有一條發送記錄。如下截圖所示
網上也搜索了一下,沒有看到類似的問題或bug信息。真是一個非常奇怪的問題,好在這個問題解決倒非常簡單。 不過問題的詭異倒是讓人摸不著頭腦。