xp_readmail (Transact-SQL)
SQL Mail の受信トレイからメール メッセージを読み取ります。このプロシージャは、sp_processmail が SQL Mail の受信トレイにあるすべてのメールを処理するときに使用されます。
注 |
---|
この機能は、将来のバージョンの Microsoft SQL Server では削除される予定です。新しい開発作業では、この機能の使用を避け、現在この機能を使用しているアプリケーションは修正するようにしてください。 |
構文
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