使用sql server+jmail组件发送邮件

预备知识
    1.OLE自动化函数
    OLE自动化使应用程序能够对另一个应用程序中实现的对象进行操作,或者将对象公开以便可以对其进行操作。自动化客户端是可对属于另一个应用程序的公开对 象进行操作的应用程序,本文值得是Sql Server。公开对象的应用程序称为自动化服务器,又成为自动化组件,本文中即Jmail组件咯。客户端通过访问应用程序对象的属性和函数对这些对象进 行操作。
    在Sql Server使用Ole组件的途径是几个系统扩展存储过程sp_OACreate、sp_OADestroy、sp_OAGetErrorInfo、 sp_OAMethod、sp_OASetProperty和sp_OAGetProperty,再次简单地介绍一下使用方法,详细资料参考Sql Server联机丛书。
    OLE自动化对象的使用方法:
    (1)调用 sp_OACreate 创建对象。
    格式:sp_OACreate clsid,objecttoken OUTPUT [ , context ]
    参数:clsid——是要创建的 OLE 对象的程序标识符 (ProgID)。此字符串描述该 OLE 对象的类,其形式,如 'OLEComponent.Object',OLEComponent 是 OLE 自动化服务器的组件名称,Object 是 OLE 对象名,本文中使用的“JMail.Message”;
Objecttoken——是返回的对象标志,并且必须是数据类型为 int 的局部变量。用于标识所创建的 OLE 对象,并将在调用其它 OLE 自动化存储过程时使用。本文中就是通过它来调用JMail.Message组件的属性和方法的。
    Context——指定新创建的 OLE 对象要在其中运行的执行上下文。本文不使用该参数,故不赘述。以下与此一致,所有方法属性的其他用法请参阅Sql Server联机文档。
    (2)使用该对象。
    (a)调用 sp_OAGetProperty 获取属性值。
    格式:_OAGetProperty objecttoken,propertyname [, propertyvalue OUTPUT]
    参数:(前面出现过的参数,以下均省略。)
    Propertyname——对象的属性名称;
    Propertyvalue——返回的对象的属性值,该参数带OUTPUT属性,执行该操作后,你就可以从propertyvalue中得到属性的值了。
    (b)调用 sp_OASetProperty 将属性设为新值。
    格式:sp_OASetProperty objecttoken, propertyname, propertyvalue
    (c)调用 sp_OAMethod 以调用某个方法。
    格式:sp_OAMethod objecttoken, methodname [, returnvalue OUTPUT] [ , [ parametername = ] parametervalue  [...n]]
    参数:Returnvalue——调用方法的返回值,如果没有返回值,此参数设置为NULL;
    Parametername——方法定义中的参数名称,也就是形参;
    Parametervalue——参数值;
    ……n——表示,可以带很多参数,个数由方法定义限制;
    (d)调用 sp_OAGetErrorInfo 获取最新的错误信息。
    格式:sp_OAGetErrorInfo [objecttoken ] [, source OUTPUT] [, description OUTPUT]
    参数:Source——错误源;
    Description——错误描述;
    (3)调用 sp_OADestroy 释放对象。
    格式:sp_OADestroy objecttoken

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)新建文本文件,输入如下命令:
    regsvr32 JMail.dll
    net start w3svc
    另存为Install.Bat(注意,千万不要保存成Install.Bat.Txt啊)
    (b)此文件连同Jmail.dll一起拷贝到Sql Server数据库服务器的System32目录下,并执行双击Install.Bat即可。
    (2)准备好了吗?跟我来吧
    (a)运行Sql Server查询分析器,并以sa身份登录到Sql Server数据库;
    (b)如果你的存储过程要添加到YourDefaultCatalog数据库,请在空白Sql窗口输入如下指令,否则请相应修改数据库名。
    Use YourDefaultCatalog
    按F5或者运行按钮运行该指令;
    (c)创建基本发送存储过程
    复制如下代码到Sql Server命令窗口,并运行。下面的代码中有相应的注释,文中不多做解释,如有疑问请查看前面的“预备知识”或者查询Sql Server帮助文件,当然也可以和作者联系。

Create Procedure dbo.sp_jmail_send
@sender varchar(100),
@sendername varchar(100)='',
@serveraddress varchar(255)='SMTP服务器地址',
@MailServerUserName varchar(255)=null,
@MailServerPassword varchar(255)=null,
@recipient varchar(255),
@recipientBCC varchar(200)=null,
@recipientBCCName varchar(200)=null,
@recipientCC varchar(200)=null,
@recipientCCName varchar(100)=null,
@attachment varchar(100) =null,
@subject varchar(255),
@mailbody text
As
/*
该存储过程使用办公自动化脚本调用Dimac w3 JMail AxtiveX组件来代替Sql Mail发送邮件
该方法支持“服务器端身份验证”
*/
--声明w3 JMail使用 的常规变量及错误信息变量
Declare @object int,@hr int,@rc int,@output varchar(400),@description varchar (400),@source varchar(400)

--创建JMail.Message对象

Exec @hr = sp_OACreate 'jmail.message', @object OUTPUT

--设置邮件编码
Exec @hr = sp_OASetProperty @object, 'Charset', 'gb2312'

--身份验证
If Not @MailServerUserName is null
Exec @hr = sp_OASetProperty @object, 'MailServerUserName',@MailServerUserName
If Not @MailServerPassword is null
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

--设置其它参数
if not @attachment is null
exec @hr = sp_OAMethod @object, 'Addattachment', NULL , @attachment,'false'
print @attachment
If (Not @recipientBCC is null) And (Not @recipientBCCName is null)
Exec @hr = sp_OAMethod @object, 'AddRecipientBCC', NULL , @recipientBCC,@recipientBCCName
Else If Not @recipientBCC is null
Exec @hr = sp_OAMethod @object, 'AddRecipientBCC', NULL , @recipientBCC

If (Not @recipientCC is null) And (Not @recipientCCName is null)
Exec @hr = sp_OAMethod @object, 'AddRecipientCC', NULL , @recipientCC,@recipientCCName
Else If Not @recipientCC is null
Exec @hr = sp_OAMethod @object, 'AddRecipientCC', NULL , @recipientCC

If Not @sendername is null
Exec @hr = sp_OASetProperty @object, 'FromName', @sendername

--调用Send方法发送邮件
Exec @hr = sp_OAMethod @object, 'Send', null,@serveraddress

--捕获JMail.Message异常
Exec @hr = sp_OAGetErrorInfo @object, @source OUTPUT, @description OUTPUT

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指令运行结果以附件形式发 送(这是Sql Mail的功能,我们也可以做到)等,所以我们要再写一个存储过程来调用它,以简化操作,并扩展功能。

Create Procedure SendMail
@Sender varChar(50)=null,
@strRecipients varChar(200),
@strSubject varChar(200),
@strMessage varChar(2000),
@sql varChar(50)=null)
As

Declare @SplitStr varchar(1) --定义邮件地址分割符变量
Declare @strTemp varchar(200) --定义多个收件人字符串临时变量
Declare @email varchar(50) --用分割符分割后的单个收件人字符串变量

Declare @SenderAddress varChar(50)
Declare @Attach varChar(200)

Declare @DefaultSender varChar(50)
Declare @MailServer varChar(50)
Declare @User varChar(50)
Declare @Pass varChar(50)
Declare @SenderName varChar(50)
Declare @AttachDir varChar(100)

--初始化缺省变量
Set @DefaultSender='缺省发送地址'
Set @MailServer='邮件服务器地址'
Set @User='SMTP服务器验证用户地址'
Set @Pass='SMTP服务器验证地址'
Set @SenderName='缺省发件人名称'
Set @AttachDir='E:/LOG/WebData/Jmail/'+Replace(Replace(Replace(Convert(varChar(19),GetDate(),120),'-',''),' ',''),':','')+'.txt'

--将Email地址分割符统一为分号
set @SplitStr=';'
Set @strTemp=@strRecipients+@SplitStr+'end'
Set @strTemp=Replace(@strTemp,',',';')

--判断是否有sql语句
If (@Sql is Null) Or (len(@Sql)=0)
Set @AttachDir=Null
Else
Begin
Declare @CmdStr varChar(200)
Set @CmdStr='bcp "'+@Sql+'" queryout '+@AttachDir+' -c'
EXEC master..xp_cmdshell @CmdStr
End

while CharIndex(@SplitStr,@strTemp,1)<>0
Begin
Set @email=left(@strTemp,CharIndex(@SplitStr,@strTemp,1)-1)
Set @strTemp=right(@strTemp,len(@strTemp)-len(@email)-1)
If (@Sender Is Null) Or (Len(@Sender)=0)
Set @SenderAddress=@DefaultSender
Else
Set @SenderAddress=@Sender
Print @email
--调用sp_jmail_send发送邮件
EXEC sp_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存储过程或者自行扩展功能。

使用sql server+jmail组件发送邮件相关推荐

  1. 在Sql Server 中调用Jmail组件发送邮件

    在Sql Server 中调用Jmail组件发送邮件 预备知识 1.OLE自动化函数 OLE自动化使应用程序能够对另一个应用程序中实现的对象进行操作,或者将对象公开以便可以对其进行操作.自动化客户端是 ...

  2. 【转蝈蝈俊.net 】SQL Server 2005 配置发送邮件

    SQL Server 2005 配置发送邮件 这个教程是使用SQL Server Management Studio的管理工具完成配置的,其实这个配置也可以通过一系列的SQL语句完成配置. 使用SQL ...

  3. 简单介绍下我使用了一年多还不知道的Sql server 2005 组件知识

    简介 Microsoft SQL Server 2005 是用于大规模联机事务处理 (OLTP).数据仓库和电子商务应用的数据库平台:也是用于数据集成.分析和报表解决方案的商业智能平台. SQL Se ...

  4. SQL Server 阻止组件 xp_cmdshell

    错误信息描述 消息 15281,级别 16,状态 1,过程 xp_cmdshell,第 1 行 SQL Server 阻止了对组件 'xp_cmdshell' 的 过程 'sys.xp_cmdshel ...

  5. SQL Server 使用数据库发送邮件(sp_send_dbmail)

    CSDN广告是越来越多了,所有博客笔记不再更新,新网址 DotNet笔记 项目开发中,很多地方需要发送邮件,比如下订单,取消订单等等,可以通过程序代码(c#,java等)发送,亦可以使用数据库的触发器 ...

  6. 【C#+SQL Server+打印组件】实现电商快递单打印系统 二:数据库设计与开发环境(附源码和资源)

    需要源码和资源请点赞关注收藏后评论区留言私信~~~ 一.系统开发环境要求 开发快递单打印精灵项目的计算机需要满足以上条件 操作系统:windows7以上 开发环境:Visual Studio 2022 ...

  7. [导入]ASP.Net环境下使用Jmail组件发送邮件

    配置环境:.Net Framework 1.1,Imai8.02,w3Jmail4.3 实现过程: 不同于在Asp中使用Jmail,直接使用 Server.CreateObject("Jma ...

  8. VB2005.Net 环境下使用Jmail组件发送邮件

    配置环境:.Net Framework 2.0 测试版2,w3Jmail4.4,Windows XP (sp2) 使用过程: 1.首先安装jmail4.4 2.找到jmail.dll(安装目录下)co ...

  9. 【C#+SQL Server+打印组件】实现电商快递单打印系统 五:自定义组件和快递单模板设计(附源码和资源)

    需要源码和资源请点赞关注收藏后评论区留言私信~~~ 一.自定义组件(扩展TextBox) 由于快递单种类较多,所以在设计系统时考虑开发一个通用模板,由用户根据自己使用的快递单样式自行定义快递单的文本输 ...

最新文章

  1. C# 动态执行批处理命令
  2. html5 video css样式修改,htmlvideo标签用法
  3. SpringSecurity使用自定义认证页面
  4. 语言题库体型判断问题_1000道Python题库系列分享20(43道填空与判断题)
  5. 【计算机网络复习 物理层】2.2 物理传输介质
  6. mac基础操作:在Mac上怎么使用夜览
  7. P1420 最长连号(python3实现)
  8. Elasticsearch启动报错:Exception in thread “main“ java.nio.file.AccessDeniedException:
  9. html5移动端开发(rem和媒体查询@media)
  10. linux考试中的7654_全国计算机等级考试你了解多少?
  11. (转)嘉信理财再度全面降佣,它会否成为投资界的Amazon?
  12. c语言贪吃蛇添加排行榜,用C语言写贪吃蛇笔记-1
  13. Easyrecovery激活码生成器分享
  14. 腾讯qq的授权管理查看页面
  15. 【因缘际会】知乎APP的简单的产品体验报告
  16. elementUi中的图片预览功能(图片放大、缩小)preview-src-list属性
  17. 关于三点演讲与口才训练方法
  18. java请输入三个成绩 求平均分_Java编程,定义一个学生类,输入3个学生数据,输出平均分和总分...
  19. 【今日CV 计算机视觉论文速览 92期】 2 Apr 2019
  20. 浅谈PE(私募股权)业务及系统建设:02. 系统建设

热门文章

  1. 如何将canvas转化为图片
  2. 微软系列的PPC开发工具【转贴】
  3. 申宝优配-强者恒强还将继续
  4. Swift5代码添加约束
  5. 移远BC20模组使用LwM2M协议接入华为IoT平台(NB-IoT专栏—进阶篇2)
  6. 中级微观经济学:Chap 14 消费者剩余
  7. 三种引入JavaScript方法
  8. 2021年好用的几款大数据分析工具
  9. 北京高级软件需求分析师培训招生!
  10. Access denied for user ''@'localhost' to database 'mysql' 解决办法