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'
    読み込むメッセージの 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 を設定した場合は、xp_readmail で添付ファイル付きのメッセージを読み取るときに、SQL Server では一時ファイルは作成されません。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: フィールドにある受信者を、セミコロン区切りのリストで指定します。受信者の名前はセミコロン (
    ;
    ) で区切ります。cc_list のデータ型は varchar(255) で、既定値はありません。

  • [ @bcc_list = ] 'blind_copy_recipients[ ;...n] '
    メール メッセージの BCC: フィールドにある受信者を、セミコロン区切りのリストで指定します。受信者の名前はセミコロン (
    ;
    ) で区切ります。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

電子メール メッセージの "CC:" 行にある受信者

BCC List

電子メール メッセージの "BCC:" 行にある受信者

Subject

電子メール メッセージの件名行

Message

メッセージの本文 (テキスト)

Unread

このメッセージが未読かどうか

Attachments

メッセージの添付ファイル

Message ID

メッセージ ID

Type

メッセージ型

説明

無効なパラメータ以外の失敗はすべて、Microsoft Windows のアプリケーション ログに記録されます。

xp_readmail には次の 2 つの用途があります。

  • クライアントへの結果セットとして、受信トレイのすべてのメッセージを返す。

  • 受信トレイから 1 つのメッセージを読み取る。

クライアントへの結果セットとして受信トレイの内容を返す場合、入力パラメータは指定しないでください。

suppress_attach パラメータの既定値を TRUE に変更できなかった場合は、添付ファイルに関して 2 つのセキュリティ問題が発生する可能性があります。

  • 1 つは、2 人の異なるユーザーが同じ一時ディレクトリを共有して同じコンピュータにログオンしている場合に、この 2 人のユーザーが互いの添付ファイルを参照できるという問題です。attachments 出力変数を確認すると、添付ファイルの格納先と、2 人のユーザーが同じ一時ディレクトリを共有しているかどうかを判断できます。

  • もう 1 つは、xp_deletemail では添付ファイルが削除されないため、添付ファイルを手動で削除する必要があるという問題です。

受信トレイから 1 つのメッセージを読み取るには、xp_readmail への入力パラメータとして、xp_findnextmsg で返される有効な message_id を指定します。入力パラメータとして peek および suppress_attach を指定すると、メッセージを読み取る方法を制御できます。この方法で peek と suppress_attach を使用する場合、他のすべてのパラメータはオプションの出力パラメータになり、読み取るメッセージの特定の情報が格納されます。

次のコマンドを実行すると、xp_readmail への入力パラメータとして xp_findnextmsg を使用している例を表示できます。

sp_helptext 'sp_processmail';

xp_readmail で 1 つのメッセージを読み取る場合は、255 バイトより長いメッセージ テキストを分割して読み取ることができます。255 バイトより長いメッセージ テキストを分割して読み取るには、length_in_bytes を使用します。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 からのメッセージ ID の値はローカル変数 @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