Autonomous Database on Dedicated Exadata Infrastructure에서 전자메일 전송

전자메일 전송 서비스 또는 DBMS_CLOUD_NOTIFICATION 절차를 사용하여 Autonomous Database on Dedicated Exadata Infrastructure에서 이메일을 보낼 수 있습니다. 이 문서에서는 두 옵션을 모두 사용하여 전자메일을 전송하는 방법에 대해 설명합니다.

Autonomous Database에서 이메일 딜리버리 서비스로 이메일 전송

전용 Exadata 인프라의 Autonomous Database에서 UTL_SMTP를 사용하여 전자메일을 전송하는 단계에 대해 설명합니다.

UTL_SMTP를 사용하여 전자메일을 보내려면 다음을 수행합니다.
  1. 전자메일 전달을 위한 SMTP 접속 끝점을 식별합니다.
    1. Oracle Cloud Infrastructure(OCI) Email Delivery 서비스를 사용하려면 Email Delivery에 대한 연결 엔드포인트를 식별하십시오. 예를 들어, 미국 서부(피닉스)가 전송 지역인 경우 smtp.email.us-phoenix-1.oci.oraclecloud.com를 선택합니다. 자세한 내용은 SMTP 연결 구성을 참조하십시오.

      주:

      현재 지역에서 이메일 딜리버리를 사용할 수 없는 경우 추가 Oracle Cloud Infrastructure 지역을 구독해야 할 수 있습니다.
    2. 타사 SMTP 서버를 사용하려면 네트워크 관리자가 SMTP 서버와 Autonomous Database 테넌트에 대한 접속을 구성하고 SMTP 접속 끝점 정보를 제공해야 합니다.
  2. OCI 사용자의 전자메일 전달에 대한 SMTP 인증서를 생성합니다.
    UTL_SMTP는 전자메일을 보낼 때 전자메일 전송 서버에서 인증을 위해 인증서를 사용합니다. 자세한 내용은 Generate SMTP Credentials for a User을 참조하십시오.
  3. 전자메일 전달에 대해 승인된 발신기를 생성합니다.
    OCI Email Delivery Service를 사용하는 경우 UTL_SMTP.MAIL에서 "보낸 사람"으로 사용하는 모든 전자메일 주소에 대해 이 단계를 완료합니다. 자세한 내용은 승인된 발신자 관리를 참조하십시오.
  4. ACE(액세스 제어 항목)를 추가하여 관리자 역할의 사용자에 대해 SMTP 호스트 액세스를 허용합니다.
    보안 SMTP를 사용하려면 SMTP 호스트 액세스 외에도 전자 지갑 액세스를 위해 ACE(액세스 제어 항목)를 사용하여 데이터베이스 사용자를 설정해야 합니다. OCI Email Delivery Service를 사용한 안전한 SMTP 액세스의 경우 PLAIN, CRAM-MD5, LOGIN과 같은 SASL(Simple Authentication and Security Layer) 프로토콜을 사용하여 Oracle Cloud Infrastructure 계정을 인증해야 합니다. 예를 들어, SMTP Send Email Sample Code의 샘플 코드를 참조하십시오.
  5. UTL_MAIL를 사용하여 전자 메일을 보내는 PL/SQL 코드를 작성합니다.

    참고:

    전자 우편 보내기 절차를 직접 개발하는 경우 코드가 SMTP 전자 우편 보내기 샘플 코드에 따라 변경되는지 확인합니다.
  6. 5단계에서 생성한 PL/SQL 프로시저를 사용하여 테스트 전자 메일을 보냅니다.
    예:
    execute send_mail('taylor@example.com', 'Email from Oracle Autonomous Database', 'Sent using UTL_SMTP');

See UTL_SMTP in Oracle Database 19c PL/SQL Packages and Types Reference or Oracle Database 23ai PL/SQL Packages and Types Reference for further reference.

UTL_SMTPAutonomous Database와 함께 사용하는 방법에 대한 자세한 내용은 Notes on the Use of Database PL/SQL Packages를 참조하십시오.

SMTP 전자메일 전송 샘플 코드

Autonomous Database에서 UTL_SMTP로 이메일을 보내기 위한 샘플 코드를 보여줍니다.

샘플 코드

-- As ADMIN user, set up ACE to access SMTP host
connect admin/[password]@[ADBD-host]/[pdbname]_tp.atp.oraclecloud.com
begin
  DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE (
    host       => '[SMTP_Server_address]',
    lower_port => 25,
    upper_port => 25,
    ace        => xs$ace_type(
                    privilege_list => xs$name_list('smtp'),
                    principal_name => '[database_user]',
                    principal_type => xs_acl.ptype_db));
end;

/
-- If using secure SMTP, set up ACE to wallet for certificate-based secure (TLS) email
declare
  m_wallet_path VARCHAR2(512);
begin
  select property_value into m_wallet_path
    from database_properties
   where property_name like '%SSL%';
  m_wallet_path := 'file:' || m_wallet_path;
  DBMS_NETWORK_ACL_ADMIN.APPEND_WALLET_ACE (
    wallet_path => m_wallet_path,
    ace         => xs$ace_type(
                     privilege_list => xs$name_list('use_client_certificates'),
                     principal_name => '[database_user]',
                     principal_type => xs_acl.ptype_db));
end;
/
-- As ADMIN or regular database user with privileges set up above, use UTL_SMTP to send email
connect [database_user]/[password]@[ADBD-host]/[pdbname]_tp.atp.oraclecloud.com

-- Example of normal (non-secure) email
DECLARE
  c         UTL_SMTP.CONNECTION;
  reply     UTL_SMTP.REPLY;
  host      varchar2(64) := '[SMTP_Server_address]',
  port      pls_integer := 25;
  sender    varchar2(64) := '[sender-address@domain.com]';
  recipient varchar2(64) := '[recipient-address@domain.com]';
BEGIN
  c := UTL_SMTP.OPEN_CONNECTION (host, port);
  if (reply.CODE != 220) then
    raise_application_error(-20000,'UTL_SMTP.CONNECTION: '
      || reply.CODE || ' - ' || reply.TEXT);
  end if;

  UTL_SMTP.HELO(c, host);
  UTL_SMTP.MAIL(c, sender);
  UTL_SMTP.RCPT(c, recipient);
  UTL_SMTP.OPEN_DATA(c);
  UTL_SMTP.WRITE_DATA(c,'From:[Sender]  <' || sender || '>'    || UTL_TCP.CRLF);
  UTL_SMTP.WRITE_DATA(c,'To:[Recipient] <' || recipient || '>' || UTL_TCP.CRLF);
  UTL_SMTP.WRITE_DATA(c,'Subject: Email from UTL_SMTP App' || UTL_TCP.CRLF);
  UTL_SMTP.WRITE_DATA(c,'Mail Content');
  UTL_SMTP.CLOSE_DATA(c);
  dbms_output.put_line('Close Data: ' || reply.code);
  UTL_SMTP.QUIT(c);
END;
/

-- Example of secure email using OCI Mail Server as the SMTP server
DECLARE
  m_wallet_path VARCHAR2(256);
  c             UTL_SMTP.CONNECTION;
  reply         UTL_SMTP.REPLY;
  host          varchar2(64) := 'smtp.email.[region].oci.oraclecloud.com';
  port          pls_integer := 25;
  sender        varchar2(64) := '[sender-address@domain.com]';
  recipient     varchar2(64) := '[recipient-address@domain.com]';
BEGIN
  select property_value into m_wallet_path
    from database_properties
   where property_name like '%SSL%';
  m_wallet_path := 'file:' || m_wallet_path;

  -- secure connection with SSL/TLS made *before* SMTP communication
  -- use hostname matched against CN or SMTP server's certificate
  reply := UTL_SMTP.OPEN_CONNECTION (
             host                          => host,
             port                          => port,
             c                             => c,
             wallet_path                   => m_wallet_path,
             wallet_password               => NULL,
             secure_connection_before_smtp => FALSE,
             secure_host                   => NULL);
  if (reply.CODE != 220) then
      raise_application_error(-20000,'UTL_SMTP.OPEN_CONNECTION: '
        || reply.CODE ||' - ' || reply.TEXT);
  end if;

  UTL_SMTP.STARTTLS(c);
 
  -- username is the 'SMTP credential' for the user's email address
  -- obtained from OCI Identity -> Users -> email address.
  -- Scheme refers to SASL (Simple Authentication and Security Layer)
  -- Authentication Schemes for SMTP protocol - PLAIN, CRAM-MD5, LOGIN
  -- https://docs.oracle.com/en-us/iaas/Content/Email/Concepts/overview.htm
  UTL_SMTP.AUTH(
     c        => c,
     username => '[ocid1.user.verylongaddresscreatedinOCIforuseraddress.com]',
     password => '[password-provided-from-create]',
     schemes  => 'PLAIN');

  UTL_SMTP.HELO(c, host);
  UTL_SMTP.MAIL(c, sender);
  UTL_SMTP.RCPT(c, recipient);
  UTL_SMTP.OPEN_DATA(c);
  UTL_SMTP.WRITE_DATA(c, 'From: Sender <' || sender || '>' || UTL_TCP.CRLF);
  UTL_SMTP.WRITE_DATA(c, 'To: Recipient <' || recipient || '>' || UTL_TCP.CRLF);
  UTL_SMTP.WRITE_DATA(c, 'Subject: Email from UTL_SMTP App' || UTL_TCP.CRLF);
  UTL_SMTP.WRITE_DATA(c, 'Mail Content');
  UTL_SMTP.WRITE_DATA(c, 'Sender is a domain-owned approved sender in OCI Mail Service');
  UTL_SMTP.CLOSE_DATA(c);
  dbms_output.put_line('Close Data: ' || reply.code);
  UTL_SMTP.QUIT(c);
END;
/

Autonomous Database에서 메시지를 이메일로 전송

적용 대상: 적용 가능 Oracle Public Cloud 전용

DBMS_CLOUD_NOTIFICATION를 사용하여 메시지를 전자 메일로 보낼 수 있습니다.
  1. 전자메일 전송에 대한 SMTP 연결 엔드포인트를 식별합니다. 현재 지역에서 이메일 딜리버리를 사용할 수 없는 경우 추가 Oracle Cloud Infrastructure 지역을 구독해야 할 수도 있습니다.

    예를 들어, SMTP 연결 끝점에 대해 다음 중 하나를 선택합니다.

    • smtp.us-phoenix-1.oraclecloud.com
    • smtp.us-ashburn-1.oraclecloud.com
    • smtp.email.uk-london-1.oci.oraclecloud.com
    • smtp.email.eu-frankfurt-1.oci.oraclecloud.com

    자세한 내용은 Configure SMTP Connection을 참조하십시오.

  2. 전자메일 전송에 대한 SMTP 인증서를 생성합니다. UTL_SMTP는 전자메일을 보낼 때 전자메일 전송 서버에서 인증을 위해 인증서를 사용합니다.

    자세한 내용은 Generate SMTP Credentials for a User을 참조하십시오.

  3. 전자메일 전송에 대해 승인된 발신자를 생성합니다. UTL_SMTP.MAIL에서 "From"로 사용하는 모든 전자메일 주소에 대해 이 단계를 완료합니다.

    자세한 내용은 승인된 발신자 관리를 참조하십시오.

  4. ACE(액세스 제어 항목)를 추가하여 ADMIN 사용자에 대한 SMTP 액세스를 허용합니다.

    예:

    BEGIN
      -- Allow SMTP access for user ADMIN
      DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
        host => ’www.us.example.com’,
        lower_port => 587,
        upper_port => 587,
        ace => xs$ace_type(privilege_list => xs$name_list('SMTP'),
                           principal_name => 'ADMIN',
                           principal_type => xs_acl.ptype_db));
    END;
    /
  5. 인증서 객체를 생성하고 DBMS_CLOUD_NOTIFICATION.SEND_MESSAGE를 사용하여 메시지를 전자 메일로 보냅니다.
    BEGIN
       DBMS_CLOUD.CREATE_CREDENTIAL(
            credential_name => 'EMAIL_CRED',
            username        => 'username',
            password        => 'password'
       );
       END;
    /
    BEGIN
       DBMS_CLOUD_NOTIFICATION.SEND_MESSAGE(
            provider        => 'email',
            credential_name => 'EMAIL_CRED',
            message         => 'Subject content',
            params          => json_object('recipient' value  'mark@example.com, suresh@example.com',
                                           'to_cc'  value 'nicole@example.com, jordan@example.com',
                                           'to_bcc' value 'manisha@example.com',
                                           'subject' value 'Test subject',
                                           'smtp_host' value 'smtp.email.example.com',
                                           'sender'    value  'approver_sender@example.com' )
       );
       END;
    /

    params 매개변수를 사용하여 string 값에 CC 또는 숨은 참조의 발신자, smtp_host, 제목, 수신자 및 수신자를 지정합니다.

    • 발신자: 3단계에서 승인된 발신자의 전자메일 ID를 지정합니다.

    • smtp_host: 2단계에서 SMTP 호스트 이름을 지정합니다.

    • 제목: 전자메일 제목을 지정합니다.

    • recipient: 수신자의 전자 메일 ID를 지정합니다. 수신자가 여러 명인 경우 전자메일 ID 사이에 쉼표를 사용합니다.

    • to_cc: 전자 메일의 참조를 수신하는 전자 메일 ID를 지정합니다. 참조 수신자가 여러 명인 경우 전자메일 ID 사이에 쉼표를 사용합니다.

    • to_bcc: 전자 메일의 숨은 참조를 수신하는 전자 메일 ID를 지정합니다. 숨은 참조 수신자가 여러 명인 경우 전자메일 ID 사이에 쉼표를 사용합니다.

    자세한 내용은 SEND_MESSAGE Procedure를 참조하십시오.

Autonomous Database에서 쿼리 결과를 이메일로 전송

적용 대상: 적용 가능 Oracle Public Cloud 전용

DBMS_CLOUD_NOTIFICATION 패키지를 사용하여 질의 결과를 전자 메일로 보낼 수 있습니다.

DBMS_CLOUD_NOTIFICATION을 사용하여 메일을 보내려면 다음을 수행합니다.

  1. 전자메일 전송에 대한 SMTP 연결 엔드포인트를 식별합니다. 현재 지역에서 이메일 딜리버리를 사용할 수 없는 경우 추가 Oracle Cloud Infrastructure 지역을 구독해야 할 수도 있습니다.

    예를 들어, SMTP 연결 끝점에 대해 다음 중 하나를 선택합니다.

    • smtp.us-phoenix-1.oraclecloud.com
    • smtp.us-ashburn-1.oraclecloud.com
    • smtp.email.uk-london-1.oci.oraclecloud.com
    • smtp.email.eu-frankfurt-1.oci.oraclecloud.com

    자세한 내용은 Configure SMTP Connection을 참조하십시오.

  2. 전자메일 전송에 대한 SMTP 인증서를 생성합니다. UTL_SMTP는 전자메일을 보낼 때 전자메일 전송 서버에서 인증을 위해 인증서를 사용합니다.

    자세한 내용은 Generate SMTP Credentials for a User을 참조하십시오.

  3. 전자메일 전송에 대해 승인된 발신자를 생성합니다. UTL_SMTP.MAIL에서 "From"로 사용하는 모든 전자메일 주소에 대해 이 단계를 완료합니다.

    자세한 내용은 승인된 발신자 관리를 참조하십시오.

  4. ACE(액세스 제어 항목)를 추가하여 ADMIN 사용자에 대한 SMTP 액세스를 허용합니다.

    예:

    BEGIN
      -- Allow SMTP access for user ADMIN
      DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
        host => ’www.us.example.com’,
        lower_port => 587,
        upper_port => 587,
        ace => xs$ace_type(privilege_list => xs$name_list('SMTP'),
                           principal_name => 'ADMIN',
                           principal_type => xs_acl.ptype_db));
    END;
    /
  5. 인증서 객체를 생성하고 DBMS_CLOUD_NOTIFICATION.SEND_DATA를 사용하여 질의 출력을 전자메일로 전송합니다.
    BEGIN
       DBMS_CLOUD.CREATE_CREDENTIAL(
            credential_name => 'EMAIL_CRED',
            username        => 'username',
            password        => 'password'
       );
       END;
    /
    BEGIN
       DBMS_CLOUD_NOTIFICATION.SEND_DATA(
            provider        => 'email',
            credential_name => 'EMAIL_CRED',
            query           => 'SELECT tablespace_name FROM dba_tablespaces',
            params          => json_object('recipient' value  'mark@example.com, suresh@example.com',
                                           'to_cc'  value 'nicole@example.com1, jordan@example.com',
                                           'to_bcc' value 'manisha@example.com',
                                           'subject' value 'Test subject',
                                           'type' value 'json',
                                           'title' value 'mytitle',
                                           'message' value 'This is the message',
                                           'smtp_host' value 'smtp.email.example.com',
                                           'sender'    value  'approver_sender@example.com' )
       );
       END;
    /
    params 매개변수를 사용하여 발신자, smtp_host, 제목, 수신자, 참조 또는 숨은 참조 수신자, 메시지, 데이터 유형 및 제목을 String 값으로 지정합니다.
    • 발신자: 3단계에서 승인된 발신자의 전자메일 ID를 지정합니다.

    • smtp_host: 2단계에서 SMTP 호스트 이름을 지정합니다.

    • 제목: 전자메일 제목을 지정합니다. 최대 크기는 100자입니다.

    • recipient: 수신자의 전자 메일 ID를 지정합니다. 수신자가 여러 명인 경우 전자메일 ID 사이에 쉼표를 사용합니다.

    • to_cc: 전자 메일의 참조를 수신하는 전자 메일 ID를 지정합니다. 참조 수신자가 여러 명인 경우 전자메일 ID 사이에 쉼표를 사용합니다.

    • to_bcc: 전자 메일의 숨은 참조를 수신하는 전자 메일 ID를 지정합니다. 숨은 참조 수신자가 여러 명인 경우 전자메일 ID 사이에 쉼표를 사용합니다.

    • message: 메시지 텍스트를 지정합니다.

    • type: 출력 형식을 CSV 또는 JSON으로 지정합니다.

    • title: SQL 출력의 첨부 제목을 지정합니다. 파일 이름을 생성하는 데 사용되므로 제목에는 문자, 숫자, 밑줄, 하이픈 또는 점만 해당 값에 문자로 포함되어야 합니다.

    메일 통지에 대해 DBMS_CLOUD_NOTIFICATION.SEND_DATA에 사용할 최대 메시지 크기는 32k바이트입니다.

    자세한 내용은 SEND_DATA Procedure를 참조하십시오.