다음을 통해 공유


xp_readmail(Transact-SQL)

SQL 메일 받은 편지함에서 메일 메시지를 읽습니다. 이 프로시저는 sp_processmail에서 SQL 메일 받은 편지함에 있는 모든 메일을 처리하는 데 사용합니다.

[!참고]

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 메일은 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_findnextmsgxp_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