SQL SERVER 2008自动发送邮件(完整版)
这两天都在搞这个东西,从开始的一点不懂,到现在自己可以独立的完成这个功能!在这个过程中,CSDN的好多牛人都给了我很大的帮助,在此表示十二分的感谢!写这篇文章,一是为了巩固一下,二嘛我也很希望我写的这点小东西能帮助遇到同样问题的朋友们!当然这里有一部分是从网上的摘录的
实现一个类似于注册平台的功能:比如注册了一个用户,就会向注册邮箱里发送一封邮件。首先是要搭建一个自动发送邮件的平台,这个用sql server 2008(sql server 2005也有)的database mail就能很方便的实现。这个完成了以后就能够发送简单的邮件了,但是这样在应用中往往是不够,我们还要需要建一个job来实现自动发送的功能。
database mail的构建有两种方法,一是用configure database mail,这个只要手动的配置一下就可以了,具体的可以参考
http://blog.csdn.net/ghj1976/archive/2009/02/25/3936286.aspx
另外一种是用sql语句完成。网上有很多中方法,下面的链接是我发的一个帖子,爱新觉罗.毓华,siegebaoniu,还有加勒比小飞猪都给出了很详细的描述。我用的是加勒比小飞猪的方法
http://topic.csdn.net/u/20101211/16/21451eb1-96b6-4457-8837-b06cfd450039.html
这两种方法中的服务器名字,我刚开始以为是随便起一个就可以的,(以为sql server的database mail会自动把这个服务器名申请为一个可用的smtp服务器)后来貌似不是的。这里好像必须要是一个存在并且可用的smtp服务器名
如果想要删除建立好的profile和account可以用如下语句
- DECLARE
- @account_name sysname,
- @profile_name sysname;
- SELECT
- @account_name = N'want_to_delete_Account'
- @profile_name = N'want_to_delete_Profile';
- -- 从邮件配置文件中删除数据库邮件帐号
- EXEC msdb.dbo.sysmail_delete_profileaccount_sp
- @profile_name = @profile_name,
- @account_name = @account_name;
- -- 删除数据库邮件帐号
- EXEC msdb.dbo.sysmail_delete_account_sp
- @account_name = @account_name;
- -- 删除数据库邮件配置文件
- EXEC msdb.dbo.sysmail_delete_profile_sp
- @profile_name = @profile_name;
完成了database mail的搭建。下面我们就要开始完善自动发送邮件的功能。
我们要实现发送邮件的格式是:
尊敬的×××:---------------------------------------------titleName
感谢您的注册,你的用户名是××,密码是××--------------------------object
你的满意是我们最大的动力。----------------------------------------------------Conclusion
某某公司 ----------------------------------------------------------Inscribe
首先我们可以建两个表:一个是AutoSendEmail记录用户ID和Email的信息;一个是EmailText,一个static table,里面存储的是我们要发送的邮件的格式。
AutoSendEmail的主要字段有UserID,EmailAddress,EmailTextID(EmailText的一个外键)。这里的UserID对应的是一个User表,里面存有用户的登录名及登录密码。
EmailText的主要字段有EmailTextID,Subject(主题),titleName(称呼),object(内容),Conclusion(结束语),Inscribe(落款)。可能看到这里,有人会认为EmailText表没必要设计的这么麻烦。有EmailTextID,Subject和一个body就够了,确实,但是这样的话,内容中的排版格式比较麻烦。这样设计一是为了格式方便,一个是为了和发送其他邮件格式统一。插入一行数据到EmailText表中
insert into EmailText (EmailTextID,Subject,TitleName,Object,Conclusion,Inscribe) values(1,'注册成功','尊敬的<UserName>:','
感谢您申请注册某某公司会员! 你的注册帐号为<LoginName>,密码为<Password>,请妥善保管您的密码!','
感谢您对我们公司的支持!如果任何意见或建议,欢迎来电咨询:123-456789。请不要回复此邮件!',' 某某公司')
这样,用job每次遍历AutoSendEmail,从中得到UserID和EmailTextID,然后根据UserID可以得到相应的登录名和登录密码。同时根据EmailTextID,取出里面的titleName(称呼),object(内容),Conclusion(结束语),Inscribe(落款)四个字段,用得到的登录名和登录密码去替换<UserName>
,<LoginName>,<Password>这样就可以拼凑成一封邮件的完整body。
为此,先建立一个procedure
- CREATE PROCEDURE [Services].[SendRegisteredEmail]
- (
- @UserID int,
- @EmailAddress nvarchar(100)
- -- @mailitem_id int OUTPUT
- )
- AS
- declare @userName nvarchar(30)
- declare @Login nvarchar(50)
- declare @password nvarchar(50)
- declare @regUserID int
- declare @titleName nvarchar(100)
- declare @titleResult nvarchar(100)
- declare @object nvarchar(600)
- declare @objectResult nvarchar(600)
- declare @Subject1 nvarchar(100)
- declare @Conclusion nvarchar(600)
- declare @Inscrible nvarchar(100)
- declare @result int
- --declare @time datetime
- declare @body1 nvarchar(max)
- begin
- select @userName=LastName from [Users].[User] where UserID=@UserID
- select @Subject1=Subject,@titleName=TitleName ,@object=Object,@Conclusion=Conclusion,@Inscrible=Inscribe from [Services].[EmailText] where EmailTypeID=1
- select @titleResult=replace(@titleName,'<UserName>',@userName)
- select @Login=Login ,@password=Password from [Users].[RegisteredUser] where UserID=@UserID
- select @objectResult=replace(@object,'<LoginName>',@Login)
- select @objectResult=replace(@objectResult,'<LoginName>',@Login)
- set @body1=@titleResult+N'<br>'+@objectResult+N'<br>'+@Conclusion+N'<br>'+@Inscrible
- EXEC @result=msdb.dbo.sp_send_dbmail @profile_name='SurmountGroupProfile',
- @recipients=@EmailAddress,
- @subject= @Subject1,
- @body = @body1,
- @body_format = 'HTML';
- return @result
- end
上面代码用了一个sql里的替换函数replace,该函数的用法是
用第三个表达式替换第一个字符串表达式中出现的所有第二个给定字符串表达式。
语法 REPLACE ( 'string_expression1' , 'string_expression2' , 'string_expression3' )
参数 'string_expression1' 待搜索的字符串表达式。string_expression1 可以是字符数据或二进制数据。
'string_expression2' 待查找的字符串表达式。string_expression2 可以是字符数据或二进制数据。
'string_expression3' 替换用的字符串表达式。string_expression3 可以是字符数据或二进制数据。
返回类型
如果 string_expression(1、2 或 3)是支持的字符数据类型之一,则返回字符数据。如果 string_expression(1、2 或 3)是支持的 binary 数据类型之一,则返回二进制数据。
msdb.dbo.sp_send_dbmail存储过程是用于执行发送邮件的,返回值为0或是1。0代表发送成功,1为发送失败
邮件的格式是用HTML形式显示
有了这个存储过程,那么只要用个建个job就可以了。job主要是为了实现某些需要数据库自动处理的功能。
job里的command输入如下代码:
- declare @recordID int
- declare @userID int
- declare @email nvarchar(100)
- declare @typeID int
- declare @result int
- declare EmailCursor cursor for select RecordID,UserID,EmailAddress,EmailTextID from AutoSendEmail
- open EmailCursor
- fetch next from EmailCursor into @recordID,@userID,@email,@typeID
- While ( @@Fetch_Status=0 )
- begin
- if( @typeID=1)
- begin
- exec @result=SendRegisteredEmail @userID,@email
- if(@result=0)
- begin
- delete from [Services].[AutoSendEmail] where RecordID=@recordID
- end
- end
- fetch next from EmailCursor into @recordID,@userID,@email,@typeID
- end
- close EmailCursor
- Deallocate EmailCursor
这里用游标遍历AutoSendEmail表,job设定为每分钟遍历一次,如果发送成功,就把该行记录给删除。否则保留在表中,下次遍历时,再次发送。
这样一个简单的应用型发送邮件功能就实现好了!
冻死我了,呵呵,得赶紧躲到被窝里去了!如果看后有什么好的意见或是建议,欢迎留言!
SQL SERVER 2008自动发送邮件(完整版)的更多相关文章
- sql server 2008 自动备份
身份验证:包含Windows身份验证和 SQL Server身份验证,此处选择Windows 身份验证; 选择[管理]-->[维护计划]-->[维护计划向导] 必须启用代理服务(启动模式请 ...
- 使用SQL SERVER 来自动发送邮件
可以使用SQL SERVER 来发送自动邮件,主要是使用SQL SERVER 的dbo.sp_send_dbmail 存储过程(在msdb数据库中). 具体步骤如下: Step1: 编写要发送的邮件内 ...
- SQL Server 2008自动备份数据库
1.在电脑开始菜单中选择“SQL Server Management Studio”双击.在出现的界面中点击“连接”按钮. 2.在出现的“ Microsoft SQL Server Managemen ...
- Powerdesigner逆向工程从sql server数据库生成pdm (完整版)
第一步:打开"控制面板"中的"管理工具" 第二步:点击"管理工具"然后双击"数据源(odbc)" 第三步:打开之后,点击 ...
- SQL Server 2008 R2 安装 下载
[参考]https://www.aiweibk.com/6697.html winrm 服务未启动,需要先配置.以管理员身份启动 cmd,执行 winrm quickconfig 命令. 微信截图_2 ...
- SQL Server 2008创建定期自动备份任务
首先需要启动SQL Server Agent服务,这个服务如果不启动是无法运行新建作业的,点击“开始”–“所有程序”–“Microsoft SQL Server 2008”–“启动SQL Server ...
- SQL Server 2008、SQL Server 2008R2 自动备份数据库
让SQL Server 2008自动备份数据库,需要建立一个SQL Server作业,并启动SQL Server代理,使该作业定期运行. 具体来说,可以按以下步骤进行: 一.打开SQL Server ...
- SQL Server 2008如何创建定期自动备份任务
我们知道,利用SQL Server 2008数据库可以实现数据库的定期自动备份.方法是用SQL SERVER 2008自带的维护计划创建一个计划对数据库进行备份,下面我们将SQL SERVER 200 ...
- 设定MS SQL Server 2008定期自动备份
1.说明 SQL Server2008 本身具有定期自动备份功能,我们只需要通过简单的配置就可以实现非常简单高效的自动备份功能. 2.打开SQL Server代理服务 要实现自动备份功能,首先要保证S ...
随机推荐
- ASP入门(十二)-Application对象
在一起协同工作以完成某项任务的一组ASP文件称为一个应用程序.Application 对象用于把这些文件捆绑在一起. Application 对象用于在整个应用程序生存期间保存信息. Applicat ...
- 其原因可能是堆被损坏,这也说明 xxx.exe 中或它所加载的任何 DLL 中有 bug
1.代码如下: string src ="abcdabcd"; char* dst = new char[8]; strcpy(dst,src.c_str()); delete[] ...
- file: /SourceCache/IOKitUser_Sim/IOKitUser-920.1.11/hid.subproj/IOHIDEventQueue.c, line: 512
//修改main.m 文件. typedef int (*PYStdWriter)(void *, const char *, int); static PYStdWriter _oldStdWrit ...
- ASP.NET使用包含文件,比如asp中用include的方法
不是母板页,包含文件在ASP.NET中是如何使用的? 在网页里包含另一个网页(或文件)方法如下: 一.要包含的文件是css文件的话,用 <link type=text/css rel=style ...
- javascript编程思想
javascript编程开发修炼之道 提要文摘附注: 本文的核心内容是围绕javascript前端开发的编程技术要素,来深入地探讨编写高质量的javascript代码的方法.技巧.规范和最佳实践, ...
- 茶道(tea)
#include<iostream> #include<string> #include<stdio.h> #include<algorithm> #i ...
- 基于Android的百度地图实现输入地址返回经纬度信息
1 解决方案一 此处解决办法参照自网友文章,对于输入的地址信息要求:城市名+具体地址名. 如果输入的地址信息只有具体地址名,而没有城市名,可能解析不出经纬度信息.还有就是解析出的经纬度再反向解析显示再 ...
- 规避javascript多人开发函数重名问题
命名空间 封闭空间 js模块化mvc(数据层.表现层.控制层) seajs 变量转换成对象的属性 对象化
- PHP中使用ActiveMQ实现消息队列
前面我们已经学了怎样部署ActiveMQ. 我们知道通过ActiveMQ的一个管理后台能够查看任务队列. 今天 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQ ...
- Inno Setup入门(八)——有选择性的安装文件
这主要使用[Components]段实现,一个演示的代码如下: [setup] ;全局设置,本段必须 AppName=Test AppVerName=TEST DefaultDirName=" ...