常规数据库邮件故障排除步骤

适用于:SQL ServerAzure SQL 托管实例

数据库邮件故障排除涉及到对数据库邮件系统进行下列方面的常规检查。 这些过程按逻辑顺序介绍,但可以按任何顺序进行评估。

权限

必须是 sysadmin 固定服务器角色的成员才能排查数据库邮件的各个方面问题。 不是 sysadmin 固定服务器角色成员的用户只能获取有关他们尝试发送的电子邮件的信息,而不能获取其他用户发送的电子邮件的信息。

是否启用数据库邮件

  1. SQL Server Management Studio 中,使用查询编辑器窗口连接到 SQL Server 实例,然后执行以下代码:

    sp_configure 'show advanced', 1; 
    GO
    RECONFIGURE;
    GO
    sp_configure;
    GO
    

    在结果窗格中,确认run_value数据库邮件 XPs(服务器配置选项)已设置为1

    如果run_value不是1,则数据库邮件未启用。

    数据库邮件不会自动启用,这是为了减少恶意用户可用来发起攻击的功能数量。 有关详细信息,请参阅外围应用配置

  2. 如果确定可以启用数据库邮件,请执行下面的代码:

    sp_configure 'show advanced', 1; 
    GO
    RECONFIGURE;
    GO
    sp_configure 'Database Mail XPs', 1; 
    GO
    RECONFIGURE;
    GO
    

    若要将 sp_configure 过程还原为其默认状态(不显示高级选项),请执行以下代码:

    sp_configure 'show advanced', 0; 
    GO
    RECONFIGURE;
    GO
    

用户是否已正确配置为发送邮件

  1. 要发送数据库邮件,用户必须是 数据库中 DatabaseMailUserRole 数据库角色的成员msdb。 sysadmin 固定服务器角色和 msdbdb_owner 角色的成员将自动成为 DatabaseMailUserRole 角色的成员。 要列出 DatabaseMailUserRole 的所有其他成员,请执行以下语句

    EXEC msdb.sys.sp_helprolemember 'DatabaseMailUserRole';
    
  2. 要将用户添加到 DatabaseMailUserRole 角色中,请使用以下语句

    USE msdb;
    GO
    
    sp_addrolemember @rolename = 'DatabaseMailUserRole'
    ,@membername = '<database user>';
    
  3. 若要发送数据库邮件,用户必须有权访问至少一个数据库邮件配置文件。 若要列出用户(主体)及其有权访问的配置文件,请执行以下语句:

    EXEC msdb.dbo.sysmail_help_principalprofile_sp;
    
  4. 使用数据库邮件配置向导 创建配置文件 并向用户授予对配置文件的访问权限。

是否启动数据库邮件

当有电子邮件要处理时,将激活数据库邮件外部程序。 如果达到指定的超时期限时没有邮件要发送,该程序将退出。

  1. 要确认是否已启动数据库邮件激活,请执行以下语句:

    EXEC msdb.dbo.sysmail_help_status_sp;
    
  2. 如果未启动数据库邮件激活,请执行以下语句将其启动:

    EXEC msdb.dbo.sysmail_start_sp;
    
  3. 如果已启动数据库邮件外部程序,请使用以下语句检查邮件队列的状态:

    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_splength列来确定邮件队列中的电子邮件数。

问题是否影响某些或所有帐户

如果确定某些但并非所有配置文件都可以发送邮件,则问题配置文件使用的数据库邮件帐户可能存在问题。

  1. 若要确定哪些帐户可以成功发送邮件,请执行以下语句:

    SELECT sent_account_id, sent_date FROM msdb.dbo.sysmail_sentitems;
    
  2. 如果有问题的配置文件未使用列出的任何帐户,那么可能是该配置文件可以使用的所有帐户都不能正常工作。 若要测试各个帐户,请使用数据库邮件配置向导创建一个只包含一个用户的新配置文件,然后通过“发送测试电子邮件”对话框使用新帐户发送邮件。

  3. 若要查看数据库邮件返回的错误消息,请执行以下语句:

    SELECT * FROM msdb.dbo.sysmail_event_log;
    

    注意

    当邮件被成功传递到 SMTP 邮件服务器上时,数据库邮件即认为邮件已被发送。 虽然后续错误(例如,收件人的电子邮件地址无效)仍然可能会使邮件无法传递,但是不会包含在数据库邮件日志中。

重试邮件发送

  1. 如果确定数据库邮件由于无法可靠地到达 SMTP 服务器而失败,则可以通过增加数据库邮件尝试发送每封邮件的次数来增加成功的邮件传递率。 启动数据库邮件配置向导,然后选择“查看或更改系统参数”选项。 还可以增加与配置文件关联的帐户数量,从而在从主帐户进行故障转移时,数据库邮件将使用故障转移帐户发送电子邮件。

  2. 在“配置系统参数”页上,“帐户重试次数”的默认值为 5 次,“帐户重试延迟时间”的默认值为 60 秒,这意味着如果在 5 分钟之内不能到达 SMTP 服务器,邮件发送将失败。 增大这些参数可以延长邮件发送失败之前的时间。

    注意

    发送大量消息时,较大的默认值可能会提高可靠性,但会大大增加资源的使用,因为尝试反复传递许多消息。 若要从根本上解决问题,需要解决阻碍数据库邮件与 SMTP 服务器快速建立联系的网络问题或 SMTP 服务器问题。

验证是否已在 msdb 上启用 SQL 代理

要使用数据库邮件,需要为 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;