这两天都在搞这个东西,从开始的一点不懂,到现在自己可以独立的完成这个功能!在这个过程中,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可以用如下语句

[c-sharp] view
plain
copy

  1. DECLARE
  2. @account_name sysname,
  3. @profile_name sysname;
  4. SELECT
  5. @account_name = N'want_to_delete_Account'
  6. @profile_name = N'want_to_delete_Profile';
  7. -- 从邮件配置文件中删除数据库邮件帐号
  8. EXEC msdb.dbo.sysmail_delete_profileaccount_sp
  9. @profile_name = @profile_name,
  10. @account_name = @account_name;
  11. -- 删除数据库邮件帐号
  12. EXEC msdb.dbo.sysmail_delete_account_sp
  13. @account_name = @account_name;
  14. -- 删除数据库邮件配置文件
  15. EXEC msdb.dbo.sysmail_delete_profile_sp
  16. @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

[c-sharp] view
plain
copy

  1. CREATE PROCEDURE [Services].[SendRegisteredEmail]
  2. (
  3. @UserID int,
  4. @EmailAddress nvarchar(100)
  5. --  @mailitem_id int OUTPUT
  6. )
  7. AS
  8. declare @userName nvarchar(30)
  9. declare @Login nvarchar(50)
  10. declare @password nvarchar(50)
  11. declare @regUserID int
  12. declare @titleName nvarchar(100)
  13. declare @titleResult nvarchar(100)
  14. declare @object nvarchar(600)
  15. declare @objectResult nvarchar(600)
  16. declare @Subject1 nvarchar(100)
  17. declare @Conclusion nvarchar(600)
  18. declare @Inscrible nvarchar(100)
  19. declare @result int
  20. --declare @time datetime
  21. declare @body1 nvarchar(max)
  22. begin
  23. select @userName=LastName from [Users].[User] where UserID=@UserID
  24. select @Subject1=Subject,@titleName=TitleName ,@object=Object,@Conclusion=Conclusion,@Inscrible=Inscribe from [Services].[EmailText] where EmailTypeID=1
  25. select @titleResult=replace(@titleName,'<UserName>',@userName)
  26. select @Login=Login ,@password=Password from [Users].[RegisteredUser] where UserID=@UserID
  27. select @objectResult=replace(@object,'<LoginName>',@Login)
  28. select @objectResult=replace(@objectResult,'<LoginName>',@Login)
  29. set @body1=@titleResult+N'<br>'+@objectResult+N'<br>'+@Conclusion+N'<br>'+@Inscrible
  30. EXEC @result=msdb.dbo.sp_send_dbmail @profile_name='SurmountGroupProfile',
  31. @recipients=@EmailAddress,
  32. @subject= @Subject1,
  33. @body = @body1,
  34. @body_format = 'HTML';
  35. return @result
  36. 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输入如下代码:

[c-sharp] view
plain
copy

  1. declare @recordID int
  2. declare @userID int
  3. declare @email nvarchar(100)
  4. declare @typeID int
  5. declare @result int
  6. declare EmailCursor cursor for select RecordID,UserID,EmailAddress,EmailTextID from AutoSendEmail
  7. open EmailCursor
  8. fetch next from EmailCursor into @recordID,@userID,@email,@typeID
  9. While ( @@Fetch_Status=0 )
  10. begin
  11. if( @typeID=1)
  12. begin
  13. exec @result=SendRegisteredEmail @userID,@email
  14. if(@result=0)
  15. begin
  16. delete from [Services].[AutoSendEmail] where RecordID=@recordID
  17. end
  18. end
  19. fetch next from EmailCursor into @recordID,@userID,@email,@typeID
  20. end
  21. close EmailCursor
  22. Deallocate EmailCursor

这里用游标遍历AutoSendEmail表,job设定为每分钟遍历一次,如果发送成功,就把该行记录给删除。否则保留在表中,下次遍历时,再次发送。

这样一个简单的应用型发送邮件功能就实现好了!

冻死我了,呵呵,得赶紧躲到被窝里去了!如果看后有什么好的意见或是建议,欢迎留言!

SQL SERVER 2008自动发送邮件(完整版)的更多相关文章

  1. sql server 2008 自动备份

    身份验证:包含Windows身份验证和 SQL Server身份验证,此处选择Windows 身份验证; 选择[管理]-->[维护计划]-->[维护计划向导] 必须启用代理服务(启动模式请 ...

  2. 使用SQL SERVER 来自动发送邮件

    可以使用SQL SERVER 来发送自动邮件,主要是使用SQL SERVER 的dbo.sp_send_dbmail 存储过程(在msdb数据库中). 具体步骤如下: Step1: 编写要发送的邮件内 ...

  3. SQL Server 2008自动备份数据库

    1.在电脑开始菜单中选择“SQL Server Management Studio”双击.在出现的界面中点击“连接”按钮. 2.在出现的“ Microsoft SQL Server Managemen ...

  4. Powerdesigner逆向工程从sql server数据库生成pdm (完整版)

    第一步:打开"控制面板"中的"管理工具" 第二步:点击"管理工具"然后双击"数据源(odbc)" 第三步:打开之后,点击 ...

  5. SQL Server 2008 R2 安装 下载

    [参考]https://www.aiweibk.com/6697.html winrm 服务未启动,需要先配置.以管理员身份启动 cmd,执行 winrm quickconfig 命令. 微信截图_2 ...

  6. SQL Server 2008创建定期自动备份任务

    首先需要启动SQL Server Agent服务,这个服务如果不启动是无法运行新建作业的,点击“开始”–“所有程序”–“Microsoft SQL Server 2008”–“启动SQL Server ...

  7. SQL Server 2008、SQL Server 2008R2 自动备份数据库

    让SQL Server 2008自动备份数据库,需要建立一个SQL Server作业,并启动SQL Server代理,使该作业定期运行. 具体来说,可以按以下步骤进行: 一.打开SQL Server ...

  8. SQL Server 2008如何创建定期自动备份任务

    我们知道,利用SQL Server 2008数据库可以实现数据库的定期自动备份.方法是用SQL SERVER 2008自带的维护计划创建一个计划对数据库进行备份,下面我们将SQL SERVER 200 ...

  9. 设定MS SQL Server 2008定期自动备份

    1.说明 SQL Server2008 本身具有定期自动备份功能,我们只需要通过简单的配置就可以实现非常简单高效的自动备份功能. 2.打开SQL Server代理服务 要实现自动备份功能,首先要保证S ...

随机推荐

  1. idea中的maven模块变成灰色的可能原因

    在使用idea的过程中,遇到其中一个maven模块变成灰色,如下所示: 造成这个的原因可能是忽略了maven模块,可以尝试如下解决方法:在idea中maven的setting中找到ignored fi ...

  2. OpenGL ES 3.0顶点着色器(一)

    OpenGL ES 3.0流程图 1.Vertex Shader(顶点着色器) 顶点着色实现了一种通用的可编程方法操作顶点. 顶点着色器的输入包括以下几个: • Shader program.程序的顶 ...

  3. 【Python】torrentParser1.01

    在昨天的版本上做了一些改进,如增加getAll,修改getSingleFileName等 代码: #-------------------------------------------------- ...

  4. 20160205.CCPP体系具体解释(0015天)

    程序片段(01):01.杨辉三角.c 内容概要:杨辉三角 #include <stdio.h> #include <stdlib.h> #define N 10 //01.杨辉 ...

  5. 【转】开发者可以使用Docker做什么?

    有些开发者可能还是不明白 Docker 对自己到底有多大的用处,因此翻译 Docker 个人用例 这篇文章中来介绍 Docker 在普通开发者开发过程中的用例. Docker 如今赢得了许多关注,很多 ...

  6. mssql批量删除数据库里所有的表

    go declare @tbname varchar(250) declare #tb cursor for select name from sysobjects where objectprope ...

  7. 〖Android〗依据资源信息,Mock Android资源

    #!/bin/bash - #=============================================================================== # # F ...

  8. 查询后n条记录

    查询后n条记录 SELECT * FROM tb_stu ORDER BY id ASC LIMIT n

  9. error:No buffer space available (maximum connections reached

    2015-02-02 17:49:09,035 ERROR basic.DBManager - Failded to establish the connection. com.mysql.jdbc. ...

  10. tomcat,很多时候,可以在服务server.xml中可以实现一些效果

    一.--日志 <Valve className="org.apache.catalina.valves.AccessLogValve" directory="log ...