仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 644|回复: 7
打印 上一主题 下一主题

[学习教程] MYSQL网站制作之利用JMail组件取代Sql Mail发送Email

[复制链接]
深爱那片海 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:36:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
你不用花费很多时间和金钱来培训现有的职工,或者去花大价钱雇用那些拥有各种证书的开发者。因为MySQL的维护和管理在很大程度上是“傻瓜型”的。jmail|jmail组件说两句:在或人最坚苦的时分,写下此文,寄给某某报想骗点稿费,了局杳无音信,多少年后,翻滚硬盘翻出来了。呵呵,也许能够对但愿在SqlServer中发送邮件的网友有所匡助。
54powerman^_^

SqlMail手艺给每位数据库开辟职员和DBA(数据库办理员)带来了极年夜的便利,使用该手艺,SqlServer数据库代办署理程序能够在体系呈现非常的时分主动发送Email关照办理员,开辟人能够使用它让数据库主动按期的修正用户暗码,然后发送Email关照用户……等等这些使用,都分歧水平上把我们从冗杂的事情中束缚出来。可是,SqlMail的设置是对照庞大的,信任90%以上的人在设置SqlMail的时分都碰到过林林总总的贫苦,最少有70%的人保持了SqlMail而选择其他计划来办理这个成绩。笔者是一位Web开辟职员,亲自履历了这统统,并找到了一个更好的替换办法。不敢独享,写出来以飨读者。
SqlMail设置有几种体例,依照撑持软件可分别为基于Exchange、Outlook2000(以上)和第三方软件的设置计划,三种体例各有益弊,次要体现在以下几个方面:
利用Outlook客户端共同SqlServer完成SqlMail
此计划软件请求较低,只必要在SqlServer地点服务器上安装Outlook2000以上版本客户端便可。它请求在SqlMail利用时代,OutLook客户端必需翻开,不然,只能到下次翻开时,邮件才干发送进来。别的,假如服务器为远程服务器,用微软官方的远程桌面没法完成设置,可替换的计划是DBA亲身往机房间接操纵,大概安装PcAnywhere10替换远程桌面举行操纵。
利用Exchange请求较高
Microsoft保举利用Exchange作为SqlMail的最好拍档,MSDN的材料提出:“因为POP3/SMTP协定存在的范围性和登录成绩,Microsoft倡议您利用ExchangeServer来完成牢靠性”。可是Exchange并非专门做这个来利用的,能够说是屈才了,并且Exchange请求服务器设置域办理器,信任这个东东对年夜多半数据库服务器来讲用途不年夜,只不外是华侈资本而已。假如我们要在多台服务器上设置SqlMail那末就必要在每台服务器上设置域办理器,大概一切的服务器都设置到一个域内,可是关于服务器对照分离的体系来讲如许是不实际的。
利用第三方体系撑持
微软MSDN称:“假如您利用的是第三方邮件服务器,则必需将邮件服务器设置为POP3服务器。假如这些邮件服务器利用的当地邮件服务多是由第三方邮件客户端安装的,Microsoft将不撑持毗连到这些服务器”。这就意味着你还要利用Windows平台的邮件服务,利用ASP编写网站的伴侣必定都晓得,Cdonts.dll组件其实是……。
面临这些成绩,笔者就酿成了我方才说的那70%了,固然爬网有数,读笔墨数万把SqlMail设置好了,可是我仍旧相对保持,由于我不想在做第2台、第3台……的时分重蹈复辙。替换的计划就是Jmail组件+OLE主动化工具,以上的成绩水到渠成。
准备常识
1.OLE主动化函数
OLE主动化使使用程序可以对另外一个使用程序中完成的工具举行操纵,大概将工具公然以即可以对其举行操纵。主动化客户端是可对属于另外一个使用程序的公然工具举行操纵的使用程序,本文值得是SqlServer。公然工具的使用程序称为主动化服务器,又成为主动化组件,本文中即Jmail组件咯。客户端经由过程会见使用程序工具的属性和函数对这些工具举行操纵。
在SqlServer利用Ole组件的路子是几个体系扩大存储历程sp_OACreate、sp_OADestroy、sp_OAGetErrorInfo、sp_OAMethod、sp_OASetProperty和sp_OAGetProperty,再次复杂地先容一下利用办法,具体材料参考SqlServer联机丛书。
OLE主动化工具的利用办法:
(1)挪用sp_OACreate创立工具。
格局:sp_OACreateclsid,objecttokenOUTPUT[,context]
参数:clsid――是要创立的OLE工具的程序标识符(ProgID)。此字符串形貌该OLE工具的类,其情势,如OLEComponent.Object,OLEComponent是OLE主动化服务器的组件称号,Object是OLE工具名,本文中利用的“JMail.Message”;
Objecttoken――是前往的工具标记,而且必需是数据范例为int的部分变量。用于标识所创立的OLE工具,并将在挪用别的OLE主动化存储历程时利用。本文中就是经由过程它来挪用JMail.Message组件的属性和办法的。
Context――指定新创立的OLE工具要在个中运转的实行高低文。本文不利用该参数,故不赘述。以下与此分歧,一切办法属性的其他用法请参阅SqlServer联机文档。
(2)利用该工具。
(a)挪用sp_OAGetProperty猎取属性值。
格局:_OAGetPropertyobjecttoken,propertyname[,propertyvalueOUTPUT]
参数:(后面呈现过的参数,以下均省略。)
Propertyname――工具的属性称号;
Propertyvalue――前往的工具的属性值,该参数带OUTPUT属性,实行该操纵后,你就能够从propertyvalue中失掉属性的值了。
(b)挪用sp_OASetProperty将属性设为新值。
格局:sp_OASetPropertyobjecttoken,propertyname,propertyvalue
(c)挪用sp_OAMethod以挪用某个办法。
格局:sp_OAMethodobjecttoken,methodname[,returnvalueOUTPUT][,[parametername=]parametervalue[...n]]
参数:Returnvalue――挪用办法的前往值,假如没有前往值,此参数设置为NULL;
Parametername――办法界说中的参数称号,也就是形参;
Parametervalue――参数值;
……n――暗示,能够带良多参数,个数由办法界说限定;
(d)挪用sp_OAGetErrorInfo猎取最新的毛病信息。
格局:sp_OAGetErrorInfo[objecttoken][,sourceOUTPUT][,descriptionOUTPUT]
参数:Source――毛病源;
Description――毛病形貌;
(3)挪用sp_OADestroy开释工具。
格局:sp_OADestroyobjecttoken
2.xp_cmdshell扩大存储历程
该扩大存储历程在master数据库中,它的全路径是master..xp_cmdshell(注重,两头是2个点),它的功效是:以操纵体系命令行注释器的体例实行给定的命令字符串,并以文本行体例前往任何输入。
格局:xp_cmdshell{command_string}[,no_output]
参数:command_string――是在操纵体系命令行注释器上实行的命令字符串。
no_output――是可选参数,暗示实行给定的command_string,但不向客户端前往任何输入。本文使用中不利用该参数。
操纵办法
(1)软件筹办
请先到http://www.dimac.net/大概国际供应组件下载的网站下载最新版的JMail组件,假如你失掉的是安装版,实行weJMailx.exe便可,体系的设置安装程序会主动完成。假如只要一个JMail.dll文件,请依照上面的步骤安装:
(a)新建文本文件,输出以下命令:
regsvr32JMail.dll
netstartw3svc
另存为Install.Bat(注重,万万不要保留成Install.Bat.Txt啊)
(b)此文件连同Jmail.dll一同拷贝到SqlServer数据库服务器的System32目次下,并实行双击Install.Bat便可。
(2)筹办好了吗?跟我来吧
(a)运转SqlServer查询剖析器,并以sa身份登录到SqlServer数据库;
(b)假如你的存储历程要增加到YourDefaultCatalog数据库,请在空缺Sql窗口输出以下指令,不然请响应修正数据库名。
UseYourDefaultCatalog
按F5大概运转按钮运转该指令;
(c)创立基础发送存储历程
复制以下代码到SqlServer命令窗口,并运转。上面的代码中有响应的正文,文中未几做注释,若有疑问请检察后面的“准备常识”大概查询SqlServer匡助文件,固然也能够和作者接洽。
CreateProceduredbo.sp_jmail_send
@sendervarchar(100),
@sendernamevarchar(100)=,
@serveraddressvarchar(255)=SMTP服务器地点,
@MailServerUserNamevarchar(255)=null,
@MailServerPasswordvarchar(255)=null,
@recipientvarchar(255),
@recipientBCCvarchar(200)=null,
@recipientBCCNamevarchar(200)=null,
@recipientCCvarchar(200)=null,
@recipientCCNamevarchar(100)=null,
@attachmentvarchar(100)=null,
@subjectvarchar(255),
@mailbodytext
As
/*
该存储历程利用办公主动化剧本挪用Dimacw3JMailAxtiveX组件来取代SqlMail发送邮件
该办法撑持“服务器端身份考证”
*/
--声明w3JMail利用的惯例变量及毛病信息变量
Declare@objectint,@hrint,@rcint,@outputvarchar(400),@descriptionvarchar(400),@sourcevarchar(400)
--创立JMail.Message工具
Exec@hr=sp_OACreatejmail.message,@objectOUTPUT
--设置邮件编码
Exec@hr=sp_OASetProperty@object,Charset,gb2312
--身份考证
IfNot@MailServerUserNameisnull
Exec@hr=sp_OASetProperty@object,MailServerUserName,@MailServerUserName
IfNot@MailServerPasswordisnull
Exec@hr=sp_OASetProperty@object,MailServerPassword,@MailServerPassword
--设置邮件基础参数
Exec@hr=sp_OASetProperty@object,From,@sender
Exec@hr=sp_OAMethod@object,AddRecipient,NULL,@recipient
Exec@hr=sp_OASetProperty@object,Subject,@subject
Exec@hr=sp_OASetProperty@object,Body,@mailbody
--设置别的参数
ifnot@attachmentisnull
exec@hr=sp_OAMethod@object,Addattachment,NULL,@attachment,false
print@attachment
If(Not@recipientBCCisnull)And(Not@recipientBCCNameisnull)
Exec@hr=sp_OAMethod@object,AddRecipientBCC,NULL,@recipientBCC,@recipientBCCName
ElseIfNot@recipientBCCisnull
Exec@hr=sp_OAMethod@object,AddRecipientBCC,NULL,@recipientBCC
If(Not@recipientCCisnull)And(Not@recipientCCNameisnull)
Exec@hr=sp_OAMethod@object,AddRecipientCC,NULL,@recipientCC,@recipientCCName
ElseIfNot@recipientCCisnull
Exec@hr=sp_OAMethod@object,AddRecipientCC,NULL,@recipientCC
IfNot@sendernameisnull
Exec@hr=sp_OASetProperty@object,FromName,@sendername
--挪用Send办法发送邮件
Exec@hr=sp_OAMethod@object,Send,null,@serveraddress
--捕捉JMail.Message非常
Exec@hr=sp_OAGetErrorInfo@object,@sourceOUTPUT,@descriptionOUTPUT
if(@hr=0)
Begin
Set@output=毛病源:+@source
Print@output
Select@output=毛病形貌:+@description
Print@output
End
Else
Begin
Print猎取毛病信息失利!
Return
End
--开释JMail.Message工具
Exec@hr=sp_OADestroy@object
(d)简化存储历程操纵,以合适我们平常的利用习气
下面的存储历程基础能够完成邮件发送操纵,可是十分冗杂,并且不切合我们的习气,好比它不撑持多个发送给吸收者、不撑持将Sql指令运转了局以附件情势发送(这是SqlMail的功效,我们也能够做到)等,以是我们要再写一个存储历程来挪用它,以简化操纵,并扩大功效。
CreateProcedureSendMail
@SendervarChar(50)=null,
@strRecipientsvarChar(200),
@strSubjectvarChar(200),
@strMessagevarChar(2000),
@sqlvarChar(50)=null)
As
Declare@SplitStrvarchar(1)--界说邮件地点支解符变量
Declare@strTempvarchar(200)--界说多个收件人字符串一时变量
Declare@emailvarchar(50)--用支解符支解后的单个收件人字符串变量
Declare@SenderAddressvarChar(50)
Declare@AttachvarChar(200)
Declare@DefaultSendervarChar(50)
Declare@MailServervarChar(50)
Declare@UservarChar(50)
Declare@PassvarChar(50)
Declare@SenderNamevarChar(50)
Declare@AttachDirvarChar(100)
--初始化缺省变量
Set@DefaultSender=缺省发送地点
Set@MailServer=邮件服务器地点
Set@User=SMTP服务器考证用户地点
Set@Pass=SMTP服务器考证地点
Set@SenderName=缺省发件人称号
Set@AttachDir=E:LOGWebDataJmail+Replace(Replace(Replace(Convert(varChar(19),GetDate(),120),-,),,),:,)+.txt
--将Email地点支解符一致为分号
set@SplitStr=;
Set@strTemp=@strRecipients+@SplitStr+end
Set@strTemp=Replace(@strTemp,,,;)
--判别是不是有sql语句
If(@SqlisNull)Or(len(@Sql)=0)
Set@AttachDir=Null
Else
Begin
Declare@CmdStrvarChar(200)
Set@CmdStr=bcp"+@Sql+"queryout+@AttachDir+-c
EXECmaster..xp_cmdshell@CmdStr
End
whileCharIndex(@SplitStr,@strTemp,1)0
Begin
Set@email=left(@strTemp,CharIndex(@SplitStr,@strTemp,1)-1)
Set@strTemp=right(@strTemp,len(@strTemp)-len(@email)-1)
If(@SenderIsNull)Or(Len(@Sender)=0)
Set@SenderAddress=@DefaultSender
Else
Set@SenderAddress=@Sender
Print@email
--挪用sp_jmail_send发送邮件
EXECsp_jmail_send@sender=@SenderAddress,@sendername=@SenderName,
@serveraddress=@MailServer,@MailServerUserName=@User,@MailServerPassword=@Pass,
@recipient=@email,@subject=@strSubject,@mailbody=@strMessage,@attachment=@AttachDir
End
此存储历程只扩大了Sql查询了局附件发送,假如你要发送尺度附件,请间接利用sp_jmail_send存储历程大概自行扩大功效。
解决方案提供商应记住DBaaS通常仅仅是解决方案的一部分。客户之所以与他们的解决方案提供商协同工作,不仅是因为他们出售的产品,而且还因为他们所提供的服务。
飘灵儿 该用户已被删除
沙发
发表于 2015-1-25 22:16:18 | 只看该作者
一直以来个人感觉SQLServer的优化器要比Oracle的聪明。SQL2005的更是比2k聪明了不少。(有次作试验发现有的语句在200万级时还比50万级的相同语句要快show_text的一些提示没有找到解释。一直在奇怪。)
小魔女 该用户已被删除
板凳
发表于 2015-2-4 08:19:44 | 只看该作者
是否碎片会引发效率问题?这都是需要进一步探讨的东西。varbinary(max)代替image也让SQLServer的字段类型更加简洁统一。
再现理想 该用户已被删除
地板
发表于 2015-2-9 19:58:37 | 只看该作者
可能有的朋友会抱怨集成的orderby,其实如果使用ranking函数,Orderby是少不了的。如果担心Orderby会影响效率,可以为orderby的字段建立聚集索引,查询计划会忽略orderby操作(因为本来就是排序的嘛)。
愤怒的大鸟 该用户已被删除
5#
发表于 2015-2-27 19:51:41 | 只看该作者
语句级快照和事务级快照终于为SQLServer的并发性能带来了突破。个人感觉语句级快照大家应该应用。事务级快照,如果是高并发系统还要慎用。如果一个用户总是被提示修改不成功要求重试时,会杀人的!
透明 该用户已被删除
6#
发表于 2015-3-9 12:29:30 | 只看该作者
数据库物理框架没有变动undo和redo都放在数据库得transaction中,个人感觉是个败笔。如果说我们在设计数据库的时候考虑分多个数据库,可能能在一定程度上避免I/O效率问题。
若天明 该用户已被删除
7#
发表于 2015-3-16 22:18:30 | 只看该作者
也可谈一下你是怎么优化存储过程的?
简单生活 该用户已被删除
8#
发表于 2015-3-23 06:03:06 | 只看该作者
始终遗憾SQLServer的登陆无法分配CPU/内存占用等指标数。如果你的SQLServer给别人分配了一个只可以读几个表的权限,而这个家伙疯狂的死循环进行连接查询,会给你的系统带来很大的负担。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 02:58

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表