Envío de correo electrónico en Autonomous Database on Dedicated Exadata Infrastructure

Puede enviar correos electrónicos en Autonomous Database on Dedicated Exadata Infrastructure mediante el servicio Email Delivery o los procedimientos DBMS_CLOUD_NOTIFICATION. En este artículo se describe cómo enviar correos electrónicos con estas dos opciones.

Envío de correo electrónico con el servicio Email Delivery en Autonomous Database

Se describen los pasos para enviar correo electrónico mediante UTL_SMTP en Autonomous Database on Dedicated Exadata Infrastructure.

Para enviar un correo electrónico mediante UTL_SMTP:
  1. Identifique el punto final de conexión SMTP para Email Delivery.
    1. Si desea utilizar el servicio Email Delivery de Oracle Cloud Infrastructure (OCI), identifique el punto final de conexión para Email Delivery. Por ejemplo, seleccione smtp.email.US-phoenix-1.oci.oraclecloud.com cuando Oeste de EE. UU. (Phoenix) sea la región de envío. Consulte Configuración de la conexión SMTP para obtener más información.

      Note:

      Puede que necesite suscribirse a regiones de Oracle Cloud Infrastructure adicionales si Email Delivery no está disponible en su región actual.
    2. Si desea utilizar un servidor SMTP de terceros, el administrador de red debe configurar el servidor SMTP y su conectividad con el inquilino de la Autonomous Database y proporcionar la información del punto final de conexión SMTP.
  2. Genere credenciales SMTP para Email Delivery para el usuario de OCI.
    UTL_SMTP utiliza credenciales para autenticarse con los servidores de Email Delivery cuando envía un correo electrónico. Consulte Generación de credenciales SMTP para un usuario para obtener más información.
  3. Cree remitentes aprobados para Email Delivery.
    Si utiliza el servicio Email Delivery de OCI, complete este paso para todas las direcciones de correo electrónico que utilice como dirección "De" con UTL_SMTP.MAIL. Consulte Gestión de emisores aprobados para obtener más información.
  4. Permita el acceso al host SMTP para los usuarios con rol de administrador agregando la entrada de control de acceso (ACE).
    Para utilizar SMTP seguro, debe configurar el usuario de la base de datos con la entrada de control de acceso (ACE) para el acceso a la cartera, además del acceso al host SMTP. Para un acceso SMTP seguro con OCI Email Delivery Service, la cuenta de Oracle Cloud Infrastructure se debe autenticar mediante protocolos de autenticación simple y capa de seguridad (SASL), como PLAIN, CRAM-MD5, LOGIN. Por ejemplo, consulte el código de ejemplo en Código de ejemplo de envío de correo electrónico SMTP.
  5. Escriba el código PL/SQL para enviar correo electrónico mediante UTL_MAIL.

    Sugerencia:

    Si desarrolla el procedimiento de envío de correo electrónico usted mismo, asegúrese de que el código esté basado en Código de ejemplo de envío de correo electrónico SMTP.
  6. Envíe un correo electrónico de prueba mediante el procedimiento PL/SQL creado en el paso 5.
    Por ejemplo:
    execute send_mail('taylor@example.com', 'Email from Oracle Autonomous Database', 'Sent using UTL_SMTP');

Consulte UTL_SMTP en Oracle Database 19c PL/SQL Packages and Types Reference o Oracle Database 23ai PL/SQL Packages and Types Reference para obtener más referencia.

Consulte Notas sobre el uso de paquetes PL/SQL de base de datos para obtener más información sobre el uso de UTL_SMTP con Autonomous Database.

Código de ejemplo de envío de correo electrónico SMTP

Muestra el código de ejemplo para enviar correo electrónico con UTL_SMTP en una instancia de Autonomous Database.

Código de ejemplo

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

Envío de mensajes como correo electrónico desde Autonomous Database

Se aplica a: Aplicable Oracle Public Cloud solo

Puede utilizar DBMS_CLOUD_NOTIFICATION para enviar mensajes como correo electrónico.
  1. Identifique el punto final de conexión SMTP para Email Delivery. Puede que necesite suscribirse a regiones de Oracle Cloud Infrastructure adicionales si Email Delivery no está disponible en su región actual.

    Por ejemplo, seleccione una de las siguientes opciones de punto final de conexión SMTP:

    • smtpTERM:us-phoenix-1.oraclecloud.com
    • smtpTERM:us-ashburn-1.oraclecloud.com
    • smtp.emailTERM:uk-london-1.oci.oraclecloud.com
    • smtp.emailTERM:eu-frankfurt-1.oci.oraclecloud.com

    Consulte Configuración de la conexión SMTP para obtener más información.

  2. Genere credenciales SMTP para Email Delivery. UTL_SMTP utiliza credenciales para autenticarse con los servidores de Email Delivery cuando envía correo electrónico.

    Consulte Generación de credenciales SMTP para un usuario para obtener más información.

  3. Cree un remitente aprobado para Email Delivery. Realice este paso para todas las direcciones de correo electrónico que utilice como "From" con UTL_SMTP.MAIL.

    Consulte Managing Approved Senders para obtener más información.

  4. Para permitir el acceso SMTP para el usuario ADMIN, agregue una entrada de control de acceso (ACE).

    Por ejemplo:

    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. Cree un objeto de credencial y utilice DBMS_CLOUD_NOTIFICATION.SEND_MESSAGE para enviar un mensaje como correo electrónico.
    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;
    /

    Utilice el parámetro params para especificar el remitente, smtp_host, el asunto, el destinatario y los destinatarios de una CC o un BCC en los valores string.

    • remitente: especifica el ID de correo electrónico del remitente aprobado del paso 3.

    • smtp_host: especifica el nombre de host SMTP del paso 2.

    • subject: especifica el asunto del correo electrónico.

    • destinatario: especifica los ID de correo electrónico de los destinatarios. Utilice una coma entre los ID de correo electrónico cuando haya varios destinatarios.

    • to_cc: especifica los ID de correo electrónico que reciben una CC del correo electrónico. Use una coma entre los ID de correo electrónico cuando haya varios destinatarios CC.

    • to_bcc: especifica los ID de correo electrónico que reciben un BCC del correo electrónico. Utilice una coma entre los ID de correo electrónico cuando haya varios destinatarios de BCC.

    Consulte procedimiento SEND_MESSAGE para obtener más información.

Envío de resultados de consulta como correo electrónico desde Autonomous Database

Se aplica a: Aplicable Oracle Public Cloud solo

Puede utilizar el paquete DBMS_CLOUD_NOTIFICATION para enviar los resultados de una consulta como correo electrónico.

Para utilizar DBMS_CLOUD_NOTIFICATION para enviar correo:

  1. Identifique el punto final de conexión SMTP para Email Delivery. Puede que necesite suscribirse a regiones de Oracle Cloud Infrastructure adicionales si Email Delivery no está disponible en su región actual.

    Por ejemplo, seleccione una de las siguientes opciones de punto final de conexión SMTP:

    • smtpTERM:us-phoenix-1.oraclecloud.com
    • smtpTERM:us-ashburn-1.oraclecloud.com
    • smtp.emailTERM:uk-london-1.oci.oraclecloud.com
    • smtp.emailTERM:eu-frankfurt-1.oci.oraclecloud.com

    Consulte Configuración de la conexión SMTP para obtener más información.

  2. Genere credenciales SMTP para Email Delivery. UTL_SMTP utiliza credenciales para autenticarse con los servidores de Email Delivery cuando envía correo electrónico.

    Consulte Generación de credenciales SMTP para un usuario para obtener más información.

  3. Cree un remitente aprobado para Email Delivery. Realice este paso para todas las direcciones de correo electrónico que utilice como "From" con UTL_SMTP.MAIL.

    Consulte Managing Approved Senders para obtener más información.

  4. Para permitir el acceso SMTP para el usuario ADMIN, agregue una entrada de control de acceso (ACE).

    Por ejemplo:

    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. Cree un objeto de credencial y utilice DBMS_CLOUD_NOTIFICATION.SEND_DATA para enviar la salida de una consulta como correo electrónico.
    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;
    /
    Utilice el parámetro params para especificar el remitente, smtp_host, asunto, destinatario, destinatarios de CC o BCC, el mensaje, el tipo de dato y el título en los valores String.
    • remitente: especifica el ID de correo electrónico del remitente aprobado del paso 3.

    • smtp_host: especifica el nombre de host SMTP del paso 2.

    • subject: especifica el asunto del correo electrónico. El tamaño máximo es de 100 caracteres.

    • destinatario: especifica los ID de correo electrónico de los destinatarios. Utilice una coma entre los ID de correo electrónico cuando haya varios destinatarios.

    • to_cc: especifica los ID de correo electrónico que reciben una CC del correo electrónico. Use una coma entre los ID de correo electrónico cuando haya varios destinatarios CC.

    • to_bcc: especifica los ID de correo electrónico que reciben un BCC del correo electrónico. Utilice una coma entre los ID de correo electrónico cuando haya varios destinatarios de BCC.

    • message: especifica el texto del mensaje.

    • type: especifica el formato de salida como CSV o JSON.

    • title: especifica el título de la asociación de la salida SQL. El título solo debe contener letras, dígitos, guiones bajos, guiones o puntos como caracteres en su valor debido a que se utiliza para generar un nombre de archivo.

    El tamaño máximo de mensaje para utilizar con DBMS_CLOUD_NOTIFICATION.SEND_DATA para la notificación de correo es 32k bytes.

    Consulte SEND_DATA Procedimiento para obtener más información.