我正在寻找一种方法来检查使用sp_send_dbmail
排队的特定电子邮件是否最终成功从我们的Exchange服务器发送。我查看了系统表msdb.dbo.sysmail_mailitems
和msdb.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个说明,并且有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)。另请参阅有关数据库邮件记录和审核,数据库邮件故障排除的相关主题。