首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

用存储过程发邮件解决思路

2012-03-29 
用存储过程发邮件各位大侠,不好意思,小弟最近需要在数据库里面用存储过程发邮件,虽然在网上也找到一些例子

用存储过程发邮件
各位大侠,不好意思,小弟最近需要在数据库里面用存储过程发邮件,虽然在网上也找到一些例子,不过看了一会就有点不知所云了,主要就是不知道里面某些代码到底是要做什么的,没有具体的说明,还请大家帮忙,给个简单的例子,然后告知下每个步骤及其代码的意思就可以了。
麻烦了各位。

[解决办法]
不会,曾分
[解决办法]
配置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' ; 

热点排行