xp_readmail(Transact-SQL)
SQL 메일 받은 편지함에서 메일 메시지를 읽습니다. 이 프로시저는 sp_processmail에서 SQL 메일 받은 편지함에 있는 모든 메일을 처리하는 데 사용합니다.
[!참고]
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 메일은 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_list는 varchar(255)이며 기본값은 없습니다.[ @bcc_list = ] 'blind_copy_recipients[ ;... n] '
반환할 메일 메시지의 숨은 참조 필드에 있는 수신자 목록으로, 세미콜론으로 구분됩니다. 수신자 이름은 세미콜론(;)으로 구분됩니다. bcc_list는 varchar(255)이며 기본값은 없습니다. 전자 메일 서버가 숨은 참조 필드에 값을 제공하지 않으면 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 |
메시지 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바이트보다 긴 메시지 텍스트를 읽을 수 있습니다. 구역에서 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