Post
ORACLE UTL_SMTP 패키지 사용 시 ACL 등록
UTL_SMTP 패키지 사용하여
메일을 보낼 때에는 이런식으로 만들어서 사용한다.
create or replace PROCEDURE “SENDMAIL” (to_addr in varchar2, subject in varchar2, body in varchar2) IS
crlf varchar2(2):=CHR(13)||CHR(10); mesg varchar2(4000); mailhost varchar2(30):= ‘xxx.xxx.xxx.xxx’;
conn UTL_SMTP.CONNECTION;
BEGIN BEGIN
conn:=UTL_SMTP.OPEN_CONNECTION(mailhost,25);
UTL_SMTP.helo(conn,mailhost); UTL_SMTP.mail(conn,’’);
UTL_SMTP.rcpt(conn, to_addr);
UTL_SMTP.open_data(conn); UTL_SMTP.WRITE_DATA(conn,’MIME-Version: 1.0’ || UTL_TCP.CRLF ); UTL_SMTP.WRITE_DATA(conn,’Content-Type: text/html; charset=“utf-8”’ || UTL_TCP.CRLF ); UTL_SMTP.WRITE_RAW_DATA(conn, UTL_RAW.CAST_TO_RAW(‘From: ‘ || ‘HRIS’ || UTL_TCP.CRLF) ); UTL_SMTP.WRITE_RAW_DATA(conn, UTL_RAW.CAST_TO_RAW(‘To: ‘ || to_addr || UTL_TCP.CRLF) ); UTL_SMTP.WRITE_DATA(conn, ‘Subject: =?UTF-8?Q?’ || replace(utl_raw.cast_to_varchar2(utl_encode.quoted_printable_encode(utl_raw.cast_to_raw(subject))), ‘=’ || crlf, ‘’) || ‘?=’ || UTL_TCP.crlf); UTL_SMTP.WRITE_DATA(conn, UTL_TCP.CRLF );
mesg := body; UTL_SMTP.WRITE_RAW_DATA(conn, UTL_RAW.CAST_TO_RAW(mesg || UTL_TCP.CRLF) ); UTL_SMTP.close_data(conn); UTL_SMTP.quit(conn); END; EXCEPTION WHEN OTHERS THEN UTL_SMTP.close_data(conn); UTL_SMTP.quit(conn);
END SENDMAIL2;
다만 사용하기 전에 네트워크 액세스 목록 등록을 해야 한다.
등록하지 않으면
ORA-24247: 네트워크 액세스가 ACL(엑세스 제어 목록)에 의해 거부되었습니다.
위와 같은 오류 발생한다.
다른 곳에서 데이터 작업을 하여 위 프로시저를 실행할 경우에는
ORA-29277:부적합한 SMTP 작업
오류가 발생하기도 한다.
해당 부분은
ACL을 등록하지 않았을때 발생하며 아래와 같이 등록 작업을 해 주면된다. ACL과 DESCRIPTION은 통일만 한다면 명칭 바꿔도 상관없음
begin
DBMS_NETWORK_ACL_ADMIN.CREATE_ACL(
acl => ‘network_services.xml’
, description => ‘NETWORK ACL’
, principal => ‘계정명(대소문자 구분)’
, is_grant => true
, privilege => ‘connect’
);
DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(
acl => ‘network_services.xml’
, principal => ‘계정명(대소문자 구분)’
, is_grant => true
, privilege => ‘resolve’);
DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL( acl => ‘network_services.xml’, host => ‘*’);
commit;
end;
댓글