侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

sqlserver2008自动发送邮件

数据库  /  管理员 发布于 5年前   284

这两天都在搞这个东西,从开始的一点不懂,到现在自己可以独立的完成这个功能!在这个过程中,CSDN的好多牛人都给了我很大的帮助,在此表示十二分的感谢!写这篇文章,一是为了巩固一下,二嘛我也很希望我写的这点小东西能帮助遇到同样问题的朋友们!当然这里有一部分是从网上的摘录的
实现一个类似于注册平台的功能:比如注册了一个用户,就会向注册邮箱里发送一封邮件。首先是要搭建一个自动发送邮件的平台,这个用sql server 2008(sql server 2005也有)的database mail就能很方便的实现。这个完成了以后就能够发送简单的邮件了,但是这样在应用中往往是不够,我们还要需要建一个job来实现自动发送的功能。
database mail的构建有两种方法,一是用configure database mail,另外一种是用sql语句完成。
这两种方法中的服务器名字,我刚开始以为是随便起一个就可以的,(以为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 安装SQLDMO.dll的方法
    下一条:
    sqlserver2008查看表记录或者修改存储过程出现目录名无效错误解决方法
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 分库分表的目的、优缺点及具体实现方式介绍(0个评论)
    • DevDB - 在 VS 代码中直接访问数据库(0个评论)
    • 在ubuntu系统中实现mysql数据存储目录迁移流程步骤(0个评论)
    • 在mysql中使用存储过程批量新增测试数据流程步骤(0个评论)
    • php+mysql数据库批量根据条件快速更新、连表更新sql实现(0个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2017-06
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-11
    • 2018-01
    • 2018-05
    • 2018-10
    • 2018-11
    • 2020-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2021-02
    • 2021-04
    • 2021-07
    • 2021-08
    • 2021-11
    • 2021-12
    • 2022-02
    • 2022-03
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-07
    • 2023-08
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-03
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客