xp_readmail (Transact-SQL)

從 SQL Mail 收件匣中讀取郵件訊息。sp_processmail 利用這個程序來處理 SQL Mail 收件匣中的所有郵件。

[!附註]

未來的 Microsoft SQL Server 版本將移除這項功能。請避免在新的開發工作中使用這項功能,並規劃修改目前使用這項功能的應用程式。

主題連結圖示Transact-SQL 語法慣例

語法

xp_readmail [ [ @msg_id= ] 'message_id' ]
     [ , [ @type= ] 'type' [ OUTPUT ] ] 
     [ , [ @peek= ] 'peek' ]
     [ , [ @suppress_attach= ] 'suppress_attach' ]
     [ , [ @originator= ] 'sender' OUTPUT ]
     [ , [ @subject= ] 'subject' OUTPUT ]
     [ , [ @message= ] 'message' OUTPUT ]
     [ , [ @recipients= ] 'recipients [ ;...n ]' OUTPUT ]
     [ , [ @cc_list= ] 'copy_recipients [ ;...n ]' OUTPUT ]
     [ , [ @bcc_list= ] 'blind_copy_recipients [ ;...n ]' OUTPUT ]
     [ , [ @date_received= ] 'date' OUTPUT ]
     [ , [ @unread= ] 'unread_value' OUTPUT ]
     [ , [ @attachments= ] 'attachments [ ;...n ]' OUTPUT ])
     [ , [ @skip_bytes= ] bytes_to_skip OUTPUT ]
     [ , [ @msg_length= ] length_in_bytes OUTPUT ]
     [ , [ @originator_address= ] 'sender_address' OUTPUT ] ]

引數

  • [@msg_id = ] 'message_id'
    這是要讀取的訊息識別碼。message_id 是 varchar(255),沒有預設值。

  • [@type = ] 'type'
    這是要根據 MAPI 定義傳回的訊息類型:

    IP[ M|C ].Vendorname.subclass

    如果用在輸入上,必須定義特定訊息的類型;如果 message_id 是 NULL 時,輸入就會忽略 type。type 是 varchar(255),預設值是 NULL。SQL Mail 支援訊息類型 IPM 和 IPC。

  • OUTPUT
    當指定這個引數時,它會將指定參數的值放在輸出參數中。

  • [@peek = ] 'peek'
    這是指 SQL Server 是否傳回郵件的訊息,不會將郵件狀態改成已讀取。peek 是 varchar(5),預設值是 FALSE。如果設為 FALSE,就會將郵件當作已讀取來處理。如果設為 TRUE,就會將郵件當作尚未讀取來處理。

  • [@suppress_attach = ] 'suppress_attach'
    這是指是否抑制郵件附加檔案。suppress_attach 是 varchar(255),預設值是 FALSE。如果設為 TRUE,SQL Server 可防止在 xp_readmail 讀取含附加檔案的訊息時建立暫存檔。如果設為 FALSE,當讀取含附加檔案的訊息時,就不會防止建立暫存檔。

  • [@originator = ] 'sender'
    這是指傳回的郵件寄件者。sender是 varchar(255),沒有預設值。

  • [@subject = ] 'subject'
    這是指傳回的郵件訊息主旨。subject 是 varchar(255),沒有預設值。

  • [@message=] 'message'
    這是指郵件訊息的傳回主體或實際文字。message 是 text,沒有預設值。

  • [@recipients=] 'recipients [ ;...n] '
    這是要傳回的郵件訊息的收件者清單 (用分號分隔)。收件者的名稱用分號 (
    ;
    ) 分隔。recipient_list 是 varchar(255),沒有預設值。

  • [@cc_list = ] 'copy_recipients [ ;...n] '
    這是要傳回的郵件訊息之 [副本:] 欄位中的收件者清單 (用分號分隔)。收件者的名稱用分號 (
    ;
    ) 分隔。cc_list 是 varchar(255),沒有預設值。

  • [@bcc_list = ] 'blind_copy_recipients[ ;...n] '
    這是要傳回的郵件訊息之 [密件副本:] 欄位中的收件者清單 (用分號分隔)。收件者的名稱用分號 (
    ;
    ) 分隔。bcc_list 是 varchar(255),沒有預設值。如果電子郵件伺服器未提供 BCC 欄位的值,blind_copy_recipients 便是空的。

  • [@date_received = ] 'date'
    這是郵件訊息的傳回日期。date 是 varchar(255),沒有預設值。

  • [@unread = ] 'unread_value'
    這是指先前未讀取 (true) 或已讀取 (false) 的訊息。unread_value 是 varchar(5),預設值為 TRUE。

  • [@attachments = ] 'attachments [ ;... n] '
    這是傳回的訊息郵件附加檔案暫存路徑清單 (用分號分隔)。各個暫存路徑用分號 (
    ;
    ) 分隔。attachments 是 varchar(255),沒有預設值。

  • [@skip_bytes = ] bytes_to_skipOUTPUT
    如果所傳遞的輸入值不是 0,這個參數會指定在略過多少位元組之後,便將訊息的下 255 個位元組 (最大值) 讀入 body_of_message 輸出參數。當使用 bytes_to_skip 時,body_of_message 包括訊息的下一部分,bytes_to_skip 會傳回訊息內的下一個起點 (上一個 bytes_to_skip 加上 message 的長度)。bytes_to_skip 是 int,預設值是 0。

  • [@msg_length = ] length_in_bytesOUTPUT
    這是訊息的總長度 (以位元組為單位)。當在預存程序中搭配 bytes_to_skip 使用時,這個參數可用來每次讀取 255 個位元組。length_in_bytes 是 int。

  • [@originator_address = ] 'sender_address'
    這是已解析的郵件訊息發起者郵件地址。sender_address 是 varchar(255),沒有預設值。

傳回碼值

0 (成功) 或 1 (失敗)

結果集

xp_readmail 會傳回含下列資料行的結果集。

資料行名稱

描述

Originator

電子郵件訊息的寄件者

Date Received

電子郵件訊息的接收日期

Recipients

訊息所送往的人員

CC List

在電子郵件訊息 [副本:] 列中的人員

BCC List

電子郵件訊息「密件副本」欄位上的人員

Subject

電子郵件訊息的主旨

Message

訊息主體 (文字)

Unread

是否尚未讀取這則訊息

Attachments

訊息的任何附加檔案

Message ID

Message ID

Type

訊息類型

備註

除了無效參數,任何失敗都會記錄到 Microsoft Windows 應用程式記錄檔中。

您可以利用兩種方式來使用 xp_readmail

  • 將收件匣中的所有訊息當作結果集傳回用戶端。

  • 從收件匣中讀取單一訊息。

若要將收件匣中的內容當作結果集傳回用戶端,請勿提供任何輸入參數。

將 suppress_attach 參數的預設值改成 TRUE 失敗,附加檔案可能會出現兩個安全性問題。

  • 首先,如果兩個不同的使用者共用相同的暫存目錄,且登入相同的電腦,他們將能夠檢視彼此的附加檔案。您可以檢閱 attachments 輸出變數來判斷附加檔案的儲存位置,以及兩位使用者是否共用相同的暫存目錄。

  • 其次,xp_deletemail 並不會刪除這些附加檔案,因此,您必須手動刪除每個附加檔案。

若要從收件匣中讀取單一訊息,請將 xp_findnextmsg 傳回的有效 message_id 當作輸入參數提供給 xp_readmail。您可以指定 peek 和 suppress_attach 作為輸入參數來控制讀取訊息的方式。當以這個方法來使用 peek 和 suppress_attach 時,所有其他參數都是選擇性的輸出參數,其中包含要讀取訊息中的特定資訊。

您可以執行下列命令來檢視利用 xp_findnextmsg 作為 xp_readmail 之輸入參數的範例:

sp_helptext 'sp_processmail';

當利用 xp_readmail 來讀取單一訊息時,它可以讀取區段中長度超出 255 個位元組的訊息文字。請利用 length_in_bytes 來讀取區段中長度超出 255 個位元組的訊息文字。同時利用 length_in_bytes 來作為輸入和輸出參數,可讓您編寫迴圈來處理整個訊息文字。下列程式碼顯示這樣的迴圈範例,其中假設將 message_id 設為 xp_findnextmsg 傳回的有效訊息識別碼。

USE master;
GO

-- Set up variables.

DECLARE @status INT,
        @message_part VARCHAR(255),
        @msg_id VARCHAR(255),
        @message_length INT,
        @skip_bytes INT,
        @message VARCHAR(MAX) ;

-- Find the next message

EXEC @status = dbo.xp_findnextmsg
     @msg_id = @msg_id OUTPUT ;


-- If xp_findnextmsg completed successfully and
-- there is a message in the inbox, read the message.

IF (@status = 0  AND @msg_id IS NOT NULL)
BEGIN
   WHILE (1=1)
   BEGIN
        EXEC @status = dbo.xp_readmail
             @msg_id = @msg_id,
             @msg_length = @message_length OUTPUT,
             @skip_bytes = @skip_bytes OUTPUT,
             @message = @message_part OUTPUT ;

        IF @status <> 0 BREAK ;

        SET @message = ISNULL(@message, '') + @message_part ;

        PRINT @message_length ;
        PRINT @skip_bytes;

        IF @message_length = @skip_bytes BREAK ;

    END ;
    
    IF @status = 0
    BEGIN
       SELECT 'Message ID' = @msg_id, 'Message Body' = @message ;
    END ;
    ELSE
        SELECT 'Could not read message.' ;
END;

GO

權限

需要系統管理員 (sysadmin) 固定伺服器角色中的成員資格,但是 EXECUTE 權限可以授與其他使用者。不過,基於安全性的考量,建議您將這個預存程序的權限限制在系統管理員 (sysadmin) 固定伺服器角色的成員。

範例

下列範例會在讀取訊息時傳回狀態。在這個範例中,xp_findnextmsg 中的訊息識別碼值放在本機變數 @message\_id 中,並傳給 xp_readmail。

USE master ;
GO

DECLARE @status INT,
    @msg_id VARCHAR(255),
    @originator VARCHAR(255),
    @cc_list VARCHAR(255),
    @subject VARCHAR(255),
    @query VARCHAR(8000);


-- Find the next message

EXEC @status = dbo.xp_findnextmsg
     @msg_id = @msg_id OUTPUT ;


-- If xp_findnextmsg completed successfully and
-- there is a message in the inbox, read the message.

IF (@status = 0  AND @msg_id IS NOT NULL)
BEGIN
    EXEC @status = dbo.xp_readmail
        @msg_id = @msg_id,
        @originator = @originator OUTPUT,
        @cc_list = @cc_list OUTPUT,
        @subject = @subject OUTPUT,
        @message = @query OUTPUT,
        @peek = 'TRUE',
        @suppress_attach = 'TRUE'

END;
GO