用存储过程发邮件
各位大侠,不好意思,小弟最近需要在数据库里面用存储过程发邮件,虽然在网上也找到一些例子,不过看了一会就有点不知所云了,主要就是不知道里面某些代码到底是要做什么的,没有具体的说明,还请大家帮忙,给个简单的例子,然后告知下每个步骤及其代码的意思就可以了。
麻烦了各位。
[解决办法]
不会,曾分
[解决办法]
配置SQL mail ?
[解决办法]
- SQL code
正确配置和使用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: "谢谢你的注册,建议你首次登录后修改密码"
[解决办法]
学习了,存储过程还可以发邮件..
[解决办法]
- SQL code
SQL Server 并没有内置邮件服务器(Mail Server),它跟我们发送邮件一样,需要用户名和密码通过 SMTP(Simple Message Transfer Protocol)去连接邮件服务器。我们想让 SQL Server 来发送邮件,首先要告诉它用户名称,密码,服务器地址,网络传送协议,邮件服务器的端口。。。等信息。
以下脚本实现了数据库邮件的配置:
--下面是具体的配置邮件步骤
--在 sa 系统帐户下运行。
--
--1. 启用 SQL Server 2005 邮件功能。
use master
go
exec sp_configure 'show advanced options',1
go
reconfigure
go
exec sp_configure 'Database mail XPs',1
go
reconfigure
go
--2. 在 SQL Server 2005 中添加邮件帐户(account)
exec msdb..sysmail_add_account_sp
@account_name = 'jgj' -- 邮件帐户名称(SQL Server 使用)
,@email_address = [email='jiaguijun@trusee.com']'jiaguijun@trusee.com'[/email] -- 发件人邮件地址
,@display_name = null -- 发件人姓名
,@replyto_address = null
,@description = null
,@mailserver_name = '203.86.70.229' -- 邮件服务器地址
,@mailserver_type = 'SMTP' -- 邮件协议(SQL 2005 只支持 SMTP)
,@port = 25 -- 邮件服务器端口
,@username = [email='jiaguijun@trusee.com']'jiaguijun@trusee.com'[/email] -- 用户名
,@password = 'xxxxxx' -- 密码
,@use_default_credentials = 0
,@enable_ssl = 0
,@account_id = null
--3. 在 SQL Server 2005 中添加 profile
exec msdb..sysmail_add_profile_sp @profile_name = 'dba_profile' -- profile 名称
,@description = 'dba mail profile' -- profile 描述
,@profile_id = null
-- 在 SQL Server 2005 中映射 account 和 profile
exec msdb..sysmail_add_profileaccount_sp @profile_name = 'dba_profile' -- profile 名称
,@account_name = 'jgj' -- account 名称
,@sequence_number = 1 -- account 在 profile 中顺序
--5. 利用 SQL Server 2005 Database Mail 功能发送邮件。
exec msdb..sp_send_dbmail @profile_name = 'dba_profile' -- profile 名称
,@recipients = [email='jiaguijun@trusee.com']'jiaguijun@trusee.com'[/email] -- 收件人邮箱
,@subject = 'SQL Server 2005 Mail 测试' -- 邮件标题
,@body = 'Hello Mail!测试' -- 邮件内容
,@body_format = 'TEXT' -- 邮件格式
--6. 查看邮件发送情况:
use msdb
go
select * from sysmail_allitems
select * from sysmail_mailitems
select * from sysmail_event_log
--如果不是以 sa 帐户发送邮件,则可能会出现错误:
--
--Msg 229, Level 14, State 5, Procedure sp_send_dbmail, Line 1
--EXECUTE permission denied on object 'sp_send_dbmail', database 'msdb', schema 'dbo'.
--
--这是因为,当前 SQL Server 登陆帐户(login),在 msdb 数据库中没有发送数据库邮件的权限,需要加入 msdb 数据库用户,并通过加入 sp_addrolemember 角色赋予权限。假设该SQL Server 登陆帐户名字为 “dba”
--
--use msdb
--go
--
--create user dba for login dba
--go
--
--exec dbo.sp_addrolemember @rolename = 'DatabaseMailUserRole',
-- @membername = 'dba'
--go
--
--此时,再次发送数据库邮件,仍可能有错误:
--
--Msg 14607, Level 16, State 1, Procedure sp_send_dbmail, Line 119
--profile name is not valid
--
--虽然,数据库用户 “dba” 已经在 msdb 中拥有发送邮件的权限了,但这还不够,他还需要有使用 profile:“dba_profile” 的权限。
--
--use msdb
--go
--
--exec sysmail_add_principalprofile_sp @principal_name = 'dba'
-- ,@profile_name = 'dba_profile'
-- ,@is_default = 1
--
--从上面的参数 @is_default=1 可以看出,一个数据库用户可以在多个 mail profile 拥有发送权限。
[解决办法]
学习了 太强大的色口
[解决办法]
路过,学习...
[解决办法]
这样也行 学习下
[解决办法]
这样也行 学习下
[解决办法]
- SQL code
---try
、启动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']
[解决办法]
帮顶一下
[解决办法]
学习学习啊 为什么不用前台程序弄呢?
[解决办法]
2005以后用database mail 比sql mail好。不需要安装OUTLOOK
[解决办法]
看看帮助文档上的
- SQL code
发送 HTML 电子邮件此示例使用电子邮件地址 danw@Adventure-Works.com 向 Dan Wilson 发送电子邮件。邮件的主题为 Work Order List,并包含一个 HTML 文档,其中列出 DueDate 在 2004 年 4 月 30 日后的二日内的工单。数据库邮件使用 HTML 格式发送该邮件。 复制代码 DECLARE @tableHTML NVARCHAR(MAX) ;SET @tableHTML = N'<H1>Work Order Report</H1>' + N'<table border="1">' + N'<tr><th>Work Order ID</th><th>Product ID</th>' + N'<th>Name</th><th>Order Qty</th><th>Due Date</th>' + N'<th>Expected Revenue</th></tr>' + CAST ( ( SELECT td = wo.WorkOrderID, '', td = p.ProductID, '', td = p.Name, '', td = wo.OrderQty, '', td = wo.DueDate, '', td = (p.ListPrice - p.StandardCost) * wo.OrderQty FROM AdventureWorks.Production.WorkOrder as wo JOIN AdventureWorks.Production.Product AS p ON wo.ProductID = p.ProductID WHERE DueDate > '2004-04-30' AND DATEDIFF(dd, '2004-04-30', DueDate) < 2 ORDER BY DueDate ASC, (p.ListPrice - p.StandardCost) * wo.OrderQty DESC FOR XML PATH('tr'), TYPE ) AS NVARCHAR(MAX) ) + N'</table>' ;EXEC msdb.dbo.sp_send_dbmail @recipients='danw@Adventure-Works.com', @subject = 'Work Order List', @body = @tableHTML, @body_format = 'HTML' ;