数据库邮件故障排除:邮件已排队,但 sysmail_event_log 或 Windows 应用程序事件日志中没有任何条目

本主题说明如何解决下面的问题:电子邮件已成功排队,但 sysmail_event_log 视图或 Windows 应用程序事件日志中没有显示外部程序的任何活动。

数据库邮件使用 Service Broker 来对电子邮件进行排队。如果数据库邮件已停止,或者尚未在 msdb 数据库中激活 Service Broker 消息传递功能,数据库邮件将对消息进行排队,但无法传递消息。在这种情况下,Service Broker 消息将保留在 Service Broker 邮件队列中。由于 Service Broker 未激活外部程序,因此 sysmail_event_log 中没有日志项,并且 sysmail_allitems 和相关视图中的项状态也没有更新。

执行下面的语句检查数据库邮件是否已启用:

SELECT is_broker_enabled FROM sys.databases WHERE name = 'msdb';

值为 0 表示未在 msdb 数据库中激活 Service Broker 消息传递功能。若要解决此问题,请在此数据库中激活 Service Broker。有关激活 Service Broker 消息传递功能的信息,请参阅如何在数据库中激活 Service Broker 消息传递 (Transact-SQL)

数据库邮件依赖于多个内部存储过程。为了减少外围应用,在新安装的 SQL Server 中,这些存储过程是禁用的。若要启用这些存储过程,请使用 sp_configure 系统存储过程的数据库邮件 XP 选项

可以在 msdb 数据库中停止数据库邮件。若要检查数据库邮件的状态,请执行下面的语句:

EXECUTE dbo.sysmail_help_status_sp;

若要在邮件主机数据库中启动数据库邮件,请在 msdb 数据库中运行以下命令:

EXECUTE dbo.sysmail_start_sp;

激活 Service Broker 后,它将检查消息对话框生存期;因此,已处于 Service Broker 传递队列中的对话框生存期长于已配置的对话框生存期的任何消息将立即失败。数据库邮件会在 sysmail_allitems 和相关视图中更新失败邮件的状态。必须决定是否再次发送电子邮件。有关配置数据库邮件使用的对话框生存期的详细信息,请参阅 sysmail_configure_sp (Transact-SQL)