在 Dedicated Exadata Infrastructure 上的 Autonomous Database 傳送電子郵件

您可以使用電子郵件傳遞服務或 DBMS_CLOUD_NOTIFICATION 程序,在 Autonomous Database on Dedicated Exadata Infrastructure 上傳送電子郵件。本文將說明如何使用這兩個選項傳送電子郵件。

Autonomous Database 上透過電子郵件傳遞服務傳送電子郵件

描述在 Autonomous Database on Dedicated Exadata Infrastructure 上使用 UTL_SMTP 傳送電子郵件的步驟。

使用 UTL_SMTP 傳送電子郵件:
  1. 識別電子郵件傳遞的 SMTP 連線端點。
    1. 如果您想要使用 Oracle Cloud Infrastructure (OCI) Email Delivery Service,請識別 Email Delivery 的連線端點。例如,當 US West (Phoenix) 是傳送區域時,請選取 smtp.email.us-phoenix-1.oci.oraclecloud.com。如需詳細資訊,請參閱設定 SMTP 連線

      附註:

      如果您目前的區域無法使用電子郵件傳遞,則可能需要訂閱額外的 Oracle Cloud Infrastructure 區域。
    2. 如果要使用第三方 SMTP 伺服器,您的網路管理員必須設定 SMTP 伺服器及其與 Autonomous Database 租用戶的連線,並提供 SMTP 連線端點資訊。
  2. 為 OCI 使用者產生電子郵件傳遞的 SMTP 證明資料。
    當您傳送電子郵件時,UTL_SMTP 會使用證明資料與 Email Delivery 伺服器進行認證。如需詳細資訊,請參閱 Generate SMTP Credentials for a User
  3. 建立電子郵件傳遞的核准寄件者。
    如果您使用 OCI 電子郵件傳遞服務,請完成此步驟,以 UTL_SMTP.MAIL 作為「寄件者」的所有電子郵件地址。請參閱管理核准的寄件者瞭解詳細資訊。
  4. 附加「存取控制項目 (ACE)」以允許具有管理員角色之使用者的 SMTP 主機存取。
    若要使用安全 SMTP,除了 SMTP 主機存取之外,還必須設定具有「存取控制項目 (ACE)」的資料庫使用者來存取公事包。若要使用 OCI 電子郵件傳遞服務進行安全 SMTP 存取,必須使用簡單認證和安全層 (SASL) 協定 (例如 PLAIN、CRAM-MD5、LOGIN) 來認證 Oracle Cloud Infrastructure 帳戶。例如,請參閱 SMTP 傳送電子郵件範例程式碼中的範例程式碼。
  5. 撰寫 PL/SQL 程式碼以使用 UTL_MAIL 傳送電子郵件。

    秘訣:

    如果您自行開發傳送電子郵件程序,請確定您的程式碼是根據 SMTP 傳送電子郵件範例程式碼
  6. 使用您在步驟 5 中建立的 PL/SQL 程序傳送測試電子郵件。
    舉例而言:
    execute send_mail('taylor@example.com', 'Email from Oracle Autonomous Database', 'Sent using UTL_SMTP');

請參閱 Oracle Database 19c PL/SQL Packages and Types Reference 中的 UTL_SMTPOracle Database 23ai PL/SQL Packages and Types Reference ,瞭解進一步參照。

請參閱使用資料庫 PL/SQL 套裝程式注意事項,瞭解有關將 UTL_SMTPAutonomous Database 搭配使用的詳細資訊。

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 連線端點。如果您目前的區域不提供 Email Delivery,則可能需要訂閱額外的 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

    如需詳細資訊,請參閱設定 SMTP 連線

  2. 產生電子郵件傳遞的 SMTP 證明資料。當您傳送電子郵件時,UTL_SMTP 會使用證明資料與 Email Delivery 伺服器進行認證。

    如需詳細資訊,請參閱 Generate SMTP Credentials for a User

  3. 為 Email Delivery 建立核准發送方。針對您使用 UTL_SMTP.MAIL 作為 "From" 的所有電子郵件地址,完成此步驟。

    請參閱管理核准的寄件者瞭解詳細資訊。

  4. 允許 ADMIN 使用者透過附加「存取控制項目 (ACE)」以存取 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 或 BCC 的寄件者、smtp_host、主旨、收件者及收件者。

    • 寄件者:從步驟 3 指定核准寄件者的電子郵件 ID。

    • smtp_host :從步驟 2 指定 SMTP 主機名稱。

    • 主旨:指定電子郵件的主題。

    • 收件者:指定收件者的電子郵件 ID。有多個收件者時,在電子郵件 ID 之間使用逗號。

    • to_cc :指定接收電子郵件副本的電子郵件 ID。有多個副本收件者時,在電子郵件 ID 之間使用逗號。

    • to_bcc :指定接收電子郵件密件副本的電子郵件 ID。有多個密件副本收件者時,請使用電子郵件 ID 之間的逗號。

    如需詳細資訊,請參閱SEND_MESSAGE 程序

Autonomous Database 以電子郵件傳送查詢結果

適用於:適用 僅限 Oracle Public Cloud

您可以使用 DBMS_CLOUD_NOTIFICATION 套裝軟體將查詢結果以電子郵件傳送。

若要使用 DBMS_CLOUD_NOTIFICATION 傳送郵件,請執行下列動作:

  1. 識別電子郵件傳遞的 SMTP 連線端點。如果您目前的區域不提供 Email Delivery,則可能需要訂閱額外的 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

    如需詳細資訊,請參閱設定 SMTP 連線

  2. 產生電子郵件傳遞的 SMTP 證明資料。當您傳送電子郵件時,UTL_SMTP 會使用證明資料與 Email Delivery 伺服器進行認證。

    如需詳細資訊,請參閱 Generate SMTP Credentials for a User

  3. 為 Email Delivery 建立核准發送方。針對您使用 UTL_SMTP.MAIL 作為 "From" 的所有電子郵件地址,完成此步驟。

    請參閱管理核准的寄件者瞭解詳細資訊。

  4. 允許 ADMIN 使用者透過附加「存取控制項目 (ACE)」以存取 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 個字元。

    • 收件者:這會指定收件者的電子郵件 ID。有多個收件者時,在電子郵件 ID 之間使用逗號。

    • to_cc :指定接收電子郵件副本的電子郵件 ID。有多個副本收件者時,在電子郵件 ID 之間使用逗號。

    • to_bcc :指定接收電子郵件密件副本的電子郵件 ID。有多個密件副本收件者時,請使用電子郵件 ID 之間的逗號。

    • 訊息:指定訊息文字。

    • type :將輸出格式指定為 CSV 或 JSON。

    • title :指定 SQL 輸出之附件的標題。標題只能包含字母、數字、底線、連字號或點作為值中的字元,因為用來產生檔案名稱。

    DBMS_CLOUD_NOTIFICATION.SEND_DATA 搭配使用的郵件通知訊息大小上限為 32k 個位元組。

    如需詳細資訊,請參閱SEND_DATA 程序