Invia e-mail su Autonomous Database on Dedicated Exadata Infrastructure

È possibile inviare messaggi di posta elettronica su Autonomous Database su un'infrastruttura Exadata dedicata utilizzando il servizio di consegna tramite posta elettronica o le procedure DBMS_CLOUD_NOTIFICATION. In questo articolo viene descritto come inviare e-mail utilizzando entrambe queste opzioni.

Invia e-mail con servizio di consegna tramite e-mail su Autonomous Database

Descrive i passi per inviare messaggi di posta elettronica utilizzando UTL_SMTP su Autonomous Database su un'infrastruttura Exadata dedicata.

Per inviare e-mail utilizzando UTL_SMTP:
  1. Identificare l'endpoint di connessione SMTP per il servizio di consegna tramite e-mail.
    1. Se si desidera utilizzare Oracle Cloud Infrastructure (OCI) Email Delivery Service, identificare l'endpoint di connessione per il servizio di consegna tramite e-mail. Ad esempio, selezionare smtp.email.us-phoenix-1.oci.oraclecloud.com quando US West (Phoenix) è l'area di invio. Per ulteriori informazioni, vedere Configura connessione SMTP.

      Nota

      Potrebbe essere necessario effettuare la sottoscrizione a ulteriori aree Oracle Cloud Infrastructure se il servizio di consegna tramite e-mail non è disponibile nell'area corrente.
    2. Se si desidera utilizzare un server SMTP di terze parti, l'amministratore di rete deve configurare il server SMTP e la relativa connettività con il tenant di Autonomous Database e fornire le informazioni sull'endpoint della connessione SMTP.
  2. Generare le credenziali SMTP per il servizio di consegna tramite posta elettronica per l'utente OCI.
    UTL_SMTP utilizza le credenziali per eseguire l'autenticazione con i server di consegna tramite e-mail quando si invia un'e-mail. Per ulteriori informazioni, vedere Generare le credenziali SMTP per un utente.
  3. Crea mittenti approvati per il servizio di consegna tramite e-mail.
    Se si utilizza il servizio di consegna tramite posta elettronica OCI, completare questo passo per tutti gli indirizzi di posta elettronica utilizzati come "Da" con UTL_SMTP.MAIL. Per ulteriori informazioni, vedere Gestione dei mittenti approvati.
  4. Consente l'accesso all'host SMTP per gli utenti con ruolo di amministratore aggiungendo la voce di controllo dell'accesso (ACE).
    Per utilizzare SMTP sicuro, è necessario impostare l'utente del database con la voce ACE (Access Control Entry) per l'accesso al wallet, oltre all'accesso all'host SMTP. Per un accesso SMTP sicuro utilizzando OCI Email Delivery Service, l'account Oracle Cloud Infrastructure deve essere autenticato utilizzando i protocolli Simple Authentication and Security Layer (SASL) come PLAIN, CRAM-MD5, LOGIN. Ad esempio, vedere il codice di esempio in SMTP Send Email Sample Code.
  5. Scrivere il codice PL/SQL per inviare e-mail utilizzando UTL_MAIL.

    Suggerimento

    Se si sta sviluppando la procedura di invio e-mail da soli, assicurarsi che il codice sia conforme al codice di esempio di invio e-mail SMTP.
  6. Inviare un messaggio di posta elettronica di test utilizzando la procedura PL/SQL creata nel passo 5.
    Ad esempio:
    execute send_mail('taylor@example.com', 'Email from Oracle Autonomous Database', 'Sent using UTL_SMTP');

Per ulteriori informazioni, vedere UTL_SMTP in Oracle Database 19c PL/SQL Packages and Types Reference o Oracle Database 23ai PL/SQL Packages and Types Reference.

Per ulteriori informazioni sull'uso di UTL_SMTP con Autonomous Database, consulta le Note sull'uso dei package PL/SQL del database.

Codice di esempio invio e-mail SMTP

Mostra il codice di esempio per l'invio di e-mail con UTL_SMTP su un Autonomous Database.

Codice di esempio

-- 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;
/

Invia messaggi come e-mail da Autonomous Database

SI APPLICA A: Applicabile solo Oracle Public Cloud

È possibile utilizzare DBMS_CLOUD_NOTIFICATION per inviare messaggi come e-mail.
  1. Identificare l'endpoint di connessione SMTP per il servizio di consegna tramite e-mail. Potrebbe essere necessario effettuare la sottoscrizione a ulteriori aree geografiche di Oracle Cloud Infrastructure se il servizio di consegna tramite e-mail non è disponibile nell'area corrente.

    Ad esempio, selezionare una delle seguenti opzioni per l'endpoint di connessione 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

    Per ulteriori informazioni, vedere Configura connessione SMTP.

  2. Generare le credenziali SMTP per il servizio di consegna tramite e-mail. UTL_SMTP utilizza le credenziali per eseguire l'autenticazione con i server di consegna tramite e-mail quando si inviano e-mail.

    Per ulteriori informazioni, vedere Generare le credenziali SMTP per un utente.

  3. Creare un mittente approvato per il servizio di consegna tramite e-mail. Completare questo passaggio per tutti gli indirizzi e-mail utilizzati come "From" con UTL_SMTP.MAIL.

    Per ulteriori informazioni, vedere Gestione dei mittenti approvati.

  4. Consenti accesso SMTP per utente ADMIN aggiungendo una voce di controllo dell'accesso (ACE).

    Ad esempio:

    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. Creare un oggetto credenziali e utilizzare DBMS_CLOUD_NOTIFICATION.SEND_MESSAGE per inviare un messaggio come e-mail.
    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;
    /

    Utilizzare il parametro params per specificare il mittente, smtp_host, l'oggetto, il destinatario e i destinatari di un CC o BCC nei valori string.

    • Mittente: specifica l'ID e-mail del mittente approvato dal Passo 3.

    • smtp_host: specifica il nome host SMTP dal passo 2.

    • Oggetto: specifica l'oggetto dell'e-mail.

    • destinatario: specifica gli ID e-mail dei destinatari. Utilizzare una virgola tra gli ID e-mail quando sono presenti più destinatari.

    • to_cc: specifica gli ID e-mail che ricevono un CC dell'e-mail. Utilizzare una virgola tra gli ID e-mail quando sono presenti più destinatari CC.

    • to_bcc: specifica gli ID e-mail che ricevono un Ccn dell'e-mail. Utilizzare una virgola tra gli ID e-mail quando sono presenti più destinatari Ccn.

    Per ulteriori informazioni, vedere SEND_MESSAGE Procedura.

Invia risultati query come e-mail da Autonomous Database

SI APPLICA A: Applicabile solo Oracle Public Cloud

È possibile utilizzare il pacchetto DBMS_CLOUD_NOTIFICATION per inviare i risultati di una query come messaggio di posta elettronica.

Per utilizzare DBMS_CLOUD_NOTIFICATION per inviare messaggi di posta:

  1. Identificare l'endpoint di connessione SMTP per il servizio di consegna tramite e-mail. Potrebbe essere necessario effettuare la sottoscrizione a ulteriori aree geografiche di Oracle Cloud Infrastructure se il servizio di consegna tramite e-mail non è disponibile nell'area corrente.

    Ad esempio, selezionare una delle seguenti opzioni per l'endpoint di connessione 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

    Per ulteriori informazioni, vedere Configura connessione SMTP.

  2. Generare le credenziali SMTP per il servizio di consegna tramite e-mail. UTL_SMTP utilizza le credenziali per eseguire l'autenticazione con i server di consegna tramite e-mail quando si inviano e-mail.

    Per ulteriori informazioni, vedere Generare le credenziali SMTP per un utente.

  3. Creare un mittente approvato per il servizio di consegna tramite e-mail. Completare questo passaggio per tutti gli indirizzi e-mail utilizzati come "From" con UTL_SMTP.MAIL.

    Per ulteriori informazioni, vedere Gestione dei mittenti approvati.

  4. Consenti accesso SMTP per utente ADMIN aggiungendo una voce di controllo dell'accesso (ACE).

    Ad esempio:

    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. Creare un oggetto credenziali e utilizzare DBMS_CLOUD_NOTIFICATION.SEND_DATA per inviare l'output di una query come messaggio di posta elettronica.
    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;
    /
    Utilizzare il parametro params per specificare il mittente, smtp_host, l'oggetto, il destinatario, i destinatari di un CC o di un Ccn, il messaggio, il tipo di dati e il titolo nei valori String.
    • Mittente: specifica l'ID e-mail del mittente approvato dal Passo 3.

    • smtp_host: specifica il nome host SMTP dal passo 2.

    • Oggetto: specifica l'oggetto dell'e-mail. La dimensione massima è di 100 caratteri.

    • destinatario: specifica gli ID e-mail dei destinatari. Utilizzare una virgola tra gli ID e-mail quando sono presenti più destinatari.

    • to_cc: specifica gli ID e-mail che ricevono un CC dell'e-mail. Utilizzare una virgola tra gli ID e-mail quando sono presenti più destinatari CC.

    • to_bcc: specifica gli ID e-mail che ricevono un Ccn dell'e-mail. Utilizzare una virgola tra gli ID e-mail quando sono presenti più destinatari Ccn.

    • messaggio: specifica il testo del messaggio.

    • tipo: specifica il formato di output in formato CSV o JSON.

    • titolo: specifica il titolo dell'allegato dell'output SQL. Il titolo deve contenere solo lettere, cifre, caratteri di sottolineatura, trattini o punti come caratteri nel relativo valore poiché viene utilizzato per generare un nome file.

    La dimensione massima dei messaggi da utilizzare con DBMS_CLOUD_NOTIFICATION.SEND_DATA per la notifica di posta è di 32k byte.

    Per ulteriori informazioni, vedere SEND_DATA Procedura.