본문 바로가기

Oracle/admin

UTL_MAIL

03 | UTL_MAIL을 이용한 메일 전송

UTL_SMTP는 메일 전송에 있어 다양한 기능을 지원하지만, 사용하기가 그리 쉽지만은 않다. 그래서 10g 버전부터는 좀더 쉽게 메일을 전송할 수 있도록 UTL_MAIL 패키지를 제공하고 있다. 실제로 UTL_MAIL 패키지에 내장된 서브 프로그램은 3개 뿐이고, UTL_SMTP처럼 복잡하게 MIME을 설정하는 등의 작업을 하지 않고 필요한 정보만 매개변수로 넘기면 된다. 먼저 UTL_MAIL 패키지에 대해 살펴 보자.


UTL_MAIL 패키지의 서브 프로그램

UTL_MAIL 패키지는 총 3개의 프로시저를 제공하고 있다. UTL_SMTP 패키지에 비하면 서브 프로그램 수가 적긴 하지만 적다고 얕볼 필요는 없는 것이, 간단한 메일은 물론이고 첨부파일까지 전송할 수 있으며 UTL_SMTP에 비해 사용하기가 매우 쉽다. 그러 3개의 프로시저에 대해 자세히 살펴보자.


① SEND 프로시저

첨부파일이 없는 메일을 보내는 프로시저다. 구문과 주요 필드는 다음과 같다.

    UTL_MAIL.SEND (
      sender     IN VARCHAR2 CHARACTER SET ANY_CS,
      recipients IN VARCHAR2 CHARACTER SET ANY_CS,
      cc         IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
      bcc        IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
      subject    IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
      message    IN VARCHAR2 CHARACTER SET ANY_CS,
      mime_type  IN VARCHAR2 DEFAULT 'text/plain; charset=us-ascii',
      priority   IN PLS_INTEGER DEFAULT 3,
      replyto    IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL);

sender: 보내는 메일 주소

recipients: 받는 메일 주소

cc: 참조 메일 주소, 여러 개의 주소 사용가능하며 콤마(,)로 구분된다.

bcc: 비밀 참조 주소, 역시 콤마로 구분된다.

subject: 메일 제목

message: 메일 본문 내용

mime_type: MIME 타입, 디폴트 값은 ‘text/plain; charset=us-ascii’

priority: 메시지 우선순위, 1~5까지 값이 오며 1이 가장 높은 순위.

replyto: 답장 메일 주소

UTL_SMTP 패키지를 사용할 때는 HELO부터 시작해 WRITE_DATA 등을 사용해 처음부터 끝까지 SMTP와 MIME에 맞게 메일 내용을 작성해야 했지만, UTL_MAIL 패키지에서는 필요한 매개변수만 넘기면 프로시저가 알아서 메일을 전송해 준다. UTL_MAIL의 SEND 프로시저는 첨부파일이 없는 메일을 전송할 때 사용된다.

이 프로시저의 매개변수 중 priority는 해당 메일의 우선순위(긴급성)을 나타내는 지표로 1~5까지 값을 사용할 수 있고 1이 가장 우선순위가 높다. 메일을 사용하다 보면 가끔씩 메일 제목 앞 부분에 중요도를 나타내는 별표가 붙은 것을 볼 수 있는데 이것이 바로 priority를 나타낸다. 그리고 replyto는 답장(답신)메일 주소를 의미한다. priority와 replyto 모두 UTL_SMTP 패키지를 사용해 해당 기능을 구현할 수 있다.


② SEND_ATTACH_RAW 프로시저

파일을 첨부해 보내는 프로시저로 RAW 타입으로 첨부파일을 전달받는다.

    UTL_MAIL.SEND_ATTACH_RAW (
        sender        IN VARCHAR2 CHARACTER SET ANY_CS,
        recipients    IN VARCHAR2 CHARACTER SET ANY_CS,
        cc            IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
        bcc           IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
        subject       IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
        message       IN VARCHAR2 CHARACTER SET ANY_CS,
        mime_type     IN VARCHAR2 DEFAULT 'text/plain; charset=us-ascii',
        priority      IN PLS_INTEGER DEFAULT 3,
        attachment    IN RAW,
        att_inline   IN BOOLEAN DEFAULT TRUE,
        att_mime_type IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT'application/octet'
        att_filename  IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL
        replyto       IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL);

sender: 보내는 메일 주소

recipients: 받는 메일 주소

cc: 참조 메일 주소, 여러 개의 주소 사용 가능하며 콤마(,)로 구분된다.

bcc: 비밀 참조 주소, 역시 콤마로 구분된다.

subject: 메일 제목

message: 메일 본문 내용

mime_type: MIME 타입, 디폴트 값은 ‘text/plain; charset=us-ascii’

priority: 메시지 우선순위, 1~5까지 값이 오며 1이 가장 높은 순위.

attachment: 첨부파일(RAW 타입)

att_inline: 메일 본문에 한 줄로 첨부파일을 보여줄지 여부. 디폴트 값은 TRUE.

att_mime_type: 첨부파일의 MIME 타입. 디폴트 값은 ‘application/octet’.

att_filename: 첨부할 파일명

replyto: 답장 메일 주소


③ SEND_ATTACH_VARCHAR2 프로시저

파일을 첨부해 보내는 프로시저로 VARCHAR2 타입으로 첨부파일을 전달받는다.

    UTL_MAIL.SEND_ATTACH_VARCHAR2 (
        sender         IN VARCHAR2 CHARACTER SET ANY_CS,
        recipients     IN VARCHAR2 CHARACTER SET ANY_CS,
        cc             IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
        bcc            IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
        subject        IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
        message        IN VARCHAR2 CHARACTER SET ANY_CS,
        mime_type      IN VARCHAR2 DEFAULT 'text/plain; charset=us-ascii',
        priority       IN PLS_INTEGER DEFAULT 3,
        attachment     IN VARCHAR2 CHARACTER SET ANY_CS,
        att_inline     IN BOOLEAN DEFAULT TRUE,
        att_mime_type  IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT'text/plain; charset=us-ascii'
        att_filename   IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL
        replyto        IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL);

sender: 보내는 메일 주소

recipients: 받는 메일 주소

cc: 참조 메일 주소, 여러 개의 주소 사용 가능하며 콤마(,)로 구분된다.

bcc: 비밀 참조 주소, 역시 콤마로 구분된다.

subject: 메일 제목

message: 메일 본문 내용

mime_type: MIME 타입, 디폴트 값은 ‘text/plain; charset=us-ascii’

priority: 메시지 우선순위, 1~5까지 값이 오며 1이 가장 높은 순위.

attachment: 첨부파일(VARCHAR2 타입)

att_inline: 메일 본문에 한 줄로 첨부파일을 보여줄지 여부. 디폴트 값은 TRUE.

att_mime_type: 첨부파일의 MIME 타입. 디폴트 값은 ‘text/plain; charset=us-ascii’.

att_filename: 첨부할 파일명

replyto: 답장 메일 주소

SEND_ATTACH_RAW나 SEND_ATTACH_VARCHAR2는 첨부파일을 한 번에 1개만 보낼 수 있다. 반면 UTL_SMTP패키지를 이용하면 1개 이상의 파일을 첨부해 보낼 수 있다.


UTL_MAIL 패키지를 사용한 메일 전송

이제 UTL_MAIL 패키지를 사용해 메일을 보내야 하는데, 한 가지 문제가 있다. 보안상의 이유로 오라클 설치 시 UTL_MAIL 패키지는 만들어지지 않아, 수동으로 이 패키지를 생성해야 한다. 이 부분을 포함해 UTL_MAIL 패키지를 사용하기 전 준비해야 할 사항을 정리해 보자.


사전 준비사항

먼저 UTL_MAIL 패키지를 설치해야 하는데 오라클이 설치된 홈 디렉토리에 있는 설치 파일을 이용해야 한다. 설치과정을 순서대로 정리하면 다음과 같다.

sqlplus를 실행해 SYS 사용자로 로그인 한다.

sqlplus 상에서 오라클 홈 디렉토리 밑의 “RDBMS\ADMIN\utlmail.sql” 파일을 실행시킨다.

sqlplus 상에서 오라클 홈 디렉토리 밑의 “RDBMS\ADMIN\prvtmail.plb” 파일을 실행시킨다.

그림 18-12 UTL_MAIL 패키지 설치

필자의 PC에서 설치한 결과가 [그림 18-12]에 나와 있는데, 설치 파일이 위치한 경로는 오라클 설치 환경에 따라 다르므로 독자 여러분도 자신의 환경에 맞는 디렉토리에서 해당 파일을 찾아 설치하도록 한다. SYS 사용자로 설치했으므로 일반 사용자들이 UTL_MAIL 패키지를 사용할 수 있도록 실행 권한을 부여해야 한다. 사용자에게 직접 부여할 수도 있지만 다음과 같이 PUBLIC에 부여하면 모든 사용자가 이 패키지를 실행할 수 있다.

SQL>GRANT EXECUTE ON UTL_MAIL TO PUBLIC;
권한이 부여되었습니다.


마지막으로 SMTP_OUT_SERVER라는 시스템 파라미터 값을 설정해야 하는데, 이 매개변수는 UTL_MAIL 패키지가 사용할 SMTP 정보를 담는 역할을 한다. 다음과 같이 ALTER SYSTEM 명령어를 사용해 값을 설정하자. .

SQL>ALTER SYSTEM SET SMTP_OUT_SERVER ='localhost:25’ scope=both;
시스템이 변경되었습니다.


필자는 ‘localhost’라고 입력했지만 독자 여러분은 자신이 사용하는 SMTP 서버의 서버명과 포트 번호로 설정해야 한다. 메일을 보내기 위한 사전 준비 작업이 모두 끝났다. 이제 메일을 전송해 보자.


간단한 메일 전송

첨부파일이 없는 메일은 UTL_MAIL.SEND 프로시저를 사용해 보낼 수 있다.

입력

    BEGIN
           UTL_MAIL.SEND (
           sender     => 'charieh@hong.com',
           recipients => 'charieh@hong.com',
           cc         => null,
           bcc        => null,
           subject    => 'UTL_MAIL 전송 테스트',
           message    => 'UTL_MAIL을 이용해 전송하는 메일입니다',
           mime_type  => 'text/plain; charset=euc-kr',
           priority   => 3,
           replyto    => 'charieh@hong.com');

    EXCEPTION WHEN OTHERS THEN
       DBMS_OUTPUT.PUT_LINE(sqlerrm);

    END;

결과

    익명 블록이 완료되었습니다.

오류 메시지가 없으니 제대로 전송되었을 것이다. Outlook을 열고 확인해 보자.

그림 18-13 UTL_MAIL 패키지로 보낸 메일

UTL_SMTP와 마찬가지로 일반 텍스트가 아닌 HTML 형식의 메일도 보낼 수 있다.

입력

    DECLARE

      vv_html  VARCHAR2(300);
    BEGIN

      vv_html := '<HEAD>
       <TITLE>HTML 테스트</TITLE>
     </HEAD>
     <BDOY>
        <p>이 메일은 <b>HTML</b> <i>버전</i> 으로 </p>
        <p> <strong>UTL_MAIL</strong> 패키지를 사용해 보낸 메일입니다. </p>
     </BODY>
    </HTML>';

       UTL_MAIL.SEND (
           sender     => 'charieh@hong.com',
           recipients => 'charieh@hong.com',
           cc         => null,
           bcc        => null,
           subject    => 'UTL_MAIL 전송 테스트2',
           message    => vv_html,
           mime_type  => 'text/html; charset=euc-kr',
           priority   => 1,
           replyto    => 'charieh@hong.com');

    EXCEPTION WHEN OTHERS THEN
       DBMS_OUTPUT.PUT_LINE(sqlerrm);

    END;

결과

    익명 블록이 완료되었습니다.
그림 18-14 UTL_MAIL 패키지로 보낸 HTML 형식의 메일

HTML 형식의 메일을 보내므로 MIME 타입을 ‘text/html’로 바꾸었다. 또한 priority 매개변수 값을 1로 설정했더니 [그림 18-14]에서 볼 수 있듯이 “중요도가 높음인 메시지를 보냈습니다”라는 메시지가 나타났다. 사용 편의성 측면에서 볼 때 UTL_MAIL이 UTL_SMTP 보다는 훨씬 더 사용하기 쉽다는 점을 느낄 수 있을 것이다.


첨부파일 전송

이번에는 파일을 첨부해 메일을 보내 보자. UTL_SMTP 예제에서 사용했던 파일과 파일을 읽어 RAW 타입으로 반환하는 fn_get_raw_file 함수를 재사용할 것이다.

입력

    DECLARE
      vv_directory  VARCHAR2(30) := 'SMTP_FILE'; --디렉토리명
      vv_filename   VARCHAR2(30) := 'ch18_txt_file.txt';  -- 파일명
      vf_file_buff  RAW(32767);   -- 실제 파일을 담을 RAW타입 변수
      vv_html  VARCHAR2(300);

    BEGIN

      vv_html := '<HEAD>
       <TITLE>HTML 테스트</TITLE>
     </HEAD>
     <BDOY>
        <p>이 메일은 <b>HTML</b> <i>버전</i> 으로 </p>
        <p> <strong>UTL_MAIL</strong> 패키지를 사용해 보낸 메일입니다. </p>
     </BODY>
    </HTML>';

      -- 파일 읽어오기
      vf_file_buff := fn_get_raw_file(vv_directory, vv_filename);

      UTL_MAIL.SEND_ATTACH_RAW (
          sender     => 'charieh@hong.com',
          recipients => 'charieh@hong.com',
          cc         => null,
          bcc        => null,
          subject    => 'UTL_MAIL 파일전송 테스트',
          message    => vv_html,
          mime_type  => 'text/html; charset=euc-kr',
          priority   => 1,
          attachment => vf_file_buff,
          att_inline => TRUE,
          att_mime_type => 'application/octet',
          att_filename  => vv_filename,
          replyto    => 'charieh@hong.com');

    EXCEPTION WHEN OTHERS THEN
       DBMS_OUTPUT.PUT_LINE(sqlerrm);

    END;

결과

    익명 블록이 완료되었습니다.

오류 없이 실행되었다. 메일을 확인해 보자.

그림 18-15 UTL_MAIL 패키지로 보낸 첨부파일 메일

제대로 전송되었다. 첨부파일을 포함한 메일 전송 역시 UTL_MAIL 패키지를 사용하는 것이 훨씬 쉽다는 점을 느낄 수 있을 것이다. 하지만 UTL_MAIL 패키지의 SEND_ATTACH_RAW 프로시저는 하나의 메일에 1개의 파일만 첨부할 수 있다는 단점이 있다. 이에 반해 UTL_SMTP는 MIME 속성을 추가해 하나의 메일에 여러 개의 파일을 첨부해 전송할 수 있다.

UTL_SMTP는 사용법이 복잡하지만 다양한 기능을 구현할 수 있고, UTL_MAIL은 사용법은 간편하지만 첨부파일에 대한 제약이 존재한다. UTL_SMTP를 사용할 것인지 UTL_MAIL을 사용할 것인지에 대한 판단은 각자의 몫이므로, 두 패키지의 장점과 단점을 파악해 자신의 시스템에 적합한 것을 골라 사용하자.


핵심정리

  1 UTL_SMTP와 UTL_MAIL 패키지를 사용해 오라클 DB 상에서도 이메일을 보낼 수 있다.

  2 UTL_SMTP는 SMTP 명령어와 거의 1 대 1로 대응되는 함수와 프로시저를 제공한다.

  3 UTL_SMTP와 UTL_MAIL을 사용하기 전에 SMTP와 MIME에 대한 내용을 먼저 숙지하자.

  4 UTL_SMTP를 사용해 일반 텍스트 메일, HTML로 작성된 메일, 파일이 첨부된 메일을 전송할 수 있다.

  5 여러 형식으로 구성된 메일을 보낼 때는 Content-Type을 ‘multipart/mixed’로 설정하고, 각각의 형식에 대한 내용 작성 시 다시 그 형식에 맞는 Content-Type 값을 설정해 줘야 한다. 또한 각 형식은 boundary 값을 명시해 구분해 줘야 한다.

  6 오라클을 설치할 때 UTL_MAIL은 설치되지 않으므로 별도의 설치 작업이 필요하며, SMTP_OUT_SERVER 시스템 매개변수 값을 사용하려는 SMTP 서버로 설정하고 사용자들에게 UTL_MAIL 패키지의 실행 권한을 줘야 한다.

  7 UTL_MAIL 패키지는 사용하기 쉽다는 장점이 있지만 하나의 메일에 첨부할 수 있는 파일의 수가 1개로 제한되어 있다.


펌 : https://thebook.io/006696/part04/ch18/03/