M/S SQL 2005 메일 보내기.
데이터 베이스를 통해서 메일 보내는 방법을 확인해보겠습니다.
Database Mail XPs 옵션을 사용하여 서버에서 데이터 베이스 메일을 활성화 해야합니다.
쿼리문입니다.
use master
go
sp_configure 'show advanced option',1
go
reconfigure with override
go
sp_configure 'database mail xps',1
go
reconfigure
go
EXECUTE msdb.dbo.sysmail_add_account_sp
@account_name = 'MailServiceAccount'
, @description = 'DataBaser.Net Service Mail'
, @email_address = 'admin@databaser.net'
, @display_name = 'Databaser.Net'
, @username='wxxxxxx@domain.com
, @password='패스워드'
, @mailserver_name = '211.xxx.xxx.xxx'
EXECUTE msdb.dbo.sysmail_add_profile_sp
@profile_name = 'MailServiceProfile'
, @description = 'Profile used for database mail';
EXECUTE msdb.dbo.sysmail_add_profileaccount_sp
@profile_name = 'MailServiceProfile'
, @account_name = 'MailServiceAccount'
, @sequence_number = 1
EXECUTE msdb.dbo.sysmail_add_principalprofile_sp
@profile_name = 'MailServiceProfile'
, @principal_name = 'public'
, @is_default = 1 ;
GUI 에서 확인해보도록하겠습니다.
시작 -> 프로그램 -> Microsoft Sql Server 2005 -> 구성영역 -> SQL Server 노출 영역 구성
기능에 대한 노출 영력 구성 클릭후 다음 화면의 구성을 체크하시기 바랍니다.
데이터 베이스 메일 -> 데이터베이스 메일 저장 프로시저 사용
이제 적용하면 SQL 상에서 메일을 사용하기 위한 셋팅은 모두 끝났습니다.
Management Studio 에서 다음 항목으로....
관리 -> 데이터 베이스 메일 -> 데이터베이스 메일 구성
위 그림에서 보는것과 같이 양식에 맞게 입력하시되 SMTP 인증 부분에 대해서 좀 고민해보시고 입력하시 바랍니다.
만약 Windows 2003 일경우 SMTP 인증 부분이(셋팅후 SMTP 컨트롤하지 않았다면) 익명인증으로 되어 있을 것입니다.그럼 그림과 같이 익명인증으로하시면됩니다. (그림에는 포트번호가 8040 으로 되어 있는데, 기본 25번포트이니 잊지마시구요)
그럼 다시 쿼리문 입력해서 메일이 잘가는지 확인해보도록하겠습니다.
exec msdb.dbo.sp_send_dbmail
@profile_name = 'hanbiro_hanbiro',
@recipients = 'wXXXXX@domain.com',
@subject='SQL_Mail_Test',
@body='SQL 메일 테스트 중입니다. 제발좀 가라잉~',
@body_format ='TEXT';
이상없이 잘가네요..
msdb에 가면 mail에 관련된 테이블들이 쭉~ 생긴건 보실수 있습니다.
그중 sysmail_mailitems 를 Select 해보면 지금 보낸 메일의 로그를 확인 할 수 있습니다.
- MSDN 내용 -
반환 코드 0은 성공을 의미합니다.다른 값은 실패를 의미합니다.실패한 문의 오류 코드는 @@ERRROR 변수에 저장됩니다.
성공 시 "Mail queued" 메시지를 반환합니다.
사용하기 전에 데이터베이스 메일 구성 마법사 또는 sp_configure를 사용하여 데이터베이스 메일을 설정해야 합니다.
sysmail_stop_sp는 외부 프로그램이 사용하는 Service Broker 개체를 중지하여 데이터베이스 메일을 중지합니다.sysmail_stop_sp를 사용하여 데이터베이스 메일이 중지되어도 sp_send_dbmail은 여전히 메일을 받습니다.데이터베이스 메일을 시작하려면 sysmail_start_sp를 사용합니다.
@profile을 지정하지 않으면 sp_send_dbmail은 기본 프로필을 사용합니다.전자 메일 메시지를 보내는 사용자에게 기본 개인 프로필이 있을 경우 이 프로필이 사용됩니다.사용자에게 기본 개인 프로필이 없을 경우 sp_send_dbmail은 기본 공개 프로필을 사용합니다.사용자의 기본 개인 프로필과 기본 공개 프로필이 둘 다 없을 경우 sp_send_dbmail은 오류를 반환합니다.
sp_send_dbmail은 내용이 없는 전자 메일 메시지를 지원하지 않습니다.전자 메일 메시지를 보내려면 적어도 @body, @query, @file_attachments, @subject 중 하나 이상을 지정해야 합니다.그렇지 않으면 sp_send_dbmail은 오류를 반환합니다.
데이터베이스 메일에서는 현재 사용자의 Microsoft Windows 보안 컨텍스트를 사용하여 파일에 대한 액세스를 제어합니다.그러므로 SQL Server 인증 방식으로 인증된 사용자는 @file_attachments를 사용하여 파일을 첨부할 수 없습니다.Windows에서는 SQL Server를 사용하여 원격 컴퓨터에서 다른 원격 컴퓨터로 자격 증명을 제공할 수 없습니다.그러므로 SQL Server를 실행하는 컴퓨터가 아닌 컴퓨터에서 명령을 실행할 경우 데이터베이스 메일은 네트워크 공유 위치에서 파일을 첨부할 수 없습니다.
@query와 @file_attachments를 둘 다 지정한 경우 파일을 찾을 수 없으면 쿼리가 여전히 실행되지만 전자 메일은 전송되지 않습니다.
쿼리를 지정한 경우 결과 집합의 서식은 인라인 텍스트로 지정됩니다.결과 내 이진 데이터는 16진수 형식으로 전송됩니다.
매개 변수 @recipients, @copy_recipients 및 @blind_copy_recipients는 세미콜론으로 구분된 전자 메일 주소 목록입니다.적어도 이 매개 변수 중 하나 이상을 지정해야 합니다. 그렇지 않으면 sp_send_dbmail은 오류를 반환합니다.
트랜잭션 컨텍스트 없이 sp_send_dbmail을 실행하면 데이터베이스 메일이 암시적 트랜잭션을 시작하고 커밋합니다.기존 트랜잭션 내에서 sp_send_dbmail을 실행하는 경우 사용자가 데이터베이스 메일에서 변경 내용을 커밋 또는 롤백할지를 결정합니다.내부 트랜잭션은 시작되지 않습니다.
sp_send_dbmail을 실행할 수 있는 권한은 기본적으로 msdb 데이터베이스에서 DatabaseMailUser 데이터베이스 역할의 모든 멤버로 설정됩니다.그러나 메시지를 보내는 사용자에게 요청하기 위해 프로필을 사용할 수 있는 권한이 없을 경우 sp_send_dbmail은 오류를 반환하고 메시지를 보내지 않습니다.
1.전자 메일 메시지 보내기
다음 예에서는 전자 메일 주소 danw@Adventure-Works.com을 사용하여 Dan Wilson에게 전자 메일 메시지를 보냅니다.메시지의 제목은 Automated Success Message입니다.메시지의 본문에는 'The stored procedure finished successfully'라는 문장이 포함되어 있습니다.
EXEC msdb.dbo.sp_send_dbmail @profile_name = 'Adventure Works Administrator', @recipients = 'danw@Adventure-Works.com', @body = 'The stored procedure finished successfully.', @subject = 'Automated Success Message' ;
2.쿼리 결과를 포함하여 전자 메일 메시지 보내기
다음 예에서는 전자 메일 주소 danw@Adventure-Works.com을 사용하여 Dan Wilson에게 전자 메일 메시지를 보냅니다.메시지의 제목은 Work Order Count이며 이 메시지는 DueDate가 2004년 4월 30일부터 2일 내인 작업 주문 번호를 보여 주는 쿼리를 실행합니다.데이터베이스 메일은 결과를 텍스트 파일로 첨부합니다.
EXEC msdb.dbo.sp_send_dbmail @profile_name = 'Adventure Works Administrator', @recipients = 'danw@Adventure-Works.com', @query = 'SELECT COUNT(*) FROM AdventureWorks2012.Production.WorkOrder WHERE DueDate > ''2004-04-30'' AND DATEDIFF(dd, ''2004-04-30'', DueDate) < 2' , @subject = 'Work Order Count', @attach_query_result_as_file = 1 ;
3.HTML 전자 메일 메시지 보내기
다음 예에서는 전자 메일 주소 danw@Adventure-Works.com을 사용하여 Dan Wilson에게 전자 메일 메시지를 보냅니다.메시지의 제목은 Work Order List이며 이 메시지에는 DueDate가 2004년 4월 30일부터 2일 내인 작업 주문을 보여 주는 HTML 문서가 포함되어 있습니다.데이터베이스 메일은 메시지를 HTML 형식으로 보냅니다.
DECLARE @tableHTML NVARCHAR(MAX) ; SET @tableHTML = N'<H1>Work Order Report</H1>' + N'<table border="1">' + N'<tr><th>Work Order ID</th><th>Product ID</th>' + N'<th>Name</th><th>Order Qty</th><th>Due Date</th>' + N'<th>Expected Revenue</th></tr>' + CAST ( ( SELECT td = wo.WorkOrderID, '', td = p.ProductID, '', td = p.Name, '', td = wo.OrderQty, '', td = wo.DueDate, '', td = (p.ListPrice - p.StandardCost) * wo.OrderQty FROM AdventureWorks.Production.WorkOrder as wo JOIN AdventureWorks.Production.Product AS p ON wo.ProductID = p.ProductID WHERE DueDate > '2004-04-30' AND DATEDIFF(dd, '2004-04-30', DueDate) < 2 ORDER BY DueDate ASC, (p.ListPrice - p.StandardCost) * wo.OrderQty DESC FOR XML PATH('tr'), TYPE ) AS NVARCHAR(MAX) ) + N'</table>' ; EXEC msdb.dbo.sp_send_dbmail @recipients='danw@Adventure-Works.com', @subject = 'Work Order List', @body = @tableHTML, @body_format = 'HTML' ;