基于SQL调用Com组件来发送邮件
这个需求是公司有个文控中心,如果有用增删改了文件信息希望可以发邮件通知到有权限的人。当然方式很多。
这里是用数据库作业来完成
JOB+Com,这里用的com组件是Jmail
当然你需要把com组件放到system32下面
下面是实现方式
CREATE PROC dbo.dcc_Send_Email
AS
BEGIN SET NOCOUNT ON DECLARE @lasttime DATETIME --获取最后一次发送的时间
IF Not EXISTS(SELECT lastsendtime FROM dcc_lastsend)
begin
set @lasttime=GETDATE()
END
ELSE
BEGIN
SELECT @lasttime=lastsendtime FROM dcc_lastsend
END
--SELECT @lasttime
--SELECT * FROM dcc_changereaon WHERE createdate>=@lasttime
DECLARE @sendto VARCHAR(500)--发送邮件给谁
DECLARE @aliasname VARCHAR(500)--档案名称
DECLARE @filename VARCHAR(500)--名称
DECLARE @userid INT --用户ID
DECLARE @dccid INT --文件夹ID
DECLARE @dccfileid INT --文件ID
DECLARE @action VARCHAR(500) --操作类型 1 新增 2 修改 3删除
DECLARE @changeid int
DECLARE @reasons VARCHAR(8000) --原因
DECLARE @html VARCHAR(8000) ---html格式内容
DECLARE @table VARCHAR(8000) ---html格式内容
DECLARE @senduiserid VARCHAR(8000) --通知的用户
DECLARE @sendfileid VARCHAR(8000) --更改的文件用户
DECLARE @temp TABLE (id INT ,ACTION varchar(50), aliasname varchar(50),FILENAME varchar(50))
DECLARE @rcount INT SET @html=''--
SET @table=''
DECLARE @index INT--奇数还是偶数行
SET @index=0
DECLARE CusCursor CURSOR FOR --外层游标查询用户
SELECT id,DccMail FROM view_dcc_users WHERE DccMail<>'' AND IsLock=0
OPEN CusCursor
FETCH NEXT FROM CusCursor INTO @userid,@sendto
WHILE (@@FETCH_STATUS = 0)
BEGIN SET @table=''
SET @index=0
SET @html = ''
SET @rcount=0 DELETE @temp
INSERT INTO @temp (id,action,aliasname,filename)
SELECT a.id,[action],a.aliasname,a.filename FROM dcc_changereaon a
WHERE a.createdate>=@lasttime
AND dccid IN (SELECT folderid FROM dbo.dcc_rights WHERE userid=@userid AND enabled=1) SET @rcount = @@ROWCOUNT
IF @rcount>0
BEGIN
DECLARE cur CURSOR FOR SELECT * FROM @temp --内层游标查询用户有那些权限
OPEN cur
SET @html='<html><head><style type="text/css">table{font-family:"Trebuchet MS", Arial, Helvetica, sans-serif;width:100%;border-collapse:collapse;}td,th{font-size:1em;border:1px solid #98bf21;padding:3px 7px 2px 7px;}th {font-size:1.1em;text-align:left;padding-top:5px;padding-bottom:4px;background-color:#A7C942;color:#ffffff;}tr.alt td {color:#000000;background-color:#EAF2D3;}</style></head><body>各位:<br>兹通知下述文件有变动,贵部可随时登录文控网页(www.gardenchinagroup.com:82) 查阅:<br><br><br><table><tr><th>档案名称</th><th>名称</th><th>备注(标注新增/更新/取消)</th></tr>'
FETCH NEXT FROM cur INTO @changeid,@action,@aliasname,@filename
WHILE (@@FETCH_STATUS = 0)
BEGIN
INSERT INTO dbo.dcc_logs
( changeid, userid, createtime )
VALUES ( @changeid, -- changeid - int
@userid, -- userid - int
GETDATE() -- createtime - smalldatetime
)
IF @index %2<>0
SET @table=@table+'<tr class=''alt''><td>'+@filename+'</td><td>'+@aliasname+'</td><td>'+@action+'</td></tr>'
ELSE
SET @table=@table+'<tr><td>'+@filename+'</td><td>'+@aliasname+'</td><td>'+@action+'</td></tr>'
SET @index=@index+1
fetch next from cur into @changeid,@action,@aliasname,@filename
END
CLOSE cur
DEALLOCATE cur SET @html=@html+@table+'</table></body></html>' --PRINT @sendto
EXEC myCommData.dbo.my_SendMail '文件新增/更新/取消通知',@html,'DCC',@sendto,'','fengmin.dg@gardenchinagroup.com,foxbuilder.dg@gardenchinagroup.com','joey.dg@gardenchinagroup.com',1 END
--SELECT @html
FETCH NEXT FROM CusCursor INTO @userid,@sendto
END
CLOSE CusCursor
DEALLOCATE CusCursor IF Not EXISTS(SELECT lastsendtime FROM dcc_lastsend) --更新最后一次发送时间
begin
INSERT INTO dbo.dcc_lastsend( lastsendtime )VALUES(GETDATE())
END
ELSE
BEGIN
UPDATE dcc_lastsend SET lastsendtime=GETDATE()
END END GO
CREATE PROC dbo.my_SendMail
@Subject varchar(100), -- 主题
@Body varchar(8000), -- 内容
@Sender varchar(100), -- 发件人姓名
@ToList varchar(2000), -- 发送邮件地址, 可以多个地址,用","隔开
@ccList varchar(2000)='', -- 抄送地址
@BccList varchar(2000)='', -- 秘抄送地址
@ReturnEmail VARCHAR(500)='', -- 回执到指定邮箱
@ReturnReceipt bit = 0 --是否回执 AS /* EXEC dbo.my_SendMail
@Subject = 'today is a luck day', -- varchar(100)
@Body = 'today is a luck day 20130', -- varchar(8000)
@Sender = 'system', -- varchar(100)
@ToList = 'fengmin.dg@gardenchinagroup.com', -- varchar(2000)
@ccList = 'fengmin.dg@gardenchinagroup.com', -- varchar(2000)
@BccList='foxbuilder.dg@gardenchinagroup.com',
@ReturnEmail='foxbuilder.dg@gardenchinagroup.com',
@ReturnReceipt=1 */ Declare @object int
Declare @hr int EXEC @hr = sp_OACreate 'jmail.Message', @object OUT EXEC @hr = sp_OASetProperty @object, 'Silent' , 1
EXEC @hr = sp_OASetProperty @object, 'Logging' , 1
EXEC @hr = sp_OASetProperty @object, 'Charset' , 'GB2312' EXEC @hr = sp_OASetProperty @object, 'From' , @Sender
EXEC @hr = sp_OASetProperty @object, 'ISOEncodeHeaders' ,0
EXEC @hr = sp_OASetProperty @object, 'From' , 'mis.dg@gardenchinagroup.com' EXEC @hr = sp_OASetProperty @object, 'MailServerUserName' , 'mis.dg'
EXEC @hr = sp_OASetProperty @object, 'MailServerPassWord' , 'Edp2469851' EXEC @hr = sp_OASetProperty @object, 'Subject' , @Subject
EXEC @hr = sp_OASetProperty @object, 'HTMLBody' , @Body
IF @ReturnReceipt=1
BEGIN
EXEC @hr = sp_OASetProperty @object, 'ReturnReceipt' ,1 --是否需要回执
DECLARE @backemail VARCHAR(2000)
SET @backemail='AddNativeHeader (Disposition-Notification-To,'+@ReturnEmail+')'
EXEC @hr = sp_OAMethod @object, @backemail,NULL
END
declare @i int
set @i=1
declare @mail varchar(100), @addmail varchar(100),@bccmail varchar(100) -- 添加发件人
set @mail = ''
set @mail =dbo.my_SplitStr(@ToList, ',', @i)
while not @mail is null
begin
if @mail<>''
begin
set @addmail= 'AddRecipient ("' + @mail + '")'
EXEC @hr = sp_OAMethod @object, @addmail, null
end
set @i=@i+1
set @mail =dbo.my_SplitStr(@ToList, ',', @i)
end -- 添加抄送
set @mail = ''
set @i =1
set @mail =dbo.my_SplitStr(@ccList, ',', @i) while not @mail is null
begin
if @mail<>''
begin
set @addmail= 'AddRecipientCC ("' + @mail + '")'
EXEC @hr = sp_OAMethod @object, @addmail, null
end
set @i=@i+1
set @mail =dbo.my_SplitStr(@ccList, ',', @i)
end --秘密抄送 set @mail = ''
set @i =1
set @mail =dbo.my_SplitStr(@BccList, ',', @i) while not @mail is null
begin
if @mail<>''
begin
set @bccmail= 'AddRecipientBCC ("' + @mail + '")'
EXEC @hr = sp_OAMethod @object, @bccmail, null
end
set @i=@i+1
set @mail =dbo.my_SplitStr(@BccList, ',', @i)
end -- 开始发送
EXEC @hr = sp_OAMethod @object, 'Send("192.168.0.3")', null --判断出错
IF @hr <> 0
BEGIN
EXEC sp_OAGetErrorInfo @object
END
PRINT 'success'
EXEC @hr = sp_OADestroy @object GO
基于SQL调用Com组件来发送邮件的更多相关文章
- 基于sparksql调用shell脚本运行SQL
[Author]: kwu 基于sparksql调用shell脚本运行SQL,sparksql提供了类似hive中的 -e , -f ,-i的选项 1.定时调用脚本 #!/bin/sh # uplo ...
- 基于SQL Server 2008 Service Broker构建企业级消息系统
注:这篇文章是为InfoQ 中文站而写,文章的地址是:http://www.infoq.com/cn/articles/enterprisemessage-sqlserver-servicebroke ...
- Atitit 基于sql编程语言的oo面向对象大规模应用解决方案attilax总结
Atitit 基于sql编程语言的oo面向对象大规模应用解决方案attilax总结 1. Sql语言应该得到更大的范围的应用,1 1.1. 在小型系统项目中,很适合存储过程写业务逻辑2 1.2. 大型 ...
- VS2010调用Com组件
Com组件开发过程中用的不多,资料也不多,故记录开发Com组件中的部分问题. 在这一篇文章里,讲解了如何使用VS2010创建Com组件.现在基于该文章创建的Com组件接口,创建VC++项目来调用该接口 ...
- .NET通过调用Office组件导出Word文档
.NET通过调用Office组件导出Word文档 最近做项目需要实现一个客户端下载word表格的功能,该功能是用户点击"下载表格",服务端将该用户的数据查询出来并生成数据到Word ...
- iOS开发笔记 基于wsdl2objc调用asp.net WebService
1.准备 先下载待会要用到的工具 WSDL2ObjC-0.6.zip WSDL2ObjC-0.7-pre1.zip 我用的是WSDL2ObjC-0.6.zip 1.1搭建asp.net WebServ ...
- 基于Sql Server 2008的分布式数据库的实践(二)
原文 基于Sql Server 2008的分布式数据库的实践(二) 从Win7连接Win2003的Sql Server 2008 1.新建链接服务器链接到Win2003的Sql Server 2008 ...
- SQL Server如何定位自定义标量函数被那个SQL调用次数最多浅析
前阵子遇到一个很是棘手的问题,监控系统DPA发现某个自定义标量函数被调用的次数非常高,高到一个离谱的程度.然后在Troubleshooting这个问题的时候,确实遇到了一些问题让我很是纠结,下文是解决 ...
- EF Core使用SQL调用返回其他类型的查询 ASP.NET Core 2.0 使用NLog实现日志记录 CSS 3D transforms cSharp:use Activator.CreateInstance with an Interface? SqlHelper DBHelper C# Thread.Abort方法真的让线程停止了吗? 注意!你的Thread.Abort方法真
EF Core使用SQL调用返回其他类型的查询 假设你想要 SQL 本身编写,而不使用 LINQ. 需要运行 SQL 查询中返回实体对象之外的内容. 在 EF Core 中,执行该操作的另一种方法 ...
随机推荐
- var与this定义变量的区别以及疑惑
我们知道: var可以定义一个局部变量,当然如果var定义在最外层的话,就是全局的局部变量,也就算是全局变量了. 而this关键字定义的变量准确的说应该算是成员变量.即定义的是调用对象的成员变量. 另 ...
- ThinkPad.E440_FN键反了
1.一直不知道,为何我的 FN键反了(Fn+F1 才是F1的功能),想改过来.查到是 BIOS中改,但是 BIOS里面没有 那些个修改的选项,于是 还原了BIOS的设置,于是出问题了... 2.问题1 ...
- BZOJ 4445 [Scoi2015]小凸想跑步:半平面交
传送门 题意 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸 $ n $ 边形,$ n $ 个顶点 $ P_i $ 按照逆时针从 $ 0 $ 至 $ n-1 $ 编号. ...
- cssrem 比例适配理解
cssrem只是帮你自动计算,省去了你在切图时,从设计稿拿到的px再根据比例转换成rem的中间过程. 这个40我无法猜测, 以前设计稿给的都是按640px(iphone5s的宽)来的,我们就按照这个比 ...
- 绝对布局absoluteLayout
绝对布局absoluteLayout 一.简介 二.实例 绝对布局我们是指定的横纵坐标,所以可以这样直接拖 绝对布局实际中用的少
- Django开发点菜系统学习笔记
1.使用django-simple-captcha包的时候,会调用到: register_form = RegisterForm(request.POST) 但是这个时候captcha不进行错误检验, ...
- HDU-4510-日期
http://acm.hdu.edu.cn/showproblem.php?pid=4510 小Q系列故事——为什么时光不能倒流 Time Limit: 300/100 MS (Java/Others ...
- 四边形不等式优化_石子合并问题_C++
在动态规划中,经常遇到形如下式的状态转移方程: m(i,j)=min{m(i,k-1),m(k,j)}+w(i,j)(i≤k≤j)(min也可以改为max) 上述的m(i,j)表示区间[i,j]上的某 ...
- 使用MouseWithoutBordersSetup共享鼠标键盘教程
1.下载MouseWithoutBordersSetup软件 2.需要共享鼠标键盘的电脑都要安装[注:这些电脑在同一个局域网] 3.运行软件后,图标上右键—>Settings 注意大红框的地方, ...
- set, map, string, find(), string name[100],等的混合
Unrequited Love Time Limit: 16 Seconds Memory Limit: 131072 KB There are n single boys and m si ...