在專用 Exadata 基礎架構上的自治式 AI 資料庫傳送電子郵件

您可以使用電子郵件傳遞服務或 DBMS_CLOUD_NOTIFICATION 程序,在專用 Exadata 基礎架構上的自治式 AI 資料庫上傳送電子郵件。本文將說明如何使用這兩種選項傳送電子郵件。

在自治式 AI 資料庫上以電子郵件傳遞服務傳送電子郵件

描述在專用 Exadata 基礎架構上的自治式 AI 資料庫上使用 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 伺服器及其與自治式 AI 資料庫租用戶的連線,並提供 SMTP 連線端點資訊。

  2. 產生 OCI 使用者之電子郵件傳遞的 SMTP 證明資料。

    當您傳送電子郵件時,UTL_SMTP 會使用證明資料與 Email Delivery 伺服器進行認證。請參閱針對使用者產生 SMTP 憑證以瞭解詳細資訊。

  3. 建立電子郵件傳遞的核准寄件者。

    如果您使用 OCI Email Delivery Service,請完成此步驟以作為 UTL_SMTP.MAIL 之「寄件者」的所有電子郵件地址。如需詳細資訊,請參閱管理核准的寄件者

  4. 允許藉由附加存取控制項目 (ACE) 來對具有管理員角色的使用者存取 SMTP 主機。

    若要使用安全 SMTP,除了 SMTP 主機存取之外,您還必須設定具備「存取控制項目 (ACE)」的資料庫使用者才能存取公事包。若要使用 OCI Email Delivery Service 進行安全 SMTP 存取,必須使用 PLAIN、CRAM-MD5、LOGIN 等簡單認證和安全層 (SASL) 協定認證 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 26ai PL/SQL Packages and Types Reference ,瞭解進一步的參照。

請參閱使用資料庫 PL/SQL 套裝程式注意事項,瞭解將 UTL_SMTP 與自治式 AI 資料庫搭配使用的詳細資訊。

SMTP 傳送電子郵件範例代碼

顯示在自治式 AI 資料庫上以 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;
/

從自治式 AI 資料庫以電子郵件傳送訊息

套用至:適用 僅限 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

    • 微信:eu-frankfurt-1.oci.oraclecloud.com

    請參閱設定 SMTP 連線瞭解詳細資訊。

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

    請參閱針對使用者產生 SMTP 憑證以瞭解詳細資訊。

  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 主機名稱。

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

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

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

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

    請參閱 SEND_MESSAGE 程序以瞭解詳細資訊。

從自治式 AI 資料庫以電子郵件傳送查詢結果

套用至:適用 僅限 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

    • 微信:eu-frankfurt-1.oci.oraclecloud.com

    請參閱設定 SMTP 連線瞭解詳細資訊。

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

    請參閱針對使用者產生 SMTP 憑證以瞭解詳細資訊。

  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、主旨、收件者、CC 或密件副本的收件者、訊息、資料類型,以及 String 值中的標題。

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

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

    • subject :指定電子郵件的主旨。大小上限為 100 個字元。

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

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

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

    • message :指定訊息文字。

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

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

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

    請參閱 SEND_DATA 程序以瞭解詳細資訊。

相關內容

使用資料庫 PL/SQL 套裝程式注意事項