数据库邮件故障排除:邮件已排队,但未传递

本主题说明如何解决电子邮件已成功排队但没有传送的问题。

诊断问题

数据库邮件外部程序在 msdb 数据库中记录电子邮件活动。

首先,要确认数据库邮件是否已启用,应使用 sp_configure 系统存储过程的 Database Mail XPs 选项

然后在 msdb 数据库中执行下面的语句,检查邮件队列的状态:

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_event_log 视图中有一些项,请在 sysmail_allitems 视图中检查邮件的状态。

“未发送”邮件状态

“未发送”状态表示数据库邮件外部程序还没有处理电子邮件。数据库邮件外部程序可能在处理邮件方面滞后;外部程序处理邮件的速度取决于网络条件、重试超时、邮件量以及 SMTP 服务器的容量。如果仍然存在问题,请考虑使用多个配置文件在多个 SMTP 服务器之间分配邮件。

检查已成功传送的邮件的最新修改日期。如果上次成功传送发生在一段时间以前,请检查 sysmail_event_log 视图,验证外部程序是否由 Service Broker 成功启动。如果上一次尝试没有启动外部程序,请验证数据库邮件外部程序是否位于正确目录,并且 SQL Server 服务帐户是否具有运行可执行文件的权限。

注意注意

若要删除旧的未发送邮件,请等待无法传送的邮件成为队列中最早的邮件,然后使用 sysmail_delete_mailitems_sp 删除它们。

“正在重试”邮件状态

正在重试的状态表示数据库邮件外部程序已经尝试将邮件传送到 SMTP 服务器,但没有成功。这通常是由网络中断、SMTP 服务器故障或数据库邮件帐户配置不正确导致的。邮件传送最终不是成功就是失败,并在事件日志中记录一条消息。

“已发送”邮件状态

“已发送”状态表示数据库邮件外部程序已将电子邮件成功传送给 SMTP 服务器。如果邮件没有抵达目标地址,说明 SMTP 服务器从数据库邮件外部程序接受了邮件,但未将邮件传送给最终收件人。请检查 SMTP 服务器的日志,或与 SMTP 服务器的管理员联系。您还可以使用另外的客户端(如 Outlook Express)来测试 SMTP 邮件服务器。

“失败”邮件状态

“失败”状态表示数据库邮件外部程序无法将邮件传送给 SMTP 服务器。在这种情况下,sysmail_event_log 视图中会包含来自外部程序的详细信息。有关用于联接 sysmail_faileditemssysmail_event_log 以检索详细的错误消息的示例查询,请参阅如何检查使用数据库邮件发送的电子邮件的状态 (Transact-SQL)。最常见的失败原因是目标地址不正确,或者由于网络问题而导致外部程序无法到达一个或多个故障转移帐户。SMTP 服务器的问题也可能会导致该服务器拒绝邮件。可以使用数据库邮件配置向导,将“日志记录级别”更改为“详细”,然后发送一封测试邮件来查找故障点。