[MSSQL]如何用SQLServer自动发送邮件

通常我们用SQL Server进行定期的大量计算后,都希望能收到一些通知形的Email告诉我们一些简单信息,如操作是否开始了?操作是否进行中?计算结果是多少?操作过程中是否有错误?如果希望得到更加详细的信息,类似与进度条之类的消息,如此次操作一共有多少步骤?现在进行到了第几步?上一步是否正常完成?上一步计算了多少条数据,计算结果为多少?这样每一步我们都能收到Email,就可以靠Email信息来判断操作是否成功,而不需要自己去数据库了比较验证操作是否完成,是否正确执行了。

那么如何让SQLServer实现这样的功能呢?原理我们就不讲了,直接讲步骤。

1. 首先建立一个新的数据库MailDB(当然,你已有的数据库也可以。新数据库只是为了方便讲解),在MailDB里建立一个表Mail_GenerateMailRequest,专门用来存放Email的信息。这个表结构如下:

image

建立此表的Script如下:

 USE [MailDB]
 GO 
  
 SET ANSI_NULLS ON 
 GO 
  
 SET QUOTED_IDENTIFIER ON 
 GO 
  
 SET ANSI_PADDING ON 
 GO 
  
 CREATE TABLE [dbo].[Mail_GeneralMailRequest](
 [RequestID] [bigint] IDENTITY(1,1) NOT NULL,
 [RequestTime] [datetime] NOT NULL,
 [MailRecipients] [varchar](50) NOT NULL,
 [MailCC] [varchar](50) NULL,
 [MailBCC] [varchar](50) NULL,
 [MailType] [varchar](50) NOT NULL,
 [MailTitle] [varchar](100) NOT NULL,
 [MailContent] [varchar](2000) NOT NULL,
 [MailAttachment] [varchar](100) NULL,
 [MailTime] [datetime] NULL,
 [MailQuery] [varchar](1000) NULL 
 ) ON [PRIMARY]
  
 GO 
  
 SET ANSI_PADDING OFF 
 GO 
  
  

这个表用来存放要发送Email的信息,也就是每一条记录都应该要发送一封Email出去。显然,我们这里需要用到trigger来触发这个动作。每当有新纪录插入时,就发送Email。

这个trigger的内容如下:

 USE [MailDB]
 GO 
 SET ANSI_NULLS ON 
 GO 
 SET QUOTED_IDENTIFIER ON 
 GO 
  
 CREATE trigger [dbo].[tr_Mail_GeneralMailRequest] on [dbo].[Mail_GeneralMailRequest]
 for insert
 as 
  
 declare @requestID bigint
  
 select @requestID = RequestID
 from inserted
  
 execute SYS_Mail_GeneralMailRequest @requestID

看了上面的trigger后,很显然重点在SYS_Mail_GeneralMailRequest。它才是真真正正用来发送Email的东西。我们来看看这个存储过程是怎样的。

 USE [MailDB]
 GO 
 SET ANSI_NULLS ON 
 GO 
 SET QUOTED_IDENTIFIER ON 
 GO 
 ALTER PROCEDURE [dbo].[SYS_Mail_GeneralMailRequest]
 @requestID bigint
 as 
 set xact_abort on 
 set nocount on 
  
 declare @requestTime datetime
 declare @mailRecipients varchar(50)
 declare @mailCC varchar(1000)
 declare @mailBCC varchar(100)
 declare @mailType varchar(50)
 declare @mailTitle varchar(50)
 declare @mailContent varchar(1000)
 declare @mailAttachment varchar(1000)
 declare @mailquery varchar(1000)
 declare @result int 
  
 select @requestTime = RequestTime
 , @mailRecipients = MailRecipients, @mailCC = MailCC, @mailBCC = MailBCC
 , @mailType = MailType, @mailTitle = MailTitle, @mailContent = MailContent
 , @mailAttachment = MailAttachment,@MailQuery=mailquery
 from Mail_GeneralMailRequest
 where RequestID = @requestID
  
 if @mailtype='Query' 
 begin 
 EXEC master.dbo.xp_sendmail @recipients = @mailRecipients,
 @query = @MailQuery,
 @subject = @mailTitle,
 @message = @mailContent,
 @attach_results = 'FALSE', @width = 7000
 end 
 else 
 begin 
 execute                                                  
 , @message = @mailContent, @attachments = @mailAttachment
 , @copy_recipients = @mailCC, @blind_copy_recipients = @mailBCC
 , @subject = @mailTitle
  
 end 
  
 update Mail_GeneralMailRequest
 set MailTime = getdate()
 where RequestID = @requestID

这样我们就可以用SQL Server发送Email了。在需要发送Email的地方,往Mail_GenerateMailRequest表里插入数据。如下:

 INSERT INTO Mail_GenerateMailRequest(
 [RequestTime],
 [MailRecipients], [MailCC], [MailBCC], [MailType],
 [MailTitle],
 [MailContent],
 [MailAttachment]
 )
 VALUES (
 GETDATE(),
 'test@126.com', '', NULL, 'DBMail',
 CASE @Success WHEN 0 THEN 'ERR ' ELSE '' END + 'Test Result:' + convert(varchar,getdate(), 111) + ',' + @ProcessName,
 CASE @Success WHEN 0 THEN 'ERR ' ELSE '' END + 'Test Result:' + convert(varchar,getdate(), 111) + ',' + @message,
 NULL 
 )

这样就大功告成了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.使用 MSSQLServer 服务会用到的用户帐户登录到 Microsoft Windows NT? 4.0 或 Windows? 2000 上。该用户帐户必须是本地计算机的管理员和域帐户。 2.确认 Exchange Server 客户端 (Exchnge32.exe) 或 Microsoft Outlook? 客户端 (Outlook.exe) 能够连接到 Exchange Server 而且能够发送电子邮件。如果使用 Outlook,确保 Outlook 安装时选择了 "用于企业或工作组 "选项。 3.确认所用的 Exchange Server 配置文件中没有个人消息存储 (.pst)。Exchange Server 配置文件的名字不应超过 32 个字符。 4.在 "服务 "选项卡上,确认 Microsoft Exchange Server 和个人通讯簿是唯一可用的服务,然后单击 "发送 "选项卡。确认 "发送到 "框中选定的内容是 Exchange Server 中的邮箱,它应该有一个类似于 "邮箱 - <友好的用户名 > "的名字(其中 <友好的用户名 >是在第一步中登录到 Windows NT 4.0 或 Windows 2000 的用户名)。 5.要运行带有 Exchange Server 的 "SQL 邮件 ",MSSQLServer 服务必须在第一步中登录的同一个用户帐户下运行。在 "控制面板 "中,双击 "服务 ",选择 MSSQLServer 服务,然后单击 "启动 "。 6.确认 "SQL 邮件 "的配置文件是否正确。在 SQL Server 企业管理器中,展开服务器,展开 "支持服务 "文件夹,选择 "SQL 邮件 ",然后用右键单击。单击 "属性 ",然后在 "常规 "选项卡上,确保 "配置文件名 "框中指定的配置文件名正确。(事件探查器名必须与第三步中用到的配置文件名匹配。)单击 "测试 ",验证配置文件设置正确。 7.如果 "SQL 邮件 "无法启动(例如,显示错误信息指出配置文件不正确),请检查设置确保未将 Outlook Express 设置为默认的电子邮件客户程序。在 "控制面板 "中双击 "Internet "选项。在 "程序 "选项卡中,验证 Outlook Express 不在电子邮件组合框中。如果不得不将默认的电子邮件客户程序更改为 Outlook Express 以外的客户程序,那么,可能需要先验证 "SQL 邮件 "能够用邮件配置文件启动,然后再停止并重新启动 MSSQLServer 服务。 在有些情况下,邮件的配置文件可能会损坏而且 "SQL 邮件 "将无法使用它。要更正这个问题,需要把配置文件复制到另一个文件名下,或重新创建配置文件。 8.如果用来启动 Microsoft SQL Server? 的帐户没有权限访问 Exchange 服务器,那么就无法使用 "SQL 邮件 "。执行 xp_cmdshell 来测试 SQL Server 对 Exchange Server 的访问权限,它执行与 "SQL 邮件 "相同的权限。使用下面的命令测试对服务器的连接,假定 Exchange Server 位于名为 "MyServer "的计算机上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值