检查sp_send_dbmail是否成功

时间:2013-02-01 15:33:21

标签: sql-server tsql

我正在寻找一种方法来检查使用sp_send_dbmail排队的特定电子邮件是否最终成功从我们的Exchange服务器发送。我查看了系统表msdb.dbo.sysmail_mailitemsmsdb.dbo.sysmail_logmsdb.dbo.sysmail_log似乎更有帮助;具体来说,它是description列。从我到目前为止进行的测试来看,似乎每当发生错误时,description列中都会显示以下格式的消息:

  

由于邮件的原因,邮件无法发送给收件人   服务器故障。 (使用帐户3发送邮件(2012-11-01T11:28:04)。   异常消息:无法将邮件发送到邮件服务器。 (邮箱   不可用。服务器响应为:5.7.1无法中继   thisemail@email.com)。 )

这包含了共享相同process_id的其他行。封闭记录的描述是

  

启动DatabaseMail流程

  

DatabaseMail进程正在关闭

如果成功发送电子邮件,表中会记录相同的2行,但它们之间没有封闭的行。

因此,如果我成功发送,表格中会显示以下内容

enter image description here

如果发送失败,日志会记录此

enter image description here

如果发送失败或发送成功,是否还有其他实例可以记录条目?例如,发送可能有4行条目(当它启动时关闭时有2个,当它关闭时有2个说明,并且有2个封闭表明电子邮件已成功发送)。我发现没有与上面列出的模式不同的日志记录,但是在我根据这个假设编写逻辑之前我想确定。

2 个答案:

答案 0 :(得分:31)

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())

答案 1 :(得分:8)

Microsoft的这个链接似乎很有用 - How to: Check the Status of E-Mail Messages Sent With Database Mail (Transact-SQL)。另请参阅有关数据库邮件记录和审核,数据库邮件故障排除的相关主题。