数据库

本类阅读TOP10

·SQL语句导入导出大全
·SQL Server日期计算
·SQL语句导入导出大全
·SQL to Excel 的应用
·Oracle中password file的作用及说明
·MS SQLServer OLEDB分布式事务无法启动的一般解决方案
·sqlserver2000数据库置疑的解决方法
·一个比较实用的大数据量分页存储过程
·如何在正运行 SQL Server 7.0 的服务器之间传输登录和密码
·SQL中两台服务器间使用连接服务器

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
SQL邮件自动应答(根据收到的邮件中的查询语句回复语句执行结果)

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

SQLMail可以收发邮件,可能好多人都有xp_sendmail发送过邮件,
这里介绍一种邮件服务器接收邮件后,根据邮件内容(只能是查询语句)
把邮件中的查询语句执行后的结果以附件形式自动返回给发送邮件者。

eg:
发送邮件,邮件内容为: select top 10 id,name from sysobjects
则服务器自动回复邮件,内容为上述查询语句的执行结果,以附件形式发送。


1:当然是先配置好SQL邮件服务了,这方面的资料比较多,此处不赘述。

2: 把sp_processmail稍作修改 (把发件人的邮件地址解析为真正的邮箱地址)

Alter procedure sp_processmail
 @subject varchar(255)=NULL, 
 @filetype varchar(3)='txt', 
 @separator varchar(3)='tab', 
 @set_user varchar(132)='guest', 
 @dbuse varchar(132)='master' 
as 
 
declare @status int 
declare @msg_id varchar(64) 
declare @originator varchar(255) 
declare @originator_address varchar(255) 
declare @a varchar(255)

declare @cc_list varchar(255) 
declare @msgsubject varchar(255) 
declare @query varchar(8000) 
declare @messages int 
declare @mapifailure int 
declare @resultmsg varchar(80) 
declare @filename varchar(12) 
declare @current_msg varchar(64) 
 
select @messages=0 
select @mapifailure=0 
 
if @separator='tab' select @separator=CHAR(9) 
 
/* get first message id */ 
exec @status = master.dbo.xp_findnextmsg 
  @msg_id=@msg_id output, 
  @unread_only='true' 
 
if @status <> 0 
 select @mapifailure=1 
 
while (@mapifailure=0) 
  begin 
 
    if @msg_id is null break 
    if @msg_id = '' break 
 
    exec @status = master.dbo.xp_readmail 
  @msg_id=@msg_id, 
  @originator=@originator output, 
  @cc_list=@cc_list output, 
  @subject=@msgsubject output, 
  @message=@query output, 
  @peek='true', 
  @originator_address= @originator_address output,
  @suppress_attach='true' 
 
    if @status <> 0 
 begin 
  select @mapifailure=1 
  break 
 end 
 
    /* get new message id before processing & deleting current */ 
 select @current_msg=@msg_id 
 exec @status = master.dbo.xp_findnextmsg 
  @msg_id=@msg_id output, 
  @unread_only='true' 
 
     if @status <> 0 
 begin 
  select @mapifailure=1 
 end 
 
 
    if ((@subject IS NULL) OR (@subject=@msgsubject)) 
    begin 
 /* generate random filename */ 
 select @filename='SQL' + convert(varchar,ROUND(RAND()*100000,0)) + '.' + @filetype 
 
 exec @status = master.dbo.xp_sendmail 
--   @recipients=@originator, 
   @recipients=@originator_address, 
   @copy_recipients=@cc_list, 
   @message=@query, 
   @query=@query, 
   @subject='Query Results', 
   @separator=@separator, 
   @width=256, 
   @attachments=@filename, 
   @attach_results='true', 
   @no_output='false', 
   @echo_error='true', 
   @set_user=@set_user, 
   @dbuse=@dbuse 
 
 if @status <> 0 
  begin 
   select @mapifailure=1 
   break 
  end 
 
 select @messages=@messages+1 
 
 exec master.dbo.xp_deletemail @current_msg 
 
    end /* end of xp_sendmail block */ 
  end  /* end of xp_findnextmsg loop */ 
 
  /* finished examining the contents of inbox;  now send results */ 
  if @mapifailure=1 
       begin 
  raiserror(15079,-1,-1,@messages) 
  return(1) 
 end 
  else 
 return(0) 
-- sp_processmail 

3:在master数据库下建一个存储过程
use master
create proc answerMail
as
sp_processmail  @subject = 'sql',@filetype = 'CSV',@separator =',',@set_user = 'dbo' ,@dbuse =  '数据库名'


4:
用job调度此存储过程。

5:
现在可以测试了。
发一封邮件给服务器上配置的邮箱地址。
主题为  sql
内容为 一句简单的查询语句 eg:  select getdate()
发送

6: 等到job调度时间到后即可收到回复。

 

(以上在 windows2000 + SQL2000+Microsoft Outlook上测试通过)

 




相关文章

相关软件