如何利用SQL發送Email???

ALAN_XQ 2009-04-07 05:29:05
RT,解決立即給分!!!
...全文
769 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
jinjazz 2009-04-08
  • 打赏
  • 举报
回复
弱弱地路过一下,SQLMail还没有用过,我都是自己写代码的发邮件的。
System.Net.Mail.SmtpClient
-狙击手- 2009-04-08
  • 打赏
  • 举报
回复
正确配置和使用SQL mail 

使用SQL Mail收发和自动处理邮件中的扩展存储过程简介

SQL SERVER提供了通过EXCHANGE或OUTLOOK收发邮件的扩展存储过程,下面将这几个过程简单的介绍一下。

一、启动SQL Mail

xp_startmail @user,@password

@user和@password都是可选的

也可打开Enterprise Manager中的Support Services,在SQL Mail上单击右键打开右键菜单,然后按Start来启动

二、停止SQL Mail

xp_stopmail

也可用上述方法中的菜单里的Stop来停止

三、发送邮件

xp_sendmail {[@recipients =] 'recipients [;...n]'}
[,[@message =] 'message>
[,[@query =] 'query>
[,[@attachments =] attachments]
[,[@copy_recipients =] 'copy_recipients [;...n]'
[,[@blind_copy_recipients =] 'blind_copy_recipients [;...n]'
[,[@subject =] 'subject>
[,[@type =] 'type>
[,[@attach_results =] 'attach_value>
[,[@no_output =] 'output_value>
[,[@no_header =] 'header_value>
[,[@width =] width]
[,[@separator =] 'separator>
[,[@echo_error =] 'echo_value>
[,[@set_user =] 'user>
[,[@dbuse =] 'database>

其中@recipients是必需的

参数说明:

参数 说明
@recipients 收件人,中间用逗号分开
@message 要发送的信息
@query 确定执行并依附邮件的有效查询,除触发器中的插入表及删除表外,此查询能引用任何对象
@attachments 附件
@copy_recipients 抄送
@blind_copy_recipients 密送
@subject 标题
@attach_results 指定查询结果做为附件发送
@no_header 不发送查询结果的列名
@set_user 查询联接的用户名,默认为Guset
@dbuse 查询所用的数据库,默认为缺省数据库

四、阅读邮件收件箱中的邮件

xp_readmail [[@msg_id =] 'message_number> [, [@type =] 'type' [OUTPUT]]
[,[@peek =] 'peek>
[,[@suppress_attach =] 'suppress_attach>
[,[@originator =] 'sender' OUTPUT]
[,[@subject =] 'subject' OUTPUT]
[,[@message =] 'message' OUTPUT]
[,[@recipients =] 'recipients [;...n]' OUTPUT]
[,[@cc_list =] 'copy_recipients [;...n]' OUTPUT]
[,[@bcc_list =] 'blind_copy_recipients [;...n]' OUTPUT]
[,[@date_received =] 'date' OUTPUT]
[,[@unread =] 'unread_value' OUTPUT]
[,[@attachments =] 'attachments [;...n]' OUTPUT])
[,[@skip_bytes =] bytes_to_skip OUTPUT]
[,[@msg_length =] length_in_bytes OUTPUT]
[,[@originator_address =] 'sender_address' OUTPUT]]

参数说明:

参数 说明
@originator 发件人
@subject 主题
@message 信息
@recipients 收件人
@skip_tytes 读取邮件信息时跳过的字节数,用于顺序获取邮件信息段。
@msg_length 确定所有信息的长度,通常与@skip_bytes一起处理长信息

五、顺序处理下一个邮件

xp_findnextmsg [[@msg_id =] 'message_number' [OUTPUT]]
[,[@type =] type]
[,[@unread_only =] 'unread_value> )

六、删除邮件

xp_deletemail {'message_number'}

如果不指定邮件编号则删除收件箱中的所有邮件

七、自动处理邮件

sp_processmail [[@subject =] 'subject>
[,[@filetype =] 'filetype>
[,[@separator =] 'separator>
[,[@set_user =] 'user>
[,[@dbuse =] 'dbname>






>用户在网上注册后,系统将随机产生的密码发送到用户登记的Email
>用户在论坛的帖子有回复时将内容发送到用户的Email
因为上述过程都是在存储过程中完成的,所以避免了前台程序对参数的传输处理,也不需要再用第三方的组件完成,感觉比较方便。

1.为了使用SQL mail,首先你的服务器上得有SMTP服务,我没有安装win2000 server自带的SMTP,而是用imail6.04的SMTP,感觉比较稳定,功能也比较强。
2.安装一个邮件系统,我安装了outLook 2000,我发现在配置邮件profile时,如果
不安装outLook而是用别的第三方程序,win2k中文server版在控制面板中就找不到“邮件”一项.
3.安装完outlook后再刷新控制面板,就会找到“邮件”一项,双击进行邮件的配置,为配置文件起一个名字(假设为myProfile),以便以后SQL mail使用,在该配置文件中设置各项属性。
4.启动outlook(设置为用myProfile作为默认的配置文件),测试进行收发邮件,确认outlook工作正常。
5.用当前的域帐户启动SQL server,在企业管理器的支持服务中,点击SQL mail的属性,可以看到在配置文件选择中,出现了刚才定义的myProfile配置文件(你也可以定义多个profile),选择这个配置文件进行测试,SQL将返回成功开始和结束一个MAPI会话的信息,如果出现错误或是没有找到邮件配置文件,那一定是你启动SQL server用的帐号有问题
6.现在你就可以在查询分析器中用XP_sendmail这个扩展存储过程发送SQL mail了,格式如下:
xp_sendmail {[@recipients =] 'recipients [;...n]'}
[,][@message =] 'message>
[,][@query =] 'query>
[,][@attachments =] attachments]
[,][@copy_recipients =] 'copy_recipients [;...n]'
[,][@blind_copy_recipients =] 'blind_copy_recipients [;...n]'
[,][@subject =] 'subject>
[,[@type =] 'type>
[,][@attach_results =] 'attach_value>
[,][@no_output =] 'output_value>
[,][@no_header =] 'header_value>
[,][@width =] width]
[,][@separator =] 'separator>
[,][@echo_error =] 'echo_value>
[,][@set_user =] 'user>
[,][@dbuse =] 'database>

其中@recipients是必需的

参数说明:

参数 说明
@recipients 收件人,中间用逗号分开
@message 要发送的信息
@query 确定执行并依附邮件的有效查询,除触发器中的插入表及删除表外,此查询能引用任何对象
@attachments 附件
@copy_recipients 抄送
@blind_copy_recipients 密送
@subject 标题
@attach_results 指定查询结果做为附件发送
@no_header 不发送查询结果的列名
@set_user 查询联接的用户名,默认为Guset
@dbuse 查询所用的数据库,默认为缺省数据库


7.不过,如果是在web应用中使用SQL mail,还有一些问题要解决:首先,就是应用程序中连接数据库的帐号,我在网站程序中的数据库连接是使用UDL文件,帐号为DbGuest,这是一个普通帐户,所以还必须在master库的扩展存储过程找到XP_sendmail,并在其属性中增加DbGuest这个用户,并选择EXEC权限。
好了,现在设置完毕,运行网站程序,测试用户注册,几乎没有什么延迟,我测试用的邮箱中就收到了这封SQL mail发出的Email:
"谢谢你的注册,建议你首次登录后修改密码"




kye_jufei 2009-04-08
  • 打赏
  • 举报
回复
SQL2008下調用:

exec sp_jmail_send 'jufei','jufei@geniusnet.com.tw','jufei','jiang12475+','172.20.100.21','jufei@geniusnet.com.tw',null,null,null,null,null,'aaa','bbb'
kye_jufei 2009-04-08
  • 打赏
  • 举报
回复
我使用SQL2008已實現自動發送郵件或自定義附檔(通過SQL語句動態生成數據到導出Excel檔案),console application:

(1)Body(信件正文) : 字符串
如:JMail.Body = "這裡可以是用戶填寫的表單內容,可以取自From。"
(2)Charset(字符集,缺省為"US-ASCII") : 字符串
如:JMail.Charset = "US-ASCII"
(3)ContentTransferEncoding : 字符串
指定內容傳送時的編碼方式,缺省是"Quoted-Printable"
如:JMail.ContentTransferEncoding = "base64"
(4)ContentType(信件的contentype. 缺省是"text/plain") : 字符串
如果你以HTML格式發送郵件, 改為"text/html"即可。
如:JMail.ContentType = "text/html"
(5)Encoding : 字符串
設置附件編碼方式(缺省是"base64)。 可以選擇使用的是"base64", "uuencode" or "quoted-printable"
如:JMail.Encoding = "base64"
(6)Log(Jmail創建的日誌,前提loging屬性設置為true,見下面) : 字符串
如:使用Response.Write( JMail.Log )語句列出日誌信息。
(7)Logging(是否使用日誌) : 布爾型
如:JMail.Logging = true
(8)Recipients : 字符串
只讀屬性,返回所有收件人
如:Response.Write( "" + JMail.Recipients + "" );
(9)ReplyTo(指定別的回信地址) : 字符串
如:JMail.ReplyTo = "anyother@mailhost.com"
(10)Sender( 發件人的郵件地址) : 字符串
如:JMail.Sender = "sender@mailhost.com"
(11)SenderName(發件人的姓名) : 字符串
如:JMail.SenderName = "一克"
(12)ServerAddress(郵件服務器的地址) : 字符串
你可以指定多個服務器,用分號點開。可以指定端口號。
如果serverAddress保持空白,JMail會嘗試遠程郵件服務器,然後直接發送到服務器上去。
如:JMail.ServerAddress = "mail.263.net.cn"
(13)Subject(設定郵件的標題,可以取自From。):字符串
如:JMail.Subject = "客戶反饋表單"
(14)添加文件附件到郵件
如:JMail.AddAttachment( "c:\anyfile.zip" )
(15)AddCustomAttachment( FileName, Data )
添加自定義附件.
如:JMail.AddCustomAttachment( "anyfile.txt", "Contents of file" );
(16)AddHeader( Header, Value )
添加用戶定義的信件標頭。
如:JMail.AddHeader( "Originating-IP","192.168.10.10" );
(17)AddRecipient(收件人):字符串
如:JMail.AddRecipient( "info@dimac.net" );
(18)AddRecipientBCC( Email ),密件收件人:
如:JMail.AddRecipientBCC( "anyone@mailhost.com" );
(19)AddRecipientCC( Email ) ,抄送收件人:
如:JMail.AddRecipientCC( "anyone@mailhost.com" )
(20)AddURLAttachment( URL, 文檔名)
下載並添加一個來自url的附件. 第二個參數"文檔名", 用來指定信件收到後的文件名。
如:JMail.AddURLAttachment( "http://www.chinabs.net/jmail.zip", "jmail" )
(21)AppendBodyFromFile( 文件名) ,將文件作為信件正文:
如:JMail.AppendBodyFromFile( "c:\anyfile.txt" )
(22)AppendText( Text )
追加信件的正文內容,比如增加問候語或者其它信息。
如:JMail.AppendText( "歡迎訪問本站!" )
(23)Close() ,強制JMail關閉緩衝的與郵件服務器的連接:
如:JMail.Close()
(24)Execute() ,執行郵件的發送
如:JMail.Execute()

忘記密碼時的程序代碼,現在共享出來讓大家學習:
path=Server.MapPath("\images\logo.gif")
Set JMail=Server.CreateObject("JMail.SMTPMail")
JMail.ContentType="text/html"
JMail.Encoding = "base64"
JMail.Charset="gb2312"
JMail.ServerAddress = "mail.chinabs.net"
JMail.Sender = "chinabs@chinabs.net"
JMail.Subject = "chinabs.net發給您的密碼!"
JMail.AddRecipient(email)
JMail.Body =str
JMail.AddHeader "Originating-IP", Request.ServerVariables("REMOTE_ADDR")
JMail.AddAttachment(path)
JMail.Execute
JMail.Close
Set JMail = Nothing
悔说话的哑巴 2009-04-08
  • 打赏
  • 举报
回复
我也来搞搞
netcup 2009-04-08
  • 打赏
  • 举报
回复
2008和2005一样,都用DATABASE MAIL实现的。比较简单
claro 2009-04-08
  • 打赏
  • 举报
回复
关注在2008下的实现方式。
kye_jufei 2009-04-08
  • 打赏
  • 举报
回复
方法二:也可使用以下存儲過程實現

USE [MES]
GO
/****** Object: StoredProcedure [dbo].[SendMail] Script Date: 04/08/2009 08:08:15 ******/
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO

ALTER Procedure [dbo].[SendMail]
@Sender varChar(50)=null, --發件人地址
@strRecipients varChar(200),--收件人地址,多個人用";"分開
@strSubject varChar(200),--主旨
@strMessage varChar( 2000),--正文
@sql varChar(50)=null --如果有附件,可以在這裡寫SQL語句
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='SqlServer@geniusnet.com.tw'
Set @MailServer='172.20.100.21'
Set @User='jufei'
Set @Pass='jiang12475+'
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

EXEC sp_jmail_send @sender=@SenderAddress,@sendername=@SenderName,
@serveraddress=@MailServer,@MailServerUserName=@User,@MailServerPassword=@Pass,
@recipient=@email,@subject=@strSubject,@mailbody=@strMessage,@attachment=@AttachDir
end
kye_jufei 2009-04-08
  • 打赏
  • 举报
回复
方法一:可使用以下存儲過程實現

USE [MES]
GO
/****** Object: StoredProcedure [dbo].[sp_jmail_send] Script Date: 04/08/2009 08:06:14 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO

--CREATE PROCEDURE [OWNER].[PROCEDURE NAME] AS
ALTER Procedure [dbo].[sp_jmail_send]
@sender varchar(100),--發送人的郵件地址
@sendername varchar(100)='',--發送人
@serveraddress varchar(255)='172.20.100.21',--郵件服務器地址
@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

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', 'base64'

--身份验证
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
  • 打赏
  • 举报
回复
..
ai_li7758521 2009-04-07
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 netcup 的回复:]
引用 7 楼 ai_li7758521 的回复:
http://blog.csdn.net/netcup/archive/2008/10/04/3014977.aspx

收费啊,呵呵
[/Quote]
-狙击手- 2009-04-07
  • 打赏
  • 举报
回复
。。
netcup 2009-04-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ai_li7758521 的回复:]
http://blog.csdn.net/netcup/archive/2008/10/04/3014977.aspx
[/Quote]
收费啊,呵呵
qizhengsheng 2009-04-07
  • 打赏
  • 举报
回复
我也按照步骤做了下
cynthiabx 2009-04-07
  • 打赏
  • 举报
回复
sql 2000用sql mail
sql 2005用sql database mail
databse mail的配置方法可以参考链接
http://tech.it168.com/db/s/2007-05-11/200705110801734.shtml
ai_li7758521 2009-04-07
  • 打赏
  • 举报
回复
http://blog.csdn.net/netcup/archive/2008/10/04/3014977.aspx
ai_li7758521 2009-04-07
  • 打赏
  • 举报
回复
关注
pbsh 2009-04-07
  • 打赏
  • 举报
回复
数据库邮件配置要点:

1、在数据库实例--管理--数据库邮件,右键,添加配置文件和帐户,发送测试邮件,成功。

2、如果要在作业中使用数据库邮件,在sql server agent上右键,属性--警报系统,选中启用邮件配置。

该步骤比较容易遗忘,MS默认不启用。如果不启用,则操作员不会收到邮件通知,在error logs中会看到以下错误:

[264] An attempt was made to send an email when no email session has been established

3、重新启动sql server agent服务,切记。

4、作业属性--通知,选中电子邮件,选择操作员和通知条件。


使用SQL脚本发送邮件示例:

EXEC msdb.dbo.sp_send_dbmail

@profile_name = '数据库邮件配置文件(网易163)',

@recipients = 'xxx@163.com',

@body = 'ssis 用msdb.dbo.sp_send_dbmail测试发邮件',

@subject = '测试发邮件';
you_tube 2009-04-07
  • 打赏
  • 举报
回复
搜下,坛子里有很多
dpzc_love 2009-04-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 liangCK 的回复:]
2005使用Database Mail很简单.
[/Quote]

主要就是配置数据库邮件
加载更多回复(2)

22,224

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧