【sql server邮件】数据库邮件功能

一、邮件服务设置

  1、设置邮件服务器 

    邮箱设置-POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务

    

    开启POP3/SMTP服务,点击开始,然后点击下方的【生成授权码】,会提示发送短信,然后获得的授权码就是数据库发送邮件帐号的密码。

  2、配置数据库邮件

手动启用数据库邮件功能,需执行以下脚本:

exec sp_configure 'show advanced options',1
RECONFIGURE

exec sp_configure 'Database Mail XPs',1
RECONFIGURE With Override

 

    2.1 连接上数据库,管理-数据库邮件-右键-配置数据库邮件

    

    

    2.2 在选择配置任务中,如果是新增选择【通过执行以下任务来安装数据库邮件】,如果是修改,可选择【管理数据库邮件账户和配置文件】

    

    2.3 配置SMTP账户,如果已有SMTP账户,可在下方列表中看到;如果没有,点击添加即可。

    

    2.4 新增数据库邮件账户

      a. 账户名:可根据实际情况新增

      b. 电子邮件地址:开通POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务的邮箱

      c. 显示名称:可根据实际情况新增

      d. 服务器名称:如果电子邮件地址是QQ邮箱,smtp.qq.com。

      e. 此服务器要求安全连接(SSL),打勾。

      f. 基本身份验证:用户名为电子邮箱地址;密码为授权码。

    

额外说明(仅限内网,要外网的话还是乖乖写服务器上存在的正经的邮件地址)  

但其实,只要可以直连邮件服务器不需要验证,则可以随便写电子邮件地址,但电子邮件地址必须是规范的邮件地址格式。(比如不能包含中文等)

 

 

     

  收到的信息如下:

    

 

 

 

 

    2.5 录入完成后,可看到smtp账户列表。

    

    2.6 接下来需要选择安全公共配置,选中刚才配置的文件名,然后后面默认为配置文件,建议选“否”,可根据实际情况配置。

    

    2.7 默认配置文件选“否”后,可根据实际情况修改系统参数。

    

  3、测试数据库邮件。

    3.1 在数据库界面测试,如下图

    

    在收件人处输入收件人邮箱即可。

    

    3.2 通过SQL脚本测试。 

    EXEC msdb.dbo.sp_send_dbmail 
      @profile_name = 'Test',       --配置文件名称
      @recipients = '123@QQ.com',    --收件email地址
      @subject = '你好',         --邮件主题
      @body = '…'            --邮件正文内容

二、实现JOB任务运行状态的检测  

使用SQL Server时,很多情况下都需要自定义Job进行部分功能的实现,而大部分时间是采取凌晨或者非业务期进行工作。

因而Job的运行结果的检测便形成了一个需要跟踪的问题,比如有时候N个Job的运行,只有几个出现问题,并且不确定的此Job发生在那个机器上,所以自动化运维的重要性就不言而喻了。

对于上面问题的解决,SQL Server提供了很简单的配置便可以实现。

 1、定义操作员

  

  备注:

    a. 姓名:操作员的姓名,可以是别名。

    b. 电子邮件名称:邮箱的地址。

    c. 寻呼值班计划:可根据实际情况设置时间

  

  2、新建警报:定义警报属性等。

  备注:

    a. 名称:在JOB属性设置时会用到。

    b. 数据库名称

  这里面的严重性选项其实是一个很重要的功能,一些简单的问题警告有时候是不需要及时关注的,或者说不需要暂时处理的。但是有些问题则需要里面去解决,比如服务器宕等。

  

  备注

    a. 执行作业:如果有多个作业的话,需选择具体的作业;如新建,可点击新建作业按钮。

    b. 通知操作员:选择需通知的操作员,可多个。

  

  3、设置SQL Server代理,在属性中选择警报系统。

  

  备注:

    a. 选择是否启用配置文件,邮件系统选择了数据库邮件,邮件配置文件可选择具体的配置。

    b. 启用防故障操作员

  

  4、新建作业

  

  

  5、运行结果

  

  SQL Server数据功能还是很强大的,这里简单实现了发邮件的功能,当时还可以灵活运用。

---------------------------------------------------------------------Take more responsibility!------------------------------------------------------------------

如何用代码实现呢?

 

在我们运维工作中,经常要对备份,ETL等作业进行监控,这时我们需要用到SQL SERVER自带的邮件服务器,其原理,我在这么里不多说,直接来实战。

下面是我对服务器配置源码,分享给大家,希望对大家有帮助。相关参考:sql server如何把查询结果发邮件出去

exec sp_configure 'show advanced options',1
RECONFIGURE WITH OVERRIDE  
go
exec sp_configure 'database mail xps',1 
RECONFIGURE WITH OVERRIDE  
go

--2.创建邮件帐户信息 
EXEC msdb..Sysmail_add_account_sp
  @ACCOUNT_NAME ='OCTMamiETL',-- 邮件帐户名称    
  @EMAIL_ADDRESS ='OCTMamiETL@163.com',-- 发件人邮件地址     
  @DISPLAY_NAME ='系统管理员',-- 发件人姓名  
  @REPLYTO_ADDRESS =NULL,
  @DESCRIPTION = NULL,
  @MAILSERVER_NAME = 'SMTP.163.COM',-- 邮件服务器地址    
  @MAILSERVER_TYPE = 'SMTP',-- 邮件协议      
  @PORT =25,-- 邮件服务器端口  
  @USERNAME = 'OCTMamiETL@163.com',-- 用户名  
  @PASSWORD = 'ABC123',-- 密码   
  @USE_DEFAULT_CREDENTIALS =0,
  @ENABLE_SSL =0,
  @ACCOUNT_ID = NULL

GO

--3.数据库配置文件
IF EXISTS(SELECT name
          FROM   msdb..sysmail_profile
          WHERE  name = N'ETLErrorProfileLog')
  BEGIN
      EXEC msdb..Sysmail_delete_profile_sp @profile_name='ETLErrorProfileLog'
  END

EXEC msdb..Sysmail_add_profile_sp
  @profile_name = 'ETLErrorProfileLog',-- profile 名称  
  @description = '数据库邮件配置文件',-- profile 描述    
  @profile_id = NULL

go

--4.用户和邮件配置文件相关联
EXEC msdb..Sysmail_add_profileaccount_sp
  @profile_name = 'ETLErrorProfileLog',-- profile 名称   
  @account_name = 'OCTMamiETL',-- account 名称     
  @sequence_number = 1 -- account 在 profile 中顺序
--5.发送文本测试邮件
EXEC msdb..Sp_send_dbmail
  @profile_name='ETLErrorProfileLog',
  @recipients='OCTMamiETL@163.com',--收件人
  @subject='Test title this is test ',
  @body=N'z中文邮件内容  中文邮件内容'

go

-----------------------------------------------------------------------------------
/*
    功能说明:启用警报系统里面的邮件配置
    参数说明: xp_instance_regwrite 修改注册表
*/
EXEC msdb.dbo.Sp_set_sqlagent_properties @email_save_in_sent_folder=1

EXEC master.dbo.Sp_mssetalertinfo @pagersendsubjectonly = 0 --启用警报系统 【在通知消息中包含电子邮件的正文】

EXEC master.dbo.Xp_instance_regread
  N'HKEY_LOCAL_MACHINE',--启用警报系统 【启用邮件配置文件】
  N'SOFTWARE\Microsoft\MSSQLServer\SQLServerAgent',
  N'DatabaseMailProfile' ---邮件系统【选择数据库邮件】

EXEC master.dbo.Xp_instance_regwrite
  N'HKEY_LOCAL_MACHINE',
  N'SOFTWARE\Microsoft\MSSQLServer\SQLServerAgent',
  N'UseDatabaseMail',
  N'REG_DWORD',

EXEC master.dbo.Xp_instance_regwrite
  N'HKEY_LOCAL_MACHINE',--启用警报系统 【启用邮件配置文件】
  N'SOFTWARE\Microsoft\MSSQLServer\SQLServerAgent',
  N'DatabaseMailProfile',---邮件系统【选择数据库邮件】
  N'REG_SZ',
  'ETLErrorProfileLog' ---邮件配置文件【邮件配置里面的SQLMailProfile】   

-----------------------------------------------------------------------------------
DECLARE @Sys_OperatorsName VARCHAR(100)

SET @Sys_OperatorsName='BSMicheal'

IF EXISTS (SELECT name
           FROM   msdb.dbo.sysoperators
           WHERE  name = @Sys_OperatorsName)
  BEGIN
      EXEC msdb..Sp_delete_operator @name = @Sys_OperatorsName -- 操作员
  END

EXEC msdb.dbo.Sp_add_operator
  @name = @Sys_OperatorsName,
  @enabled = 1,
  @weekday_pager_start_time = 90000,
  @weekday_pager_end_time = 180000,
  @saturday_pager_start_time = 90000,
  @saturday_pager_end_time = 180000,
  @sunday_pager_start_time = 90000,
  @sunday_pager_end_time = 180000,
  @pager_days = 127,
  @email_address = 'OCTMamiETL@163.com',-----仅可以对 SQL Mail 使用电子邮件别名。必须对数据库邮件使用电子邮件地址。
  @pager_address = N'',
  @netsend_address = N''

/*
    功能说明: 在Job中添加操作员的操作
    参数说明:  @notify_level_email指定何时将该作业的项放入 Microsoft Windows 应用程序日志。
               eventlog_level 的数据类型为 int 【0 从不 1 成功时 2 失败时 3 始终】         
    修改说明:Create by LY on 2011-010-10
*/
IF EXISTS (SELECT 1
           FROM   msdb.dbo.sysjobs
           WHERE  name = 'dad')
  BEGIN
      EXEC msdb.dbo.Sp_update_job
        @job_name = 'dad',---对应的作业名称
        @notify_level_email = 2,
        @notify_level_netsend = 2,
        @notify_level_page = 2,
        @notify_email_operator_name = 'BSMicheal' ---对应的操作员
  END;
View Code

 

 

 

当然,在配置过程中会遇到很多奇葩问题,我在这暂时不穷举了,总之一点,明白配置步骤,问题都不大,下面我说一下我觉得比较重要一个方面,权限控制,很容易被人忽略,因为我们数据库服务器不是本人配置,在配置的时候权限分配的不是到位,所以配置这个邮件服务功能有点曲折。

当我们调用作业用操作员发送的时候,发现怎么都发送不出去,后来在调试邮件中我发现了这行信息:

我就考虑到是不是该用户的权限不够,按照我正常的运维经验来看的话,配置SQL SERVER的时候这个用户所属的角色应该包含SYSADMIN这个的,所以我查看了该用户所属权限,果然,角色分配不对,后将其调整,作业可以正常发送邮件了。

 
 
参考文档:

转自:https://www.cnblogs.com/Zeros/p/8309378.html

参考:http://blog.51cto.com/jimshu/898241

相关文档:用代码发送:sql server如何把查询结果发邮件出去

posted @ 2018-07-27 12:11  郭大侠1  阅读(1697)  评论(0编辑  收藏  举报