37

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

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

这包含在共享相同的其他行中process_id。随附记录的描述是

DatabaseMail 进程已启动

DatabaseMail 进程正在关闭

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

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

在此处输入图像描述

如果我发送失败,日志会记录这个

在此处输入图像描述

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

4

2 回答 2

42

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())
于 2014-09-26T21:45:56.730 回答
9

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

于 2013-02-01T18:38:52.663 回答