sqlmail可以收發(fā)郵件,可能好多人都有xp_sendmail發(fā)送過郵件,
這里介紹一種郵件服務(wù)器接收郵件后,根據(jù)郵件內(nèi)容(只能是查詢語句)
把郵件中的查詢語句執(zhí)行后的結(jié)果以附件形式自動返回給發(fā)送郵件者。
eg:
發(fā)送郵件,郵件內(nèi)容為: select top 10 id,name from sysobjects
則服務(wù)器自動回復(fù)郵件,內(nèi)容為上述查詢語句的執(zhí)行結(jié)果,以附件形式發(fā)送。
1:當(dāng)然是先配置好sql郵件服務(wù)了,這方面的資料比較多,此處不贅述。
2: 把sp_processmail稍作修改 (把發(fā)件人的郵件地址解析為真正的郵箱地址)
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
@[email protected]_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
@[email protected]_id,
@[email protected] output,
@[email protected]_list output,
@[email protected] output,
@[email protected] 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 @[email protected]_id
exec @status = master.dbo.xp_findnextmsg
@[email protected]_id output,
@unread_only='true'
if @status <> 0
begin
select @mapifailure=1
end
if ((@subject is null) or (@[email protected]))
begin
/* generate random filename */
select @filename='sql' + convert(varchar,round(rand()*100000,0)) + '.' + @filetype
exec @status = master.dbo.xp_sendmail
-- @[email protected],
@[email protected]_address,
@[email protected]_list,
@[email protected],
@[email protected],
@subject='query results',
@[email protected],
@width=256,
@[email protected],
@attach_results='true',
@no_output='false',
@echo_error='true',
@[email protected]_user,
@[email protected]
if @status <> 0
begin
select @mapifailure=1
break
end
select @[email protected]+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數(shù)據(jù)庫下建一個存儲過程
use master
create proc answermail
as
sp_processmail @subject = 'sql',@filetype = 'csv',@separator =',',@set_user = 'dbo' ,@dbuse = '數(shù)據(jù)庫名'
4:
用job調(diào)度此存儲過程。
5:
現(xiàn)在可以測試了。
發(fā)一封郵件給服務(wù)器上配置的郵箱地址。
主題為 sql
內(nèi)容為 一句簡單的查詢語句 eg: select getdate()
發(fā)送
6: 等到j(luò)ob調(diào)度時間到后即可收到回復(fù)。
(以上在 windows2000 + sql2000+microsoft outlook上測試通過)
,歡迎訪問網(wǎng)頁設(shè)計愛好者web開發(fā)。