利用SQL Server 2005資料庫郵件傳送電子郵件

iSQlServer發表於2009-02-17

隨著技術的不斷進步,我們需要知道在你的資訊系統發生了什麼,為了滿足這種日益增長的需求要求有更高階的方法。

能夠迅速和簡單地瞭解形勢,尤其是瞭解潛在的問題,這對於我們非常重要。微軟不斷的生產新產品來傳遞這種能力,在SQL Server 2005中可獲得的一些資料庫特別選項有:查詢通知、通知服務、服務代理和資料庫郵件。

資料庫郵件——SQL Server 2005中的一個新型電子郵件傳送平臺。在這篇文章的結尾,為了確保我們的資料庫郵件設定正常工作,我傳送了一封試驗郵件。在本文中,我將基於該郵件來探討在SQL Server 2005中傳送資料庫郵件的一些高階功能。

資料庫郵件選項

SQL Server 2005資料庫郵件為傳送電子郵件資訊提供了多種選項。這些選項包括:傳送附件,設定敏感度和重要性,還包括查詢結果,用HTML格式傳送電子郵件資訊。

要在SQL Server 2005中傳送電子郵件,你需要列表A中的指令碼來建立一個包含一些資料的表格,以便稍後能夠使用查詢結果選項。指令碼建立一個表格並載入一些試驗資料。

傳送附件

通過電子郵件傳送檔案附件的能力對工作效率來說是十分重要的。下面的指令碼將會傳送一封電子郵件,其中包含檔名為FileAttachment.txt的附件,給附件儲存於我的C盤驅動器上。

你需要確保檔案的存在,這樣傳送過程就不會發生錯誤。

EXEC msdb.dbo.sp_send_dbmail
@recipients=N'chapman.tim@gmail.com',
@body='Message Body',
@subject ='Message Subject',
@profile_name ='Database-mailProfile',
@file_attachments ='C:FileAttachment.txt';

敏感度和重要性

通常需要將一封郵件標記為敏感或重要,以使得收件人知道這些資訊需要小心保護。下面的指令碼將會傳送一封郵件,敏感度為私人,重要性為高階。此外,指令碼將會複製郵件地址yourname@yourdomain.com到信件中。

EXEC msdb.dbo.sp_send_dbmail
@recipients=N'chapman.tim@gmail.com',
@body='Message Body',
@sensitivity ='Personal',
@importance ='High',
@copy_recipients ='chapman.tim@gmail.com',
@subject ='Message Subject',
@profile_name ='Database-mailProfile';

查詢結果

擁有電子郵件傳送能力的資料庫引擎的一個重要特徵是它可以讓你向傳送過程傳遞一個查詢。在SQL Mail和Database Mail中都有該特性。Database Mail中的一個新特性是可以將查詢結果作為附件,這一點在下面的指令碼中展示。如果你不將查詢結果作為一檔案,那麼它將被放置在郵件正文中。見列表B。

HTML格式的信件

在資料庫郵件中我最喜愛的新特徵是可以將你的郵件格式化為HTML格式。簡單看來,這沒什麼大不了的,但是這確實帶來一些很好的可能性。在前面的例子中,你傳送的查詢結果包含在郵件正文中,因為該例子只包含一列資料,所以看起來沒有什麼不方便的。

但是,當在查詢結果集中包含多個域時,格式化變得每況愈下。一個好訊息是,可以很簡單的使用SQL Server 2005中的一些XML和HTML新特徵來格式化你的查詢結果集,因此,可以很容易的在信件中檢視查詢結果。列表C中的指令碼演示瞭如何利用查詢結果傳送一封XML/HTML格式的電子郵件。

當你傳送HTML格式的郵件時,允許你將查詢結果嵌入到郵件的查詢部分,從而可以將查詢結果格式化成為更容易看的形式。(雖然,你可能會爭論說我在信件中使用的黃色背景,看起來並不是很舒服。)

可能性

當你能夠從資料庫引擎傳送電子郵件時,這就引起了很多可能性。加上一些額外的邏輯和構建,你就可以編寫一個國產郵件系統,這樣就可以確保你總能找到想要找的人。在我的關於資料庫郵件系列三中,我將介紹如何書寫這樣一個應用。

Tim chapman是在位於路易斯維爾一家銀行工作的SQL Server資料庫管理員,有7年多的IT經驗,同時,他還獲得了微軟SQL Server 2000 和SQL Server 2005認證。

IF EXISTS(SELECT name from master..sysdatabases where name = 'SalesDB')
      DROP DATABASE SalesDB

CREATE DATABASE SalesDB;

USE SALESDB;
CREATE TABLE SalesHistory
(
      SaleID INT IDENTITY(1,1),
      Product VARCHAR(30),
      SaleDate SMALLDATETIME,
      SalePrice MONEY
)

DECLARE @i SMALLINT

SET @i = 1

WHILE (@i <=100)

BEGIN
      INSERT INTO SalesHistory
      (Product, SaleDate, SalePrice)
      VALUES
      ('Computer', DATEADD(mm, @i, '3/11/1919'), DATEPART(ms, GETDATE()) + (@i + 57) )


      INSERT INTO SalesHistory
      (Product, SaleDate, SalePrice)
      VALUES
      ('BigScreen', DATEADD(mm, @i, '3/11/1927'), DATEPART(ms, GETDATE()) + (@i + 13) )


      INSERT INTO SalesHistory
      (Product, SaleDate, SalePrice)
      VALUES
      ('PoolTable', DATEADD(mm, @i, '3/11/1908'), DATEPART(ms, GETDATE()) + (@i + 29) )


      SET @i = @i + 1

END
EXEC msdb.dbo.sp_send_dbmail
@recipients=N'chapman.tim@gmail.com',
@body='Message Body',
@subject ='Message Subject',
@profile_name ='DatabaseMailProfile',
@query ='SELECT Product FROM sb2..SalesHistory GROUP BY Product HAVING COUNT(*) > 3',
@attach_query_result_as_file = 1,
@query_attachment_filename ='Results.txt'
 
DECLARE @xml NVARCHAR(MAX)
DECLARE @body NVARCHAR(MAX)

SET @xml =CAST(( SELECT Product AS 'td','',SUM(SalePrice) AS 'td'
FROM SalesHistory GROUP BY Product FOR XML PATH('tr'), ELEMENTS ) AS NVARCHAR(MAX))

SET @body ='

Sales Reports

'
SET @body = @body + @xml +'
ProductSaleAmount
'

EXEC msdb.dbo.sp_send_dbmail
@recipients =N'chapman.tim@gmail.com',
@body = @body,
@body_format ='HTML',
@subject ='Message Subject',
@profile_name ='DatabaseMailProfile'
 
 
下面是另一網站內容
 

資料庫郵件(Database Mail)是SQL Server 2005資料庫引擎中新增的一項簡單實用的功能。Database Mail代替了SQL Mail,它使用一個簡單郵件傳輸協議(SMTP)伺服器,而不是SQL Mail所要求的MAPI賬號來傳送電子郵件。

這允許你的組織傳送帶附件和查詢結果的電子郵件,附加查詢結果,以及格式化HTML電子郵件。你還可以用它設定許多其它配置,而不需要你擁有一臺Exchange伺服器或配置任何型別的MAPI工作區。

使用Database Mail的好處

除完全以SMTP為基礎外,Database Mail還具有許多其它優點:

它在資料庫引擎以外執行,因此對資料庫引擎的壓力最小。

它支援群集,完全支援群集環境。

它的使用者資料(Profile)允許使用冗餘SMTP伺服器。(我將在本文後部分詳細討論這一點。)

它允許你以引數的形式向儲存過程傳送查詢文字,儲存過程將執行查詢並在電子郵件中傳送結果。

訊息通過一個Service Broker佇列非同步傳送,因此你在傳送電子郵件時不必等待回應。

它為電子郵件傳送提供多重安全保護,如一個控制附件副檔名的過濾器和一個附件大小管理器。

建立和使用Database Mail

在建立一個Database Mail解決方案前,你需要進行一些規劃工作。首先,你必須具有一臺有效的SMTP伺服器來傳送電子郵件。如果你沒有SMTP伺服器,請參閱微軟知識庫文章308161瞭解建立SMTP伺服器的相關資訊。如果你無法確定組織是否擁有SMTP伺服器,詢問你的網路管理員獲得機器名稱或伺服器的IP地址。你的網路管理員可能需要對伺服器進行配置,以便SQL Server能夠傳送電子郵件。

在Database Mail中,賬戶(Account)儲存資料庫引擎用來傳送電子郵件訊息的資訊。一個賬戶只為一臺電子郵件伺服器儲存資訊,如賬戶名、電子郵件地址、回覆電子郵件地址、伺服器名稱或IP地址,以及一些可選的安全設定。

要傳送一封Database Mail電子郵件,必須使用一個使用者資料(Profile)。使用者資料為一個或幾個賬戶設立。這種使用者資料-賬戶設定非常有用。它允許你將幾個賬戶和一個使用者資料聯絡起來,這意味著你可以將幾臺電子郵件伺服器和一個使用者資料聯絡起來。

因此,當你試圖傳送一封電子郵件時,系統會嘗試使用者資料中的每個賬戶,直到訊息被成功傳送出去。如果一臺或幾臺SMTP伺服器出現故障,這種設定就十分有用。它還允許你開發傳送電子郵件的應用程式程式碼,而不必擔心針對不同的環境修改Profile名稱。你可以在開發和生產環境中使用相同的Profile名稱,唯一的差別在於使用者資料中包含的賬戶有所不同。

該是時候瞭解如何建立一個Database Mail賬戶了。在我們的例子中,我假設你正坐在一臺你具有系統管理員訪問許可權的開發機器前。如果你沒有系統管理員許可權,你需要成為msdb資料庫DatabaseMailUserRole的一員。

下面的指令碼建立一些我在整個例項中都要用到的變數。注意:整個指令碼將在msdb資料庫中執行,Database Mail物件就儲存在其中。

USE msdbGODECLARE @ProfileName VARCHAR(255)DECLARE @AccountName VARCHAR(255)DECLARE @SMTPAddress VARCHAR(255)DECLARE @EmailAddressVARCHAR(128)DECLARE @DisplayUser VARCHAR(128)

這裡我建立了ProfileName、AccountName、STMP伺服器名稱以及顯示在電子郵件From(郵件來自)框中的地址。

SET @ProfileName = 'DBMailProfile';SET @AccountName = 'DBMailAccount';SET @SMTPAddress = 'mail.yoursmtpserver.com';SET @EmailAddress = 'DBMail@yoursmtpserver.com';SET @DisplayUser = 'The Mail Man';

下面的的指令碼完成一些清理工作,以便如果我再次執行指令碼,就不必擔心出現錯誤。

IF EXISTS(SELECT * FROM msdb.dbo.sysmail_profileaccount pa      JOIN msdb.dbo.sysmail_profile p ON pa.profile_id = p.profile_id      JOIN msdb.dbo.sysmail_account a ON pa.account_id = a.account_idWHERE      p.name = @ProfileName AND      a.name = @AccountName)BEGIN      PRINT 'Deleting Profile Account'      EXECUTE sysmail_delete_profileaccount_sp      @profile_name = @ProfileName,      @account_name = @AccountNameENDIF EXISTS(SELECT * FROM msdb.dbo.sysmail_profile p WHERE p.name = @ProfileName)BEGIN      PRINT 'Deleting Profile.'      EXECUTE sysmail_delete_profile_sp      @profile_name = @ProfileNameENDIF EXISTS(SELECT * FROM msdb.dbo.sysmail_account aWHERE a.name = @AccountName)BEGIN      PRINT 'Deleting Account.'     EXECUTE sysmail_delete_account_sp      @account_name = @AccountNameEND

下面的指令碼給系統增加賬戶(Account)、使用者資料(Profile)和賬戶-使用者資料(Account-Profile)關係。

EXECUTE msdb.dbo.sysmail_add_account_sp@account_name = @AccountName,@email_address = @EmailAddress,@display_name = @DisplayUser,@mailserver_name = @SMTPAddressEXECUTE msdb.dbo.sysmail_add_profile_sp@profile_name = @ProfileName EXECUTE msdb.dbo.sysmail_add_profileaccount_sp@profile_name = @ProfileName,@account_name = @AccountName,@sequence_number = 1 ;

現在一切都已經準備妥當,我將傳送一封測試電子郵件。

EXEC msdb.dbo.sp_send_dbmail@recipients=N'chapman.tim@gmail.com',@body= 'Test Email Body', @subject = 'Test Email Subject',@profile_name = @ProfileName

要檢查訊息是否傳送成功,我可以對sysmail_allitems系統檢視執行一次查詢。

SELECT * FROM sysmail_allitems

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-553576/,如需轉載,請註明出處,否則將追究法律責任。

相關文章