本文介绍如何排查数据库邮件中的电子邮件已成功排队但邮件未送达的问题。
诊断问题
数据库邮件外部程序记录数据库中的电子邮件活动 msdb
。
首先,为确认数据库邮件已启用,请使用数据库邮件 XP(服务器配置选项)的
sp_configure
系统存储过程,如以下示例所示:EXEC sp_configure 'show advanced', 1; RECONFIGURE; EXEC sp_configure; GO
然后,在
msdb
数据库中执行以下语句以检查邮件队列的状态:EXEC msdb.dbo.sysmail_help_queue_sp @queue_type = 'Mail';
有关列的详细说明,请参阅 sysmail_help_queue_sp (Transact-SQL)。
检查
sysmail_event_log
活动视图。 该视图应当包含这样一项,声明数据库邮件外部程序已经启动。 如果sysmail_event_log
视图中没有条目,请参阅sysmail_event_log
中的症状 消息已排队,没有条目。如果视图中存在错误
sysmail_event_log
,请对特定错误进行故障排除。 检查sysmail_allitems
视图,了解消息的状态。
“未发送”邮件状态
未发送的状态表示数据库邮件外部程序尚未处理电子邮件。
数据库邮件外部程序可能在处理邮件时落后;外部程序处理消息的速率取决于网络条件、重试超时、消息量和 SMTP 服务器的容量。 如果仍然存在问题,请考虑使用多个配置文件在多个 SMTP 服务器之间分配邮件。 查看从 SQL Server 发送的电子邮件批量,以验证已发送的电子邮件是否有效且符合预期。
检查已成功传送的邮件的最新修改日期。 如果上次成功传递发生在某个时间前,请检查 sysmail_event_log
视图以验证 Service Broker 是否已成功启动外部程序。 如果上一次尝试没有启动外部程序,请验证数据库邮件外部程序是否位于正确目录中,并且 SQL Server 服务帐户是否具有运行可执行文件的权限。 检查 Windows 应用程序事件日志中是否存在与数据库邮件相关的错误。
注意
若要删除旧的未发送消息,请等到不可传递的消息是队列中最早的消息,然后使用系统存储过程 msdb.dbo.sysmail_delete_mailitems_sp 删除它们。
“正在重试”邮件状态
重试状态表示数据库邮件尝试将邮件传递到 SMTP 服务器,但无法传递。 这通常是由网络中断、SMTP 服务器故障或数据库邮件帐户配置不正确导致的。 消息最终应成功或失败,并将消息发布到 Windows 应用程序事件日志。
“已发送”邮件状态
“已发送”状态表示数据库邮件外部程序已将电子邮件成功发送给 SMTP 服务器。
如果邮件没有抵达目标地址,说明 SMTP 服务器从数据库邮件外部程序接受了邮件,但未将邮件传送给最终收件人。 请检查 SMTP 服务器的日志,或与 SMTP 服务器的管理员联系。 您还可以使用另外的客户端(如 Outlook Express)来测试 SMTP 邮件服务器。
“失败”邮件状态
“失败”状态表示数据库邮件外部程序无法将邮件发送给 SMTP 服务器。
在这种情况下, msdb.dbo.sysmail_event_log
系统视图包含外部程序的详细信息。 要获取用于连接 sysmail_faileditems
和 sysmail_event_log
的示例查询以检索详细错误消息,请参阅 检查使用数据库邮件发送的电子邮件的状态。 最常见的失败原因是目标地址不正确,或者由于网络问题而导致外部程序无法到达一个或多个故障转移帐户。 SMTP 服务器的问题也可能会导致该服务器拒绝邮件。 可以使用数据库邮件配置向导,将“日志记录级别”更改为“详细”,然后发送一封测试邮件来查找故障点。