2013-02-01 130 views
25

我正在尋找一種方法來檢查使用sp_send_dbmail排隊的特定電子郵件是否最終從我們的Exchange服務器成功發送。我看過系統表msdb.dbo.sysmail_mailitemsmsdb.dbo.sysmail_logmsdb.dbo.sysmail_log似乎是兩個更有幫助的;具體而言,其description列。從我目前所進行的試驗,似乎只要出現錯誤,在下面的格式的消息出現在description列:檢查sp_send_dbmail是否成功

郵件無法發送,因爲郵件服務器 的接收者失敗。 (2012-11-01T11:28:04發送郵件) 異常消息:無法向郵件服務器發送郵件(郵箱 不可用,服務器響應爲:5.7.1無法中繼 thisemail @ email )

這是與共享相同process_id的其他行一起附上。對於封閉記錄的描述是

DatabaseMail過程開始

DatabaseMail進程正在關閉

如果一封電子郵件發送成功,表格中記錄了相同的2行,但在它們之間沒有封閉的行。

所以,如果我有一個成功的發送,下面出現在表

enter image description here

,如果我有一個發送失敗,日誌記錄本

enter image description here

是否有如果發送失敗或發送成功,可以記錄條目的其他實例?例如,是否有可能有4行的發送條目(包含2個說明它何時開始和何時關閉,以及2封說明電子郵件已成功發送)。我沒有發現與上面列出的模式不同的日誌記錄,但希望在我根據此假設編寫邏輯之前確定它們。

回答

22

sysmail_faileditems只會給你一個失敗的電子郵件列表。如果您需要查看成功電子郵件列表,您需要使用sysmail_mailitems

使用下面的查詢來獲取所有的電子郵件信息發送同一日期:

SELECT * FROM msdb..sysmail_mailitems WHERE sent_date > DATEADD(DAY, -1,GETDATE()) 

這裏是完整的查詢來獲取所有失敗的郵件從過去24小時內:

SELECT items.subject , 
     items.recipients , 
     items.copy_recipients , 
     items.blind_copy_recipients , 
     items.last_mod_date , 
     l.description 
FROM msdb.dbo.sysmail_faileditems AS items 
     LEFT OUTER JOIN msdb.dbo.sysmail_event_log AS l 
        ON items.mailitem_id = l.mailitem_id 
WHERE items.last_mod_date > DATEADD(DAY, -1,GETDATE())