다음을 통해 공유


xp_sendmail(Transact-SQL)

쿼리 결과 집합이 첨부될 수 있는 전자 메일 메시지를 지정된 수신자에게 보냅니다. 이 확장 저장 프로시저는 SQL 메일을 사용하여 메시지를 보냅니다.

[!참고]

Microsoft SQL Server의 이후 버전에서는 이 기능이 제거됩니다. 새 개발 작업에서는 이 기능을 사용하지 않도록 하고, 현재 이 기능을 사용하는 응용 프로그램은 수정하십시오.SQL Server에서 메일을 보내려면 데이터베이스 메일을 사용하십시오.

항목 링크 아이콘Transact-SQL 구문 표기 규칙

구문

xp_sendmail { [ @recipients= ] 'recipients [ ;...n ]' } 
     [ ,[ @message= ] 'message' ] 
     [ ,[ @query= ] 'query' ] 
     [ ,[ @attachments= ] 'attachments [ ;...n ]' ] 
     [ ,[ @copy_recipients= ] 'copy_recipients [ ;...n ]'
     [ ,[ @blind_copy_recipients= ] 'blind_copy_recipients [ ;...n ]'
     [ ,[ @subject= ] 'subject' ]
     [ ,[ @type= ] 'type' ] 
     [ ,[ @attach_results= ] 'attach_value' ]
     [ ,[ @no_output= ] 'output_value' ] 
     [ ,[ @no_header= ] 'header_value' ] 
     [ ,[ @width= ] width ] 
     [ ,[ @separator= ] 'separator' ] 
     [ ,[ @echo_error= ] 'echo_value' ] 
     [ ,[ @set_user= ] 'user' ] 
     [ ,[ @dbuse= ] 'database' ]

인수

  • [ @recipients=] **'**recipients [ ;... n] '
    메일 수신자의 목록으로, 세미콜론으로 구분되어 있습니다.

  • [ @message=] 'message'
    보낼 메시지 본문입니다. message에는 8.000바이트까지 사용할 수 있습니다.

  • [ @query=] 'query'
    유효한 SQL Server 쿼리이며 그 결과는 메일로 전달됩니다. xp_sendmail은 query 매개 변수에 대한 바운드 연결을 사용합니다. SQL 메일에서 설정한 query 연결은 xp_sendmail 요청을 발급한 클라이언트가 보유하고 있는 잠금으로 차단할 수 없습니다. 그러므로 트리거 내에서 보다 쉽게 xp_sendmail을 사용할 수 있습니다. 그러나 inserteddeleted 논리 테이블은 트리거 내에서만 사용할 수 있기 때문에 query 문은 이 테이블을 참조할 수 없습니다. query에는 8,000바이트까지 사용할 수 있습니다.

  • [ @attachments=] **'**attachments [ ;... n] '
    메일 메시지에 첨부되는 파일 목록으로, 세미콜론으로 구분되어 있습니다. @attach_results가 TRUE인 경우 @query 매개 변수를 사용하면 @attachments 매개 변수는 메일 메시지에 첨부할 파일을 한 개만 지정할 수 있습니다. 이러한 경우 파일 여러 개를 보내려면 첨부된 파일 각각에 대해 별도로 xp_sendmail을 실행해야 합니다.

  • [ @copy_recipients=] **'**copy_recipients [ ;... n] '
    메일의 참조 수신자를 표시하는 목록으로, 세미콜론으로 구분되어 있습니다.

  • [ @blind_copy_recipients=] **'**blind_copy_recipients[ ;... n] '
    메일의 숨은 참조 수신자를 표시하는 목록으로, 세미콜론으로 구분되어 있습니다.

  • [ @subject=] 'subject'
    메일의 제목을 지정하는 매개 변수입니다. subject를 지정하지 않으면 "SQL Server Message"가 기본값입니다.

  • [ @type = ] 'type'
    MAPI 메일 정의를 기반으로 한 입력 메시지 유형입니다.

    IP[ M|C ].Vendorname.subclass

    type이 NULL인 경우 xp_sendmail은 메시지 유형 IPM을 사용합니다. IPM으로 시작하는 메시지 유형은 메일 클라이언트의 받은 편지함에 표시되고 xp_findnextmsg를 사용하여 찾거나 읽습니다. IPC로 시작하는 메시지 유형은 메일 클라이언트의 받은 편지함에 표시되지 않으며 type 매개 변수를 설정하여 찾거나 읽어야 합니다. 기본값은 NULL입니다. SQL 메일은 IPM 및 IPC 유형의 메시지를 지원합니다.

  • [ @attach_results=] 'attach_value'
    메일에 추가하는 대신, 첨부 파일로 메일 내에서 전달되어야 하는 쿼리의 결과 집합을 지정하는 선택적 매개 변수입니다. @attachments가 NULL이 아니며 @attach_results가 TRUE인 경우 attachments의 첫 번째 파일 이름이 결과에 대한 파일 이름으로 사용됩니다. @attachments가 NULL인 경우에는 파일 이름이 .txt 확장명을 사용하여 생성됩니다. 기본값은 FALSE이며 결과 집합이 메시지에 추가된다는 의미입니다.

  • [ @no_output=] 'output_value'
    메일을 보내나 메일을 보낸 클라이언트 세션에 출력을 반환하지 않는 선택적 매개 변수입니다. 기본값은 FALSE이며 SQL Server의 클라이언트 세션이 출력을 받는다는 것을 의미합니다.

  • [ @no_header=] 'header_value'
    메일로 쿼리 결과를 전달하나 쿼리 결과와 함께 열 머리글 정보를 전달하지 않는 선택적 매개 변수입니다. 기본값은 열 헤더 정보가 쿼리 결과로 전달되도록 지정하는 FALSE입니다.

  • [ @width=] width
    쿼리의 출력 텍스트 줄 너비를 설정하는 선택적 매개 변수입니다. 이 매개 변수는 isql 유틸리티의 /w 매개 변수와 같습니다. 긴 출력 행을 생성하는 쿼리에 대해서는 attach_results와 함께 width를 사용하여 출력 줄의 줄 바꿈 없이 출력을 전달합니다. 기본 너비는 80자입니다.

  • [ @separator=] 'separator'
    결과 집합의 각 열에 대한 열 구분 기호 문자열입니다. 기본적으로 열 구분 기호는 공백입니다. 열 구분 기호를 사용하면 스프레드시트와 기타 응용 프로그램에서 결과 집합을 보다 쉽게 구문 분석할 수 있습니다. 예를 들어 쉼표로 구분된 값이 있는 파일을 보내려면 attach_results와 함께 separator를 사용합니다.

  • [ @echo_error=] 'echo_value'
    TRUE로 설정한 경우 SQL 메일이 쿼리를 실행하는 중에 발생한 모든 서버 메시지 또는 DB-Library 오류를 캡처하고 캡처한 내용을 오류 로그에 기록하지 않고 메일 메시지에 추가합니다. 또한 반환된 행/적용된 행의 수가 메일 메시지에 추가됩니다.

    [!참고]

    echo_error가 TRUE인 경우 DB-Library 오류 또는 메시지가 발생했거나 쿼리가 결과를 반환하지 않더라도 메일이 성공적으로 전달되었으면 xp_sendmail이 0(성공) 상태를 반환합니다.

  • [ @set_user=] 'user'
    쿼리가 실행되는 보안 컨텍스트입니다. user를 지정하지 않은 경우 기본 보안 컨텍스트는 xp_sendmail을 실행하는 사용자의 보안 컨텍스트입니다.

  • [ @dbuse=] 'database'
    쿼리가 실행되어야 하는 데이터베이스 컨텍스트입니다. 기본값은 NULL이며 사용자가 기본 데이터베이스에 있음을 의미합니다.

반환 코드 값

0(성공) 또는 1(실패)

결과 집합

성공적인 경우 xp_sendmail은 메시지를 반환합니다.

주의

SQL 메일 세션은 xp_sendmail을 실행하기 전에 시작해야 합니다. 세션은 자동으로 또는 xp_startmail을 사용하여 시작할 수 있습니다. SQL 메일 세션을 자동으로 설정하는 방법은 확장 MAPI 메일 프로필 구성을 참조하십시오. 한 SQL 메일 세션은 SQL Server 인스턴스의 모든 사용자를 지원하지만 한 번에 한 사용자만 메시지를 보낼 수 있습니다. 메일 메시지를 보내는 다른 사용자는 자동으로 첫 번째 사용자의 메시지가 전달될 때까지 대기 상태가 됩니다.

query를 지정한 경우 xp_sendmail은 SQL Server에 클라이언트로 로그인하고 지정한 쿼리를 실행합니다. SQL 메일은 SQL Server에 별도로 연결하며 xp_sendmail을 실행하는 원래 클라이언트 연결과 같은 연결을 공유하지 않습니다.

[!참고]

query는 xp_sendmail을 실행한 클라이언트 연결이 보유하고 있는 잠금으로 차단할 수 있습니다. 예를 들어 트랜잭션 내에서 테이블을 업데이트하고 있으며 query 매개 변수로 동일하게 업데이트된 행 정보를 선택하려고 시도하는 업데이트용 트리거를 만드는 경우 SQL 메일 연결은 초기 클라이언트 연결이 행에 대해 보유하고 있는 배타적 잠금에 의해 차단됩니다.

xp_sendmail은 SQL Server의 보안 컨텍스트에서 실행됩니다. 유효한 xp_sendmail 사용자는 관리자의 보안 컨텍스트에서 메일 메시지에 첨부할 파일에 액세스할 수 있습니다. 시스템 관리자가 아닌 사용자가 xp_sendmail에 액세스해야 할 경우 첨부 파일에 대한 안전하지 않은 액세스를 방지하려면 시스템 관리자는 xp_sendmail을 호출하고 필요한 기능을 제공하는 저장 프로시저를 만들 수 있지만 이로 인해 attachments 매개 변수가 노출되지는 않습니다. 이 저장 프로시저는 master 데이터베이스에서 정의해야 합니다. 그런 다음 시스템 관리자는 기본 xp_sendmail 프로시저에 대한 권한을 부여하지 않고도 필요한 사용자에게 저장 프로시저에 실행 권한을 부여할 수 있습니다.

xp_sendmail은 지정된 수신자에게 메시지와 쿼리 결과 집합 또는 첨부 파일을 전달하고 query 매개 변수에 대한 바운드 연결을 사용합니다. SQL 메일에서 설정한 query 연결은 xp_sendmail 요청을 발급한 클라이언트가 보유하고 있는 잠금으로 차단할 수 없습니다. 그러므로 트리거 내에서 보다 쉽게 xp_sendmail을 사용할 수 있습니다. 그러나 query 문은 트리거 내에서만 사용할 수 있는 inserted 논리 테이블 또는 deleted 논리 테이블을 참조할 수 없습니다.

[!참고]

MSSQLServer 서비스가 권한이 충분하지 않아서 액세스할 수 없는 파일 공유 위치에 우체국 및 주소록이 있을 때 xp_sendmail을 실행하려고 시도하면 액세스 위반이 발생할 수 있습니다.

xp_sendmail은 xml 데이터 형식을 완전히 지원하지 않습니다. xml 데이터 형식을 사용하는 쿼리에는 잘못된 서식이 지정될 수 있습니다. xml 데이터가 포함된 전자 메일을 보내려면 데이터베이스 메일을 사용합니다.

사용 권한

sysadmin 고정 서버 역할의 멤버여야 하지만 EXECUTE 권한은 다른 사용자에게도 부여할 수 있습니다. 그러나 보안상의 이유로 이 저장 프로시저의 사용 권한을 sysadmin 고정 서버 역할의 멤버로 제한하는 것이 좋습니다.

1. 한 명에게 메시지 보내기

다음 예에서는 Dan Wilson(전자 메일은 danw)이라는 사용자에게 master 데이터베이스가 가득 찼다는 메시지를 보냅니다.

EXEC master.dbo.xp_sendmail 
    @recipients=N'danw@Adventure-Works.com',
    @message=N'The master database is full.' ;

2. 여러 명에게 메시지 보내기

다음 예에서는 Peter Connelly(전자 메일은 peterc)를 참조로 넣어서 Dan Wilson과 Ashvini Sharma(전자 메일은 ashvinis)라는 사용자에게 메시지를 보냅니다. 여기서는 메시지에 대한 제목 줄도 지정합니다.

EXEC master.dbo.xp_sendmail 
    @recipients=N'danw@Adventure-Works.com;ashvinis@Adventure-Works.com',
     @message=N'The master database is full.',
     @copy_recipients=N'peterc@Adventure-Works.com',
     @subject=N'Master database status' ;
GO

3. 결과 보내기

다음 예에서는 sp_configure의 결과를 Dan Wilson에게 보냅니다.

EXEC master.dbo.xp_sendmail 
    @recipients=N'danw@Adventure-Works.com',
    @query = N'EXEC sp_configure' ;
GO

4. 첨부 파일로 결과 보내기

다음 예에서는 SELECT * FROM INFORMATION_SCHEMA.TABLES 쿼리의 결과를 텍스트 파일로 첨부하여 Dan Wilson에게 보냅니다. 여기에는 첨부 파일 앞에 표시되는 메일의 제목 줄과 메시지가 포함됩니다. @width 매개 변수는 출력 줄에서 줄 바꿈을 방지하는 데 사용됩니다.

EXEC master.dbo.xp_sendmail
    @recipients = N'danw@Adventure-Works.com', 
    @query = N'SELECT * FROM INFORMATION_SCHEMA.TABLES',
    @subject = N'SQL Server Report',
    @message = N'The contents of INFORMATION_SCHEMA.TABLES:',
    @attach_results = 'TRUE',
    @width = 250 ;

5. 7,990바이트 문자가 넘는 메시지 보내기

다음 예에서는 7,990바이트 문자가 넘는 메시지를 보내는 방법을 보여 줍니다. message의 길이는 VARCHAR(행 오버헤드가 적고 모두 저장 프로시저 매개 변수임)의 길이로 제한되므로 이 예에서는 단일 텍스트 열로 구성된 전역 임시 테이블에 메시지를 기록합니다. 그런 다음 이 임시 테이블의 내용이 @query 매개 변수를 사용하여 메일로 전송됩니다.

CREATE TABLE ##mail_body(c1 NVARCHAR(4000)) ;

DECLARE @cmd VARCHAR(56) ;

INSERT ##mail_body(c1)
VALUES ('Put your long message here.') ;

SET @cmd = 'SELECT c1 FROM ##mail_body' ;

EXEC master.dbo.xp_sendmail 
    @recipients = 'danw@Adventure-Works.com', 
    @query = @cmd,
    @no_header= 'TRUE' ;

DROP TABLE ##mail_body ;