使用
SQL Server
的
SQL Mail
发送邮件不好配置,
还是用微软的
CDO for Microsoft Windows NT Server (CDONTS)
,来得更容易。
下面是发送邮件的存储过程:
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
/***************************************************************************************
作
者:
shongshong
修改加注
日
期:
2007
年
1
月
15
日
目 的:
使用
MS CDONTS
发送邮件
参数说明:
@SMTPSERVER varchar(100)--
发送服务器
,@USER_ID VARCHAR(100)--
用户名
,@USER_PWD VARCHAR(30)--
密码
,@From varchar(100)--
发件人
MAIL
,@To varchar(100)--
收件人
MAIL
,@Bcc varchar(500)--
副本
MAIL
,@Subject varchar(400)=" "--
邮件标题
,@Body varchar(1000) =" " --
邮件内容
范
例:
exec sys_sendmail '
发送服务器
','
用户名
','
密码
', '
发件人
MAIL,'
收件人
MAIL','
副本
MAIL','
邮件标题
','
邮件内容
'
'***************************************************************************************/
CREATE PROCEDURE sys_sendmail @SMTPSERVER varchar(100),@USER_ID VARCHAR(100),@USER_PWD VARCHAR(30), @From varchar(100) , @To varchar(100) , @Bcc varchar(500), @Subject varchar(400)=" ", @Body varchar(1000) =" "
AS
Declare @SQLSTRING varchar(8000)
set @SQLSTRING='Declare @object int '+char(13)
set @SQLSTRING=@SQLSTRING+'Declare @hr int '+char(13)
set @SQLSTRING=@SQLSTRING+'EXEC @hr = sp_OACreate ''CDO.Message'', @object OUT '+char(13)
--
设定服务器地址
set @SQLSTRING=@SQLSTRING+'EXEC @hr = sp_OASetProperty @object, ''Configuration.fields("http://schemas.microsoft.com/cdo/configuration/sendusing").Value'',''2'' '+char(13)
set @SQLSTRING=@SQLSTRING+'EXEC @hr = sp_OASetProperty @object, ''Configuration.fields("http://schemas.microsoft.com/cdo/configuration/smtpserver").Value'', '''+@SMTPSERVER+''''+char(13)
--
设定验证用户名和密码
set @SQLSTRING=@SQLSTRING+'EXEC @hr = sp_OASetProperty @object, ''Configuration.fields("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate").Value'',''1'' '+char(13)
set @SQLSTRING=@SQLSTRING+'EXEC @hr = sp_OASetProperty @object, ''Configuration.fields("http://schemas.microsoft.com/cdo/configuration/sendusername").Value'','''+@USER_ID+''''+char(13)
set @SQLSTRING=@SQLSTRING+'EXEC @hr = sp_OASetProperty @object, ''Configuration.fields("http://schemas.microsoft.com/cdo/configuration/sendpassword").Value'','''+@USER_PWD+''''+char(13)
--
设定
收件人,副本,发件人,邮件标题
set @SQLSTRING=@SQLSTRING+'EXEC @hr = sp_OAMethod @object,''Configuration.Fields.Update'', null'+char(13)
set @SQLSTRING=@SQLSTRING+'EXEC @hr = sp_OASetProperty @object, ''To'', '''+@To+''''+char(13)
set @SQLSTRING=@SQLSTRING+'EXEC @hr = sp_OASetProperty @object, ''Bcc'', '''+@Bcc+''''+char(13)
set @SQLSTRING=@SQLSTRING+'EXEC @hr = sp_OASetProperty @object, ''From'', '''+@From+''''+char(13)
set @SQLSTRING=@SQLSTRING+'EXEC @hr = sp_OASetProperty @object, ''Subject'','''+@Subject+''''+char(13)
--
设定支持格式,邮件内容
set @SQLSTRING=@SQLSTRING+'EXEC @hr = sp_OASetProperty @object, ''TextBody'', '''+@Body+''''+char(13)--Text
格式
--set @SQLSTRING=@SQLSTRING+'EXEC @hr = sp_OASetProperty @object, ''HtmlBody'', '''+@Body+''''+char(13)--HTML
格式的邮件
set @SQLSTRING=@SQLSTRING+'EXEC @hr = sp_OAMethod @object, ''Send'', NULL'+char(13)
--
判断是否发送成功
set @SQLSTRING=@SQLSTRING+'IF @hr <> 0'+char(13)
set @SQLSTRING=@SQLSTRING+'BEGIN'+char(13)
set @SQLSTRING=@SQLSTRING+' EXEC sp_OAGetErrorInfo @object '+char(13)
set @SQLSTRING=@SQLSTRING+'END'+char(13)
set @SQLSTRING=@SQLSTRING+'PRINT ''success'''+char(13)
set @SQLSTRING=@SQLSTRING+'EXEC @hr = sp_OADestroy @object'+char(13)
exec(@SQLSTRING)
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
上面的存储过程你在网上搜一下就可以找到一打的,我只不过是加了一些注释方便自己理解。
这里要说的是我发现的一个东西。当我们用上面的存储过程给用户发邮件时,收件人收到的邮件显示的发件人是一个
E-mail
地址,而当客户要求要显示发件人姓名时这个存储过程好像没有办法了。当我无计可施时,忽然想起
OUT LOOK
中复制一个发件人到新增的邮件的收件人一栏时会发生这样的变化:我复制发件人
”shongshong”
到收件人一栏,粘贴上去之后会变成
”shongshong<shong@Gamil.com>”
。于是我就想,我将“发送
MAILE
”变成这种格式是否可以发送邮件给收件人,并让收件人收到的邮件中发件人显示姓名。
我试了一下,结果是可以的。耶
!!
问题解决。
还有一点要提的是,当我们用正确的用户名与密码登入发送服务器后,我们用这个发送服务器中任一存在的邮件账号都可以发邮件出去。也就是说,发件人可以填你知道的发送服务器中任意邮件账号。
参考文献:
How to send e-mail without using SQL Mail in SQL Server