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

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

确定是否启用了数据库邮件

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

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

    在“结果”窗格中,确认 Database Mail XPs 的 run_value 设置为 1。

    如果 run_value 不为 1,将不会启用数据库邮件。数据库邮件不会自动启用,以减少恶意用户可用来发起攻击的功能数。有关详细信息,请参阅了解外围应用配置器

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

    sp_configure 'Database Mail XPs', 1; 
    GO
    RECONFIGURE;
    GO
    
  3. 要将 sp_configure 过程还原为不显示高级选项的默认状态,请执行下面的代码:

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

确定是否对用户进行了正确的配置以发送数据库邮件

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

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

    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,请使用 sysmail_stop_sp 尝试停止队列,然后再使用 sysmail_start_sp 启动队列。

注意注意

使用 sysmail_help_queue_sp 结果集中的 length 列确定邮件队列中的电子邮件数量。

确定数据库邮件中的问题是影响配置文件中的所有帐户,还是只影响某些帐户

  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 服务器问题。

安全性

只有 sysadmin 固定服务器角色的成员才能对数据库邮件的所有方面进行故障排除。如果用户不是 sysadmin 固定服务器角色的成员,则只能获得他们尝试发送的电子邮件的有关信息,而不能获得其他用户发送的电子邮件的有关信息。