Envío de correo electrónico en Autonomous Database

Hay una serie de opciones para enviar correo electrónico en Autonomous Database. También puede enviar mensajes de texto o la salida de una consulta SQL a un canal Slack o MSTeams.

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.

Nota

El servicio Email Delivery de Oracle Cloud Infrastructure es el único proveedor de correo electrónico soportado para los puntos finales SMTP públicos.

Para enviar correo electrónico con el servicio Email Delivery de Oracle Cloud Infrastructure:

  1. Identifique el punto final de conexión SMTP para Email Delivery. Puede que tenga que 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

    Para obtener más información, consulte Configuración de la conexión SMTP.

  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 Gestión de emisores aprobados para obtener más información.

  4. Para permitir el acceso SMTP para el usuario ADMINISTRADOR, 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 procedimiento PL/SQL para enviar correo electrónico.

    Por ejemplo, consulte el código de ejemplo que se muestra en SMTP Send Email Sample Code.

  6. Enviar 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 para obtener información sobre UTL_SMTP.

Consulte Notas sobre paquetes PL/SQL para Autonomous Database para obtener información sobre las restricciones 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 Autonomous Database.

CREATE OR REPLACE PROCEDURE SEND_MAIL (
  msg_to varchar2,
  msg_subject varchar2,
  msg_text varchar2 ) 
IS

  mail_conn utl_smtp.connection;
  username varchar2(1000):= 'ocid1.user.oc1.username';
  passwd varchar2(50):= 'password';
  msg_from varchar2(50) := 'adam@example.com';
  mailhost VARCHAR2(50) := 'smtp.us-ashburn-1.oraclecloud.com';

BEGIN
  mail_conn := UTL_smtp.open_connection(mailhost, 587);
  utl_smtp.starttls(mail_conn);
  
  UTL_SMTP.AUTH(mail_conn, username, passwd, schemes => 'PLAIN');
  
  utl_smtp.mail(mail_conn, msg_from);
  utl_smtp.rcpt(mail_conn, msg_to);
  
  UTL_smtp.open_data(mail_conn);
 
  UTL_SMTP.write_data(mail_conn, 'Date: ' || TO_CHAR(SYSDATE, 'DD-MON-YYYY HH24:MI:SS') || UTL_TCP.crlf);
  UTL_SMTP.write_data(mail_conn, 'To: ' || msg_to || UTL_TCP.crlf);
  UTL_SMTP.write_data(mail_conn, 'From: ' || msg_from || UTL_TCP.crlf);
  UTL_SMTP.write_data(mail_conn, 'Subject: ' || msg_subject || UTL_TCP.crlf);
  UTL_SMTP.write_data(mail_conn, 'Reply-To: ' || msg_to || UTL_TCP.crlf || UTL_TCP.crlf);
  UTL_SMTP.write_data(mail_conn, msg_text || UTL_TCP.crlf || UTL_TCP.crlf);
  
  UTL_smtp.close_data(mail_conn);
  UTL_smtp.quit(mail_conn);

EXCEPTION
  WHEN UTL_smtp.transient_error OR UTL_smtp.permanent_error THEN
    UTL_smtp.quit(mail_conn);
    dbms_output.put_line(sqlerrm);
  WHEN OTHERS THEN
    UTL_smtp.quit(mail_conn);
    dbms_output.put_line(sqlerrm);
END;
/

Donde:

Envío de correo electrónico con un proveedor de correo electrónico en un punto final privado

Describe los pasos para enviar correo electrónico con un proveedor de correo electrónico que está en un punto final privado.

Para enviar correo electrónico desde Autonomous Database mediante un proveedor de correo electrónico en un punto final privado, se debe acceder al proveedor de correo electrónico desde la VCN de Oracle Cloud Infrastructure (el punto final privado de la instancia de Autonomous Database). Por ejemplo, puede acceder a un proveedor de correo electrónico cuando:

  • La instancia de Autonomous Database de origen y el proveedor de correo electrónico están en la misma VCN de Oracle Cloud Infrastructure.

  • La instancia de Autonomous Database de origen y el proveedor de correo electrónico están en distintas Oracle Cloud Infrastructure VCN asociadas.

  • The email provider is on an on-premises network that is connected to the source Autonomous Database instance's Oracle Cloud Infrastructure VCN using FastConnect or VPN.

Como requisito, para enviar correo electrónico mediante un proveedor de correo electrónico, defina las siguientes reglas de entrada y salida:

  • Defina una regla de salida en la lista de seguridad de subred o el grupo de seguridad de red de la base de datos de origen para que se permita el tráfico al host de destino en el puerto 587 o el puerto 25 (dependiendo del puerto que esté utilizando).

  • Defina una regla de entrada en la lista de seguridad de subred o el grupo de seguridad de red del host de destino para que se permita el tráfico desde la dirección IP de la instancia de Autonomous Database de origen hasta el puerto 587 o el puerto 25 (dependiendo del puerto que esté utilizando).

Para enviar correo electrónico desde un proveedor de correo electrónico en un punto final privado:

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

    Por ejemplo:

    -- Create an Access Control List for the host
    BEGIN
       DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
             host => 'www.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),
             private_target => TRUE);
    END;
    /
    Nota

    DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE solo soporta un nombre de host único para el parámetro host (en un punto final privado, no está soportado el uso de una dirección IP, una IP de SCAN o un nombre de host de SCAN).

    Si define ROUTE_OUTBOUND_CONNECTIONS en PRIVATE_ENDPOINT, no es necesario definir el parámetro private_target en TRUE en esta API. Consulte Seguridad mejorada para conexiones de salida con puntos finales privados para obtener más información.

  2. Cree un procedimiento PL/SQL para enviar correo electrónico.
  3. Enviar un correo electrónico de prueba mediante el procedimiento PL/SQL creado en el paso 2.

    Por ejemplo:

    execute send_mail('taylor@example.com', 'Email from Oracle Autonomous Database', 'Sent using private email provider');

Uso de objetos de credencial para definir la autenticación SMTP

Describe cómo transferir objetos de credenciales a las API de UTL_SMTP.SET_CREDENTIAL.

El subprograma SET_CREDENTIAL envía el comando AUTH para autenticarse en el servidor SMTP.

El subprograma UTL_SMTP.SET_CREDENTIAL permite transferir objetos de credenciales para definir la autenticación SMTP. Los objetos de credenciales son objetos de esquema, por lo que solo los usuarios con privilegios pueden acceder a ellos y permiten configurar privilegios de nivel de esquema para acceder al control de credenciales. La transferencia de objetos de credenciales es una forma adecuada y segura de almacenar y gestionar nombres de usuario, contraseñas y claves para la autenticación.

El subprograma UTL_SMTP.SET_CREDENTIAL es una alternativa segura y conveniente al subprograma UTL_SMTP.AUTH.

Ejemplo


...
UTL_SMTP.AUTH (l_mail_conn, 'ocid1.user.oc1.username', 'xxxxxxxxxxxx', schemes => 'PLAIN');
...

Como se muestra en el ejemplo anterior, al llamar al subprograma AUTH, debe transferir el nombre de usuario/contraseña en texto no cifrado como parte de los parámetros formales PL/SQL. Es posible que necesite incrustar el nombre de usuario/contraseña en varios scripts cron o de automatización PL/SQL. La transferencia de contraseñas de texto no cifrado es un problema de conformidad que se aborda en el subprograma UTL_SMTP.SET_CREDENTIAL.

Consulte Función y procedimiento AUTH para obtener más información.

Sintaxis de UTL_SMTP.SET_CREDENTIAL

PROCEDURE UTL_SMTP.SET_CREDENTIAL (
    c          IN OUT NOCOPY connection,
    credential IN            VARCHAR2,
    schemes    IN            VARCHAR2 DEFAULT NON_CLEARTEXT_PASSWORD_SCHEMES
);

FUNCTION UTL_SMTP.SET_CREDENTIAL (
    c          IN OUT NOCOPY connection,
    credential IN            VARCHAR2,
    schemes    IN            VARCHAR2 DEFAULT NON_CLEARTEXT_PASSWORD_SCHEMES)
    RETURN reply;

Ejemplo

  • Cree un objeto de credencial:

    BEGIN DBMS_CLOUD.CREATE_CREDENTIAL (
        credential_name => 'HTTP_CRED',
        username        => 'web_app_user',
        password        => '<password>' );
    END;

    Esto crea un objeto de credencial que crea un par de nombre de usuario/contraseña almacenado.

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

    Consulte Especificación de Credenciales de Trabajo del Planificador para obtener más información.

  • Ejecute el procedimiento UTL_SMTP.SET_CREDENTIAL:

    DECLARE
          l_mail_conn UTL_SMTP.CONNECTION;
        BEGIN 
          l_mail_conn := UTL_SMTP.OPEN_CONNECTION('smtp.example.com', 587);
          UTL_SMTP.SET_CREDENTIAL(l_mail_conn, 'SMTP_CRED', SCHEMES => 'PLAIN');
          ...
    END;
    

    En este ejemplo, se envía el comando para autenticarse en el servidor SMTP. El servidor web necesita esta información para autorizar la solicitud. El valor l_mail_conn es la conexión SMTP, SMTP_CRED es el nombre de las credenciales y PLAIN es el esquema de autenticación SMTP.

Consulte UTL_SMTP para obtener más información.

Consulte Notas sobre paquetes PL/SQL para Autonomous Database para obtener información sobre las restricciones para UTL_SMTP en Autonomous Database.

Envío de correo electrónico desde Autonomous Database mediante DBMS_CLOUD_NOTIFICATION

Utilice el paquete DBMS_CLOUD_NOTIFICATION para enviar mensajes y consultar los resultados como correo electrónico.

Nota

DBMS_CLOUD_NOTIFICATION soporta el envío de correo electrónico solo a puntos finales SMTP públicos. El servicio Oracle Cloud Infrastructure Email Delivery es el único proveedor de correo electrónico soportado.

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

Puede utilizar DBMS_CLOUD_NOTIFICATION para enviar mensajes como correo electrónico.

Nota

Solo puede utilizar DBMS_CLOUD_NOTIFICATION para notificaciones de correo electrónico con Autonomous Database versión 19.21 y posteriores.
  1. Identifique el punto final de conexión SMTP para Email Delivery. Puede que tenga que 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

    Para obtener más información, consulte Configuración de la conexión SMTP.

  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 Gestión de emisores aprobados para obtener más información.

  4. 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 un CC o BCC en los valores string.

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

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

    • asunto: 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 un CC del correo electrónico. Utilice una coma entre los ID de correo electrónico cuando haya varios destinatarios de 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 el procedimiento SEND_MESSAGE para obtener más información.

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

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 tenga que 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

    Para obtener más información, consulte Configuración de la conexión SMTP.

  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 Gestión de emisores aprobados para obtener más información.

  4. 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, el asunto, el destinatario, los destinatarios de un CC o BCC, el mensaje, el tipo de dato y el título en los valores String.
    • emisor: especifica el ID de correo electrónico del remitente aprobado del paso 3.

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

    • asunto: 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 un CC del correo electrónico. Utilice una coma entre los ID de correo electrónico cuando haya varios destinatarios de 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.

    • mensaje: especifica el texto del mensaje.

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

    • título: 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.

    Notas para enviar los resultados de una consulta como correo:

    • Solo puede utilizar DBMS_CLOUD_NOTIFICATION para notificaciones de correo con Autonomous Database versión 19.21 y posteriores.

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

    Consulte el procedimiento SEND_DATA para obtener más información.