1、文摘SQLMail的原理及实际应用(文摘)SQLMail的原理及实际应用 关键词:Sql Server -概述 -这里所指的SQLMail,是微软公司的关系数据库管理系统 SQLServer所提供的邮件功能。在SQLServer中包含一些扩展存储 过程,使得SQLServer可以通过基于WindowsNT内部的消息应用编 程界面(MAPI)的客户机邮件程序接收和发送邮件消息。SQLMa il可发送的消息包括文本串,附加文件或SQL语句的执行结果 集。应用SQLMail的扩展存储过程,邮件消息可以从一个触发 器或一个存储过程中发送,并且通过SQLServer提供的任务和警 告等功能,可以根据需要
2、在不同的时间和情况下发送。 -SQLMail工作流程 -SQLMail工作流程主要分为邮件收、发两个过程。 -在SQLServer内可以通过一定方法,调用扩展存储过程xp_s endmail,将收信人电子邮件地址,标题,信的内容等以参数的 形式传送给xp_sendmail,由它通过客户端MAPI接口将发送邮件任 务交给如MicrosoftExchangeClient或Outlook97等邮件客户端程序, 最终通过邮件服务将邮件发送出去。 -收邮件的过程与此相似。在SQLServer端定期或手工调用x p_readmail扩展存储过程,通过客户端MAPI接口将存放在邮件服 务器或客户端的邮件及其
3、他信息读入SQL变量中,用来满足特 定的处理需要。 配置SQLMail -配置SQLMail的首要条件是要有一个电子邮件帐户,不管 是局域网内的MSExchangeServer或MSMail3.x的邮件帐户,还是Int ernet上的SMTP,POP3等邮件帐户均可。具体配置可分为以下几步 : -1为SQLServer创建一个NT域用户帐号,要求具有本地管 理员组的权限。仔细设置帐号口令,保证口令足够复杂,且 设成口令永不过期和用户不得更改口令。 -2双击控制面板的服务图标,找到MSSQLServer的启动设 置,将UseSystemAccount改为UseThisAccount,将刚才建立的
4、NT帐号 和口令输入。重新启动SQLServer。 -3在安装SQLServer的服务器上以与启动SQLServer相同的 NT帐号登录,然后安装支持MAPI接口的邮件客户端程序,如MS ExchangeClient和Outlook97。 -4打开控制面板的电子邮件选项,建立一个配置文件 (Profile)。用这个配置文件启动邮件客户端程序,反复检验 直至能正常收发邮件。 -5从SqlEnterpriserManager中,点中相应的服务器图标,从 Server菜单中选SQLMail/Configure,将在第4步中建立的配置文件 名输入。 -6从SqlEnterpriserManager中,
5、点中相应的服务器图标,从 Server菜单中选SQLMail/Start,如果SqlMail的图标变为绿色,则SQ LMail成功启动。 -常用的SQLMail扩展存储过程 xp_sendmailrecipient=recipient ;recipient2;.;recipientn ,message=message ,query=query ,attachments=attachments ,copy_recipients=recipient ;recipient2;.;recipientn ,blind_copy_recipients=recipient ;recipient2;.;rec
6、ipientn ,subject=subject ,type=type ,attach_results= true | false ,no_output= true | false ,no_header= true | false ,width=width ,separator=separator ,echo_error= true | false ,set_user=user ,dbuse=dbname -此存储过程通过客户端MAPI接口发送邮件,内容可以是 文本串,附加文件或SQL语句的执行结果集。 xp_findnextmsgmsg_id=msg_idOUTPUT ,type=type
7、,unread_only= true | false ) -此存储过程在邮箱中查找特定的邮件,并返回一封邮件 的消息ID。 xp_readmail(msg_id=msg_id,type=typeOUTPUT ,peek= true | false ,suppress_attach= true | false ,originator=senderOUTPUT ,subject=subject_lineOUTPUT ,message=body_of_messageOUTPUT ,recipients=recipient_listOUTPUT ,cc_list=cc_listOUTPUT ,bcc_
8、list=bcc_listOUTPUT ,date_received=dateOUTPUT ,unread= true | false ,attachments=temp_file_pathsOUTPUT) ,skip_bytes=bytes_toskipOUTPUT ,msg_length=length_in_bytesOUTPUT) -此存储过程从指定的邮件收件箱中读取指定消息ID的邮 件的各项信息。 -xp_deletemailmsg_id=msg_id -从邮件收件箱中删除一封指定消息ID的邮件。 -注释: -1.存储过程的多个参数间用逗号间隔开,内的为可选 参数,每个参数均以符号加字
9、符串开头,用以区别不同的参 数项。等号后可以是常量,也可以是预先定义好的变量。 -2.如果需要将某个结果值赋予参数中预先定义好的变 量,就必须在该项参数的最后加OUTPUT。 -3.常用参数解释: -?recipient=recipient;指定收件人的电子邮件地址。如 果有多个收件人,可以用分号分隔开。 -?subject=subject;邮件的标题。发送邮件时的默认值为 SQLServerMessage 。 -?message=message;邮件的具体内容。 -?attachments=attachments;邮件挂接的附加文件名。 -?type=type;基于MAPI定义的消息类型,详
10、细信息参见 MicrosoftWindowsNTResourceKit 或 MicrosoftMailTechnicalReference 。 -?query=query;一条SQL可执行语句,其执行结果以正文 或附件的方式随邮件发送。 -?msg_id=msg_id;对于信箱中的每一封邮件均被分配了 -?attachments=attachments;邮件挂接的附加文件名。 -?type=type;基于MAPI定义的消息类型,详细信息参见 MicrosoftWindowsNTResourceKit 或 MicrosoftMailTechnicalReference 。 -?query=que
11、ry;一条SQL可执行语句,其执行结果以正文 或附件的方式随邮件发送。 -?msg_id=msg_id;对于信箱中的每一封邮件均被分配了 一个特殊的消息ID,用以相互区分。 -?originator=sender;读取特定邮件的发送者的邮件地 址。 -基于SQLMail的电子报刊自动处理系统 -这里利用SQLMail简单的实现了一个电子报刊自动处理系 统。每当新的一期电子报刊编辑完成,只需简单追加到发行 数据库publication中,SQLServer会自动定期执行my_publish存储过 程。在my_publish存储过程中,它检查发行数据库,当发现有新 的记录(即新的一期电子报刊)时,
12、就通过逐个从订阅数据库 sub_info中取出订阅人的邮件地址,完成给每个订阅者发送电 子报刊(以邮件形式)的任务。 -电子报刊的订阅与取消也是通过邮件来实现。SQLServer 同样定期执行my_subscibe存储过程。my_subscibe存储过程检查特定 邮箱中的所有邮件,如果存在标题为 subscribe 的邮件,就取 出它的发件人等信息,在订阅数据库中添加一条记录;同样, 如果存在标题为 stopsubscribe 的邮件,就将它的相关记录从 订阅数据库中删除。系统中用到的数据库和存储过程如下所 示。sub_info(订阅者信息数据库) 字段名称类型允许空值含义 emailvarc
13、har(20)NOTNULL订阅者电子邮件地址 sub_datedatetimeNOTNULL订阅时间 othertextNULL订阅者的其他信息 publication(电子报刊出版数据库) 字段名称类型允许空值含义 pub_classchar(10)NOTNULL电子报刊期号 pub_datedatetimeNULL出版日期 titletextNOTNULL本期电子报刊标题 contenttextNOTNULL电子报刊正文 endnotetextNULL附加于报刊的其他信息 flagsmallintNULL1,标志为未出版的新报刊 my_subscribe,用于处理订阅者信息的存储过程。
14、CREATEPROCEDUREmy_subscribe AS declaremsg_idvarchar(64) declaresubjectvarchar(255) declaremessagevarchar(255) declareoriginatorvarchar(255) declaredatevarchar(255) declarestatusint declaremapifailureint selectmapifailure=0 while(1=1) begin /*查找邮件并获取消息ID*/ execstatus=master. xp_findnextmsgmsg_id=msg_
15、idOUTPUT ifstatus 0 begin selectmapifailure=1 break end ifmsg_idisnullbreak /*读取邮件的信息到变量中*/ execstatus=master.xp_readmail msg_id=msg_id, originator=originatorOUTPUT, subject=subjectOUTPUT, message=messageOUTPUT, date_received=dateOUTPUT ifstatus 0 begin selectmapifailure=1 break end /*根据邮件标题,在订阅数据库中
16、添加或删除记录*/ execxp_deletemailmsg_id=msg_id ifsubject= subscribe insertintosqlmailsample. sub_infovalues(originator,date,message) else ifsubject= stopsubscribe deletefromsqlmailsample.sub_infowhereemail=originator end/*循环结束*/ ifmapifailure=1 /*错误处理代码*/ else return(0) GO my_publish,用于分发电子报刊的存储过程。 CREATE
17、PROCEDUREmy_publish AS declarerecipientvarchar(255) declaresubjectvarchar(255) declarecontentvarchar(255) declareendnotevarchar(255) declarestatusint selectsubject=pub_classfrom sqlmailsample.publicationwhereflag=1 /*如果有新的电子报刊,则开始分发*/ if(subjectisnotnull) begin /*将数据库记录取出,经过适当处理后,存放到变量中*/ selectsubj
18、ect=convert(varchar (255),title)+ ( +pub_class+ ) , content=convert(varchar(255),content) +convert(varchar(255),endnote) fromsqlmailsample.publication whereflag=1 updatesqlmailsample.publication setflag=0whereflag=1 declarecurcursorforselect emailfromsqlmailsample.sub_info opencur fetchcur while(fet
19、ch_status=0) begin /*取收件人的电子邮件地址*/ fetchnextfromcurintorecipient /*发送电子邮件*/ iffetch_status=0 begin execstatus=master.xp_sendmail recipients=recipient, message=content, subject=subject ifstatus 0 /*错误处理代码*/ end end/*向所有订阅人发送电子报刊的循环结束*/ closecur deallocatecur end GO -总之,SQLMail在数据库和电子邮件之间架起了一座沟通 end/*向所有订阅人发送电子报刊的循环结束*/ closecur deallocatecur end GO -总之,SQLMail在数据库和电子邮件之间架起了一座沟通 的桥梁,为某些特定用途的应用提供了简单高效的解决方案 ,值得一试
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1