當前位置:首頁 > 芯聞號 > 充電吧
[導讀]54powerman(54powerman@163.com)說兩句:在某人最困難的時候,寫下此文,寄給某某報想騙點稿費,結果石沉大海,若干年后,翻騰硬盤翻出來了。呵呵,或許可以對希望在SqlServe

54powerman(54powerman@163.com)

說兩句:在某人最困難的時候,寫下此文,寄給某某報想騙點稿費,結果石沉大海,若干年后,翻騰硬盤翻出來了。呵呵,或許可以對希望在SqlServer中發(fā)送郵件的網友有所幫助。

54powerman^_^


??? Sql Mail技術給每一位數據庫開發(fā)人員和DBA(數據庫管理員)帶來了極大的方便,利用該技術,Sql Server數據庫代理程序可以在系統(tǒng)出現異常的時候自動發(fā)送Email通知管理員,開發(fā)人可以利用它讓數據庫自動定期的修改用戶密碼,然后發(fā)送Email通知用戶……等等這些應用,都不同程度上把我們從繁雜的工作中解放出來。但是,Sql Mail的配置是比較復雜的,相信90%以上的人在配置Sql Mail的時候都遇到過各種各樣的麻煩,至少有70%的人放棄了Sql Mail而選擇其他方案來解決這個問題。筆者是一名Web開發(fā)人員,親身經歷了這一切,并找到了一個更好的替代方法。不敢獨享,寫出來以饗讀者。
Sql Mail配置有幾種方式,按照支持軟件可劃分為基于Exchange、Outlook2000(以上)和第三方軟件的配置方案,三種方式各有利弊,主要表現在以下幾個方面:

??? 使用Outlook客戶端配合Sql Server實現Sql Mail
??? 此方案軟件要求較低,只需要在Sql Server所在服務器上安裝Outlook2000以上版本客戶端即可。它要求在Sql Mail使用期間,OutLook客戶端必須打開,否則,只能到下次打開時,郵件才能發(fā)送出去。另外,如果服務器為遠程服務器,用微軟官方的遠程桌面無法完成配置,可替代的方案是DBA親自去機房直接操作,或者安裝PcAnywhere10替代遠程桌面進行操作。

??? 使用Exchange要求較高
??? Microsoft推薦使用Exchange作為Sql Mail的最佳拍檔,MSDN的資料提出:“由于 POP3/SMTP 協議存在的局限性和登錄問題,Microsoft 建議您使用 Exchange Server 來實現可靠性”。但是Exchange并不是專門做這個來使用的,可以說是屈才了,而且Exchange要求服務器配置域管理器,相信這個東東對大多數數據庫服務器來說用處不大,只不過是浪費資源罷了。如果我們要在多臺服務器上配置Sql Mail那么就需要在每一臺服務器上配置域管理器,或者所有的服務器都配置到一個域內,但是對于服務器比較分散的系統(tǒng)來說這樣是不現實的。

??? 使用第三方系統(tǒng)支持
??? 微軟MSDN稱:“如果您使用的是第三方郵件服務器,則必須將郵件服務器配置為 POP3 服務器。如果這些郵件服務器使用的本地郵件服務可能是由第三方郵件客戶端安裝的,Microsoft 將不支持連接到這些服務器”。這就意味著你還要使用Windows平臺的郵件服務,使用ASP編寫網站的朋友一定都知道,Cdonts.dll組件實在是……。
面對這些問題,筆者就變成了我剛才說的那70%了,雖然爬網無數,讀文字數萬把Sql Mail配置好了,但是我仍然絕對放棄,因為我不想在做第2臺、第3臺……的時候重蹈覆轍。替代的方案就是Jmail組件+OLE自動化對象,以上的問題迎刃而解。

??? 預備知識
??? 1.OLE自動化函數
??? OLE自動化使應用程序能夠對另一個應用程序中實現的對象進行操作,或者將對象公開以便可以對其進行操作。自動化客戶端是可對屬于另一個應用程序的公開對象進行操作的應用程序,本文值得是Sql Server。公開對象的應用程序稱為自動化服務器,又成為自動化組件,本文中即Jmail組件咯??蛻舳送ㄟ^訪問應用程序對象的屬性和函數對這些對象進行操作。
??? 在Sql Server使用Ole組件的途徑是幾個系統(tǒng)擴展存儲過程sp_OACreate、sp_OADestroy、sp_OAGetErrorInfo、sp_OAMethod、sp_OASetProperty和sp_OAGetProperty,再次簡單地介紹一下使用方法,詳細資料參考Sql Server聯機叢書。
??? OLE自動化對象的使用方法:
??? (1)調用 sp_OACreate 創(chuàng)建對象。
??? 格式:sp_OACreate clsid,objecttoken OUTPUT [ , context ]
??? 參數:clsid——是要創(chuàng)建的 OLE 對象的程序標識符 (ProgID)。此字符串描述該 OLE 對象的類,其形式,如 'OLEComponent.Object',OLEComponent 是 OLE 自動化服務器的組件名稱,Object 是 OLE 對象名,本文中使用的“JMail.Message”;
Objecttoken——是返回的對象標志,并且必須是數據類型為 int 的局部變量。用于標識所創(chuàng)建的 OLE 對象,并將在調用其它 OLE 自動化存儲過程時使用。本文中就是通過它來調用JMail.Message組件的屬性和方法的。
??? Context——指定新創(chuàng)建的 OLE 對象要在其中運行的執(zhí)行上下文。本文不使用該參數,故不贅述。以下與此一致,所有方法屬性的其他用法請參閱Sql Server聯機文檔。
??? (2)使用該對象。
??? (a)調用 sp_OAGetProperty 獲取屬性值。
??? 格式:_OAGetProperty objecttoken,propertyname [, propertyvalue OUTPUT]
??? 參數:(前面出現過的參數,以下均省略。)
??? Propertyname——對象的屬性名稱;
??? Propertyvalue——返回的對象的屬性值,該參數帶OUTPUT屬性,執(zhí)行該操作后,你就可以從propertyvalue中得到屬性的值了。
??? (b)調用 sp_OASetProperty 將屬性設為新值。
??? 格式:sp_OASetProperty objecttoken, propertyname, propertyvalue
??? (c)調用 sp_OAMethod 以調用某個方法。
??? 格式:sp_OAMethod objecttoken, methodname [, returnvalue OUTPUT] [ , [ parametername = ] parametervalue? [...n]]
??? 參數:Returnvalue——調用方法的返回值,如果沒有返回值,此參數設置為NULL;
??? Parametername——方法定義中的參數名稱,也就是形參;
??? Parametervalue——參數值;
??? ……n——表示,可以帶很多參數,個數由方法定義限制;
??? (d)調用 sp_OAGetErrorInfo 獲取最新的錯誤信息。
??? 格式:sp_OAGetErrorInfo [objecttoken ] [, source OUTPUT] [, description OUTPUT]
??? 參數:Source——錯誤源;
??? Description——錯誤描述;
??? (3)調用 sp_OADestroy 釋放對象。
??? 格式:sp_OADestroy objecttoken

??? 2.xp_cmdshell擴展存儲過程
??? 該擴展存儲過程在master數據庫中,它的全路徑是master..xp_cmdshell(注意,中間是2個點),它的功能是:以操作系統(tǒng)命令行解釋器的方式執(zhí)行給定的命令字符串,并以文本行方式返回任何輸出。
??? 格式:xp_cmdshell {'command_string'} [, no_output]
??? 參數:'command_string'——是在操作系統(tǒng)命令行解釋器上執(zhí)行的命令字符串。
??? no_output——是可選參數,表示執(zhí)行給定的 command_string,但不向客戶端返回任何輸出。本文應用中不使用該參數。

??? 操作方法
??? (1)軟件準備
??? 請先到http://www.dimac.net/或者國內提供組件下載的網站下載最新版的JMail組件,如果你得到的是安裝版,執(zhí)行weJMailx.exe即可,系統(tǒng)的配置安裝程序會自動完成。如果只有一個JMail.dll文件,請按照下面的步驟安裝:
??? (a)新建文本文件,輸入如下命令:
??? regsvr32 JMail.dll
??? net start w3svc
??? 另存為Install.Bat(注意,千萬不要保存成Install.Bat.Txt?。?br />??? (b)此文件連同Jmail.dll一起拷貝到Sql Server數據庫服務器的System32目錄下,并執(zhí)行雙擊Install.Bat即可。
??? (2)準備好了嗎?跟我來吧
??? (a)運行Sql Server查詢分析器,并以sa身份登錄到Sql Server數據庫;
??? (b)如果你的存儲過程要添加到YourDefaultCatalog數據庫,請在空白Sql窗口輸入如下指令,否則請相應修改數據庫名。
??? Use YourDefaultCatalog
??? 按F5或者運行按鈕運行該指令;
??? (c)創(chuàng)建基本發(fā)送存儲過程
??? 復制如下代碼到Sql Server命令窗口,并運行。下面的代碼中有相應的注釋,文中不多做解釋,如有疑問請查看前面的“預備知識”或者查詢Sql Server幫助文件,當然也可以和作者聯系。

Create Procedure dbo.sp_jmail_send
@sender varchar(100),
@sendername varchar(100)='',
@serveraddress varchar(255)='SMTP服務器地址',
@MailServerUserName varchar(255)=null,
@MailServerPassword varchar(255)=null,
@recipient varchar(255),
@recipientBCC varchar(200)=null,
@recipientBCCName varchar(200)=null,
@recipientCC varchar(200)=null,
@recipientCCName varchar(100)=null,
@attachment varchar(100) =null,
@subject varchar(255),
@mailbody text
As
/*
該存儲過程使用辦公自動化腳本調用Dimac w3 JMail AxtiveX組件來代替Sql Mail發(fā)送郵件
該方法支持“服務器端身份驗證”
*/
--聲明w3 JMail使用的常規(guī)變量及錯誤信息變量
Declare @object int,@hr int,@rc int,@output varchar(400),@description varchar (400),@source varchar(400)

--創(chuàng)建JMail.Message對象

Exec @hr = sp_OACreate 'jmail.message', @object OUTPUT

--設置郵件編碼
Exec @hr = sp_OASetProperty @object, 'Charset', 'gb2312'

--身份驗證
If Not @MailServerUserName is null
Exec @hr = sp_OASetProperty @object, 'MailServerUserName',@MailServerUserName
If Not @MailServerPassword is null
Exec @hr = sp_OASetProperty @object, 'MailServerPassword',@MailServerPassword

--設置郵件基本參數
Exec @hr = sp_OASetProperty @object, 'From', @sender
Exec @hr = sp_OAMethod @object, 'AddRecipient', NULL , @recipient
Exec @hr = sp_OASetProperty @object, 'Subject', @subject
Exec @hr = sp_OASetProperty @object, 'Body', @mailbody

--設置其它參數
if not @attachment is null
exec @hr = sp_OAMethod @object, 'Addattachment', NULL , @attachment,'false'
print @attachment
If (Not @recipientBCC is null) And (Not @recipientBCCName is null)
Exec @hr = sp_OAMethod @object, 'AddRecipientBCC', NULL , @recipientBCC,@recipientBCCName
Else If Not @recipientBCC is null
Exec @hr = sp_OAMethod @object, 'AddRecipientBCC', NULL , @recipientBCC

If (Not @recipientCC is null) And (Not @recipientCCName is null)
Exec @hr = sp_OAMethod @object, 'AddRecipientCC', NULL , @recipientCC,@recipientCCName
Else If Not @recipientCC is null
Exec @hr = sp_OAMethod @object, 'AddRecipientCC', NULL , @recipientCC

If Not @sendername is null
Exec @hr = sp_OASetProperty @object, 'FromName', @sendername

--調用Send方法發(fā)送郵件
Exec @hr = sp_OAMethod @object, 'Send', null,@serveraddress

--捕獲JMail.Message異常
Exec @hr = sp_OAGetErrorInfo @object, @source OUTPUT, @description OUTPUT

if (@hr = 0)
Begin
Set @output='錯誤源: '+@source
Print @output
Select @output = '錯誤描述: ' + @description
Print @output
End
Else
Begin
Print '獲取錯誤信息失敗!'
Return
End

--釋放JMail.Message對象
Exec @hr = sp_OADestroy @object

??? (d)簡化存儲過程操作,以適合我們平時的使用習慣
??? 上面的存儲過程基本可以完成郵件發(fā)送操作,但是非常冗長,而且不符合我們的習慣,比如它不支持多個發(fā)送給接收者、不支持將Sql指令運行結果以附件形式發(fā)送(這是Sql Mail的功能,我們也可以做到)等,所以我們要再寫一個存儲過程來調用它,以簡化操作,并擴展功能。

Create Procedure SendMail
@Sender varChar(50)=null,
@strRecipients varChar(200),
@strSubject varChar(200),
@strMessage varChar(2000),
@sql varChar(50)=null)
As

Declare @SplitStr varchar(1)?--定義郵件地址分割符變量
Declare @strTemp varchar(200)?--定義多個收件人字符串臨時變量
Declare @email varchar(50)?--用分割符分割后的單個收件人字符串變量

Declare @SenderAddress varChar(50)
Declare @Attach varChar(200)

Declare @DefaultSender varChar(50)
Declare @MailServer varChar(50)
Declare @User varChar(50)
Declare @Pass varChar(50)
Declare @SenderName varChar(50)
Declare @AttachDir varChar(100)

--初始化缺省變量
Set @DefaultSender='缺省發(fā)送地址'
Set @MailServer='郵件服務器地址'
Set @User='SMTP服務器驗證用戶地址'
Set @Pass='SMTP服務器驗證地址'
Set @SenderName='缺省發(fā)件人名稱'
Set @AttachDir='E:/LOG/WebData/Jmail/'+Replace(Replace(Replace(Convert(varChar(19),GetDate(),120),'-',''),' ',''),':','')+'.txt'

--將Email地址分割符統(tǒng)一為分號
set @SplitStr=';'
Set @strTemp=@strRecipients+@SplitStr+'end'
Set @strTemp=Replace(@strTemp,',',';')

--判斷是否有sql語句
If (@Sql is Null) Or (len(@Sql)=0)
Set @AttachDir=Null
Else
Begin
Declare @CmdStr varChar(200)
Set @CmdStr='bcp "'+@Sql+'" queryout '+@AttachDir+' -c'
EXEC master..xp_cmdshell @CmdStr
End

while CharIndex(@SplitStr,@strTemp,1)<>0
Begin
Set @email=left(@strTemp,CharIndex(@SplitStr,@strTemp,1)-1)
Set @strTemp=right(@strTemp,len(@strTemp)-len(@email)-1)
If (@Sender Is Null) Or (Len(@Sender)=0)
Set @SenderAddress=@DefaultSender
Else
Set @SenderAddress=@Sender
Print @email
--調用sp_jmail_send發(fā)送郵件
EXEC sp_jmail_send @sender=@SenderAddress,@sendername=@SenderName,
@serveraddress=@MailServer,@MailServerUserName=@User,@MailServerPassword=@Pass,
@recipient=@email,@subject=@strSubject,@mailbody=@strMessage,@attachment=@AttachDir
End
??? 此存儲過程只擴展了Sql查詢結果附件發(fā)送,如果你要發(fā)送標準附件,請直接使用sp_jmail_send存儲過程或者自行擴展功能。

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯系該專欄作者,如若文章內容侵犯您的權益,請及時聯系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或將催生出更大的獨角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數字化轉型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術公司SODA.Auto推出其旗艦產品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關鍵字: 汽車 人工智能 智能驅動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據媒體報道,騰訊和網易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數據產業(yè)博覽會開幕式在貴陽舉行,華為董事、質量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數據產業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數字世界的話語權最終是由生態(tài)的繁榮決定的。

關鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經營業(yè)績穩(wěn)中有升 落實提質增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質量發(fā)展策略,塑強核心競爭優(yōu)勢...

關鍵字: 通信 BSP 電信運營商 數字經濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術學會聯合牽頭組建的NVI技術創(chuàng)新聯盟在BIRTV2024超高清全產業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現場 NVI技術創(chuàng)新聯...

關鍵字: VI 傳輸協議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯合招商會上,軟通動力信息技術(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關鍵字: BSP 信息技術
關閉
關閉