xp_sendmail(Transact-SQL)
쿼리 결과 집합이 첨부될 수 있는 전자 메일 메시지를 지정된 수신자에게 보냅니다. 이 확장 저장 프로시저는 SQL 메일을 사용하여 메시지를 보냅니다.
[!참고]
Microsoft SQL Server의 이후 버전에서는 이 기능이 제거됩니다. 새 개발 작업에서는 이 기능을 사용하지 않도록 하고, 현재 이 기능을 사용하는 응용 프로그램은 수정하십시오.SQL Server에서 메일을 보내려면 데이터베이스 메일을 사용하십시오.
구문
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을 사용할 수 있습니다. 그러나 inserted 및 deleted 논리 테이블은 트리거 내에서만 사용할 수 있기 때문에 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 ;