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上測試通過)