适用于:
SQL Server
Azure SQL 托管实例
数据库邮件故障排除涉及到对数据库邮件系统进行下列方面的常规检查。 这些过程按逻辑顺序介绍,但可以按任何顺序进行评估。
只有 sysadmin 固定服务器角色的成员才能对数据库邮件的所有方面进行故障排除。 不是 sysadmin 固定服务器角色成员的用户只能获取有关他们尝试发送的电子邮件的信息,而不能获取其他用户发送的电子邮件的信息。
是否启用数据库邮件
在 SQL Server Management Studio 中,使用查询编辑器窗口连接到 SQL Server 实例,然后执行以下代码:
sp_configure 'show advanced', 1;
RECONFIGURE;
sp_configure;
在结果窗格中,确认数据库邮件 XP 的 run_value 是否设置为 1。
如果run_value不是 1,则不会启用数据库邮件。 数据库邮件不会自动启用,以减少恶意用户可攻击的功能数量。 有关详细信息,请参阅了解外围应用配置。
如果决定启用数据库邮件,请执行以下代码:
sp_configure 'Database Mail XPs', 1;
RECONFIGURE;
若要将sp_configure过程还原到其默认状态(不显示高级选项),请执行以下代码:
sp_configure 'show advanced', 0;
RECONFIGURE;
若要发送数据库邮件,用户必须是数据库中 DatabaseMailUserRole 数据库角色msdb
的成员。 sysadmin 固定服务器角色和 msdb
db_owner 角色的成员自动是 DatabaseMailUserRole 角色的成员。 若要列出 DatabaseMailUserRole 的所有其他成员,请执行以下语句:
EXEC msdb.sys.sp_helprolemember 'DatabaseMailUserRole';
若要将用户添加到 DatabaseMailUserRole 角色,请使用以下语句:
USE msdb;
sp_addrolemember @rolename = 'DatabaseMailUserRole'
,@membername = '<database user>';
若要发送数据库邮件,用户必须有权访问至少一个数据库邮件配置文件。 若要列出用户(主体)及其有权访问的配置文件,请执行以下语句:
EXEC msdb.dbo.sysmail_help_principalprofile_sp;
使用数据库邮件配置向导创建配置文件并授予用户访问这些配置文件的权限。
是否启动数据库邮件
当有电子邮件要处理时,将激活数据库邮件外部程序。 如果达到指定的超时期限时没有邮件要发送,该程序将退出。 要确认是否已启动数据库邮件激活,请执行以下语句:
EXEC msdb.dbo.sysmail_help_status_sp;
如果未启动数据库邮件激活,请执行以下语句来启动它:
EXEC msdb.dbo.sysmail_start_sp;
如果已启动数据库邮件外部程序,请使用以下语句检查邮件队列的状态:
EXEC msdb.dbo.sysmail_help_queue_sp @queue_type = 'mail';
邮件队列的状态应为 RECEIVES_OCCURRING
。 邮件队列的状态可能会不时发生改变。 如果邮件队列状态不是 RECEIVES_OCCURRING
,请尝试重启队列。 请使用以下语句停止队列:
EXEC msdb.dbo.sysmail_stop_sp;
请使用以下语句启动队列:
EXEC msdb.dbo.sysmail_start_sp;
使用 的结果集中的 sysmail_help_queue_sp
length 列来确定邮件队列中的电子邮件数。
问题是否影响某些或所有帐户
如果已确定某些配置文件(但不是所有配置文件)可以发送邮件,则问题配置文件使用的数据库邮件帐户可能存在问题。 若要确定哪些帐户可以成功发送邮件,请执行以下语句:
SELECT sent_account_id, sent_date FROM msdb.dbo.sysmail_sentitems;
如果非工作配置文件未使用列出的任何帐户,则可能是可用于该配置文件的所有帐户都无法正常工作。 若要测试各个帐户,请使用数据库邮件配置向导创建一个只包含一个用户的新配置文件,然后通过“发送测试电子邮件”对话框使用新帐户发送邮件。
若要查看数据库邮件返回的错误消息,请执行以下语句:
SELECT * FROM msdb.dbo.sysmail_event_log;
当邮件被成功传递到 SMTP 邮件服务器上时,数据库邮件即认为邮件已被发送。 虽然后续错误(例如,收件人的电子邮件地址无效)仍然可能会使邮件无法传递,但是不会包含在数据库邮件日志中。
重试邮件发送
如果确定数据库邮件由于无法可靠地到达 SMTP 服务器而失败,则可以通过增加尝试发送每封邮件数据库邮件次数来提高成功邮件传递率。 启动数据库邮件配置向导,然后选择“查看或更改系统参数”选项。 或者,可以将更多帐户关联到配置文件,以便在从主帐户进行故障转移时,数据库邮件使用故障转移帐户发送电子邮件。
在“配置系统参数”页上,“帐户重试尝试次数”的默认值为 5 次,对于“帐户重试延迟”,默认值为 60 秒,这意味着如果在 5 分钟内无法访问 SMTP 服务器,则邮件传递将失败。 增大这些参数可以延长邮件发送失败之前的时间。
当发送大量邮件时,虽然较大的默认值可以提高可靠性,但会显著增加资源的使用量,因为会一遍又一遍地尝试传递大量邮件。 若要从根本上解决问题,需要解决阻碍数据库邮件与 SMTP 服务器快速建立联系的网络问题或 SMTP 服务器问题。
验证是否为 msdb 启用了 Service Broker
数据库邮件要求为 msdb
数据库启用 Service Broker。 使用以下 T-SQL 脚本验证是否在 上 msdb
启用了 Service Broker:
SELECT is_broker_enabled FROM sys.databases WHERE name = 'msdb' ; -- should be 1
如果未启用,则必须启用 Service Broker。 但是,以下示例脚本需要对 msdb
系统数据库进行独占访问,因此在典型的营业时间内执行该脚本可能不可行。 有关详细信息,请参阅 ALTER DATABASE ... SET ENABLE_BROKER。
ALTER DATABASE msdb SET ENABLE_BROKER;
数据库邮件配置对象
数据库邮件消息处理对象
数据库邮件外部程序
数据库邮件日志和审核
配置 SQL Server 代理
配置 SQL Server 代理邮件以使用数据库邮件