¿Cómo puedo enviar un correo electrónico desde mi instancia de base de datos de Amazon RDS para Oracle?

10 minutos de lectura
0

Quiero configurar mi Amazon Relational Database Service (Amazon RDS) para que la instancia de base de datos de Oracle envíe correos electrónicos.

Breve descripción

Para enviar un correo electrónico desde una instancia de base de datos de RDS para Oracle, utilice los paquetes UTL_MAIL o UTL_SMTP. Para usar UTL_MAIL con RDS para Oracle, añada la opción UTL_MAIL en el grupo de opciones no predeterminado adjunto a la instancia. Para obtener más información sobre cómo configurar UTL_MAIL, consulte Oracle UTL_MAIL.

Para usar ULT_SMTP con RDS para Oracle, configure un servidor SMTP en una máquina local o utilice Amazon Simple Email Service (Amazon SES). Confirme que la conectividad de la instancia de base de datos de RDS para Oracle al servidor SMTP esté configurada correctamente.

La siguiente resolución explica cómo usar Amazon SES para enviar correos electrónicos a través del paquete UTL_SMTP.

Requisitos previos

Confirme que se puede acceder a su punto de enlace de Amazon SES desde su instancia de base de datos de RDS. Si su instancia de base de datos se ejecuta en una subred privada, cree un punto de enlace de nube virtual privada (VPC) para Amazon SES.

Nota: En las instancias de base de datos que se ejecutan en una subred privada, también puede usar una puerta de enlace NAT para comunicarse con el punto de enlace de Amazon SES.

Configuración de la instancia de base de datos para enviar correos electrónicos

Para configurar la instancia de base de datos para que envíe correos electrónicos, siga estos pasos:

  1. Utilice Amazon SES para configurar el servidor de correo SMTP.
  2. Cree un punto de enlace de VPC para Amazon SES.
  3. Cree una instancia de Linux de Amazon Elastic Compute Cloud (Amazon EC2). A continuación, utilice el certificado correspondiente para configurar el cliente y la cartera de Oracle.
  4. Cargue la cartera en un bucket de Amazon Simple Storage Service (Amazon S3).
  5. Utilice la integración de Amazon S3 para descargar la cartera del bucket de Amazon S3 en el servidor de Amazon RDS.
  6. Para los usuarios no principales, conceda los permisos necesarios a los usuarios y, a continuación, cree las listas de control de acceso de la red (ACL de la red) necesarias.
  7. Utilice sus credenciales de Amazon SES para enviar el correo electrónico.

Resolución

Nota: Si se muestran errores al ejecutar comandos de la Interfaz de la línea de comandos de AWS (AWS CLI), consulte Troubleshoot AWS CLI errors. Además, asegúrese de utilizar la versión más reciente de la AWS CLI.

Configuración del servidor de correo SMTP

Para obtener instrucciones sobre cómo usar Amazon SES para configurar un servidor de correo SMTP, consulte ¿Cómo puedo configurar SMTP y conectarme a él mediante Amazon SES?

Creación de una VPC con Amazon SES

Para obtener instrucciones sobre cómo usar Amazon SES para crear una VPC, consulte Setting up VPC endpoints with Amazon SES.

Creación de una instancia de Amazon EC2 y configuración del cliente y la cartera de Oracle

Siga estos pasos:

  1. Cree una instancia de Linux de Amazon EC2.

  2. Instale un cliente de Oracle.
    Nota: Se recomienda usar un cliente que tenga la misma versión que la instancia de base de datos. En esta resolución, se utiliza la versión 19c de Oracle. Para descargar este cliente, consulte Oracle Database 19c (19.3) en el sitio web de Oracle. Esta versión incluye con la utilidad orapki.

  3. Abra la AWS CLI.

  4. Desde la instancia de EC2, permita la conexión en el puerto de la base de datos del grupo de seguridad de Amazon RDS. Si la instancia de base de datos y la instancia de EC2 usan la misma VPC, utilice sus direcciones IP privadas para permitir la conexión.

  5. Conéctese a la instancia de EC2.

  6. Ejecute el siguiente comando para descargar el certificado AmazonRootCA1:

    wget https://www.amazontrust.com/repository/AmazonRootCA1.pem
  7. Ejecute los siguientes comandos para crear la cartera:

    orapki wallet create -wallet . -auto_login_only  
    orapki wallet add -wallet . -trusted_cert -cert AmazonRootCA1.pem -auto_login_only

Cargar la cartera en Amazon S3

Siga estos pasos:

  1. Ejecute el siguiente comando para cargar la cartera en un bucket de Amazon S3:
    Nota: El bucket de S3 debe estar en la misma región de AWS que la instancia de base de datos.

    aws s3 cp cwallet.sso s3://testbucket/
  2. Ejecute el siguiente comando para comprobar que el archivo se ha cargado correctamente:

    aws s3 ls testbucket

Utilización de la integración de Amazon S3 para descargar la cartera en el servidor de Amazon RDS

Siga estos pasos:

  1. Abra la consola de Amazon RDS y, a continuación, cree un grupo de opciones.
  2. Agregue la opción S3_INTEGRATION al grupo de opciones.
  3. Cree una instancia de base de datos con el grupo de opciones.
  4. Cree una política y un rol de AWS Identity and Access Management (IAM). Para obtener más información, consulte Configuración de permisos IAM para la integración de RDS para Oracle con Amazon S3.
  5. Ejecute los siguientes comandos para descargar la cartera en Amazon RDS desde el bucket de S3:
    SQL> exec rdsadmin.rdsadmin_util.create_directory('S3_WALLET');  
    
    PL/SQL procedure successfully completed.  
    
    SQL> SELECT OWNER,DIRECTORY_NAME,DIRECTORY_PATH FROM DBA_DIRECTORIES WHERE DIRECTORY_NAME='S3_WALLET';  
    
    OWNER             DIRECTORY_NAME            DIRECTORY_PATH  
    -------------------- ------------------------------ ----------------------------------------------------------------------  
    SYS             S3_WALLET                /rdsdbdata/userdirs/01  
    
    SQL> SELECT  
    rdsadmin.rdsadmin_s3_tasks.download_from_s3(  
    p_bucket_name => 'testbucket',  
    p_directory_name => 'S3_WALLET',  
    P_S3_PREFIX => 'cwallet.sso')  AS TASK_ID FROM DUAL;  
    
    TASK_ID  
    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------  
    1625291989577-52  
    
    SQL> SELECT filename FROM table(RDSADMIN.RDS_FILE_UTIL.LISTDIR('S3_WALLET'));  
    
    FILENAME  
    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------  
    01/  
    cwallet.sso

Para los usuarios no principales de RDS para Oracle: Conceda los permisos necesarios al usuario y cree las ACL de la red necesarias

Ejecute el siguiente comando para conceder los permisos necesarios al usuario no principal:

begin  
    rdsadmin.rdsadmin_util.grant_sys_object(  
        p_obj_name  => 'DBA_DIRECTORIES',  
        p_grantee   => 'example-username',  
        p_privilege => 'SELECT');  
end;  
/

Ejecute los siguientes comandos para crear las ACL de la red necesarias:

BEGIN  
DBMS_NETWORK_ACL_ADMIN.CREATE_ACL (  
acl => 'ses_1.xml',  
description => 'AWS SES ACL 1',  
principal => 'TEST',  
is_grant => TRUE,  
privilege => 'connect');  
COMMIT;  
END;  
/  
BEGIN  
DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL (  
acl => 'ses_1.xml',  
host => 'example-host');  
COMMIT;  
END;  
/

Envío del correo electrónico

Para enviar el correo electrónico, ejecute el siguiente procedimiento.

Nota: Sustituya los valores siguientes por los suyos:

  • example-server por el nombre de su servidor de correo SMTP
  • example-sender-email por la dirección de correo electrónico del remitente
  • example-receiver-email por la dirección de correo electrónico del destinatario
  • example-SMTP-username por su nombre de usuario
  • example-SMTP-password por su contraseña

Si utiliza un servidor de SMTP local o Amazon EC2 como servidor de SMTP, sustituya la información de Amazon SES por los detalles de su servidor local o de EC2.

declare  
l_smtp_server varchar2(1024) := 'example-server';  
l_smtp_port number := 587;  
l_wallet_dir varchar2(128) := 'S3_WALLET';  
l_from varchar2(128) := 'example-sender-email';  
l_to varchar2(128)  := 'example-receiver-email';  
l_user varchar2(128) := 'example-SMTP-username';  
l_password varchar2(128) := 'example-SMTP-password';  
l_subject varchar2(128) := 'Test mail from RDS Oracle';  
l_wallet_path varchar2(4000);  
l_conn utl_smtp.connection;  
l_reply utl_smtp.reply;  
l_replies utl_smtp.replies;  
begin  
select 'file:/' || directory_path into l_wallet_path from dba_directories where directory_name=l_wallet_dir;  
--open a connection  
l_reply := utl_smtp.open_connection(  
host => l_smtp_server,  
port => l_smtp_port,  
c => l_conn,  
wallet_path => l_wallet_path,  
secure_connection_before_smtp => false);  
dbms_output.put_line('opened connection, received reply ' || l_reply.code || '/' || l_reply.text);  
--get supported configs from server  
l_replies := utl_smtp.ehlo(l_conn, 'localhost');  
for r in 1..l_replies.count loop  
dbms_output.put_line('ehlo (server config) : ' || l_replies(r).code || '/' || l_replies(r).text);  
end loop;  
--STARTTLS  
l_reply := utl_smtp.starttls(l_conn);  
dbms_output.put_line('starttls, received reply ' || l_reply.code || '/' || l_reply.text);  
--  
l_replies := utl_smtp.ehlo(l_conn, 'localhost');  
for r in 1..l_replies.count loop  
dbms_output.put_line('ehlo (server config) : ' || l_replies(r).code || '/' || l_replies(r).text);  
end loop;  
utl_smtp.auth(l_conn, l_user, l_password, utl_smtp.all_schemes);  
utl_smtp.mail(l_conn, l_from);  
utl_smtp.rcpt(l_conn, l_to);  
utl_smtp.open_data (l_conn);  
utl_smtp.write_data(l_conn, 'Date: ' || to_char(SYSDATE, 'DD-MON-YYYY HH24:MI:SS') || utl_tcp.crlf);  
utl_smtp.write_data(l_conn, 'From: ' || l_from || utl_tcp.crlf);  
utl_smtp.write_data(l_conn, 'To: ' || l_to || utl_tcp.crlf);  
utl_smtp.write_data(l_conn, 'Subject: ' || l_subject || utl_tcp.crlf);  
utl_smtp.write_data(l_conn, '' || utl_tcp.crlf);  
utl_smtp.write_data(l_conn, 'Test message.' || utl_tcp.crlf);  
utl_smtp.close_data(l_conn);  

l_reply := utl_smtp.quit(l_conn);  
exception  
when others then  
utl_smtp.quit(l_conn);  
raise;  
end;  
/

Solución de errores

ORA-29279: Si el nombre de usuario o la contraseña de SMTP no son correctos, puede aparecer el siguiente error:

«ORA-29279: SMTP permanent error: 535 Authentication Credentials Invalid»

Para solucionar este error, compruebe que sus credenciales de SMTP sean correctas.

ORA-00942: Si un usuario no principal ejecuta el paquete de correo electrónico, puede aparecer el siguiente error:

«PL/SQL: ORA-00942: table or view does not exist»

Identifique el objeto que no tiene acceso y, a continuación, conceda los permisos necesarios. Por ejemplo, si faltan ciertos permisos para los objetos propiedad de SYS, como DBA_directories para example-username, ejecute el siguiente comando:

begin  
    rdsadmin.rdsadmin_util.grant_sys_object(  
        p_obj_name  => 'DBA_DIRECTORIES',  
        p_grantee   => 'example-username',  
        p_privilege => 'SELECT');  
end;  
/

ORA-24247: Si no asignó la ACL de la red al host de destino, aparece el siguiente error. También aparece este error cuando el usuario no tiene los permisos necesarios para acceder al host de destino:

«ORA-24247: network access denied by access control list (ACL)»

Para solucionar este error, ejecute el siguiente procedimiento para crear una ACL de la red y asignarla al host:

BEGIN  
DBMS_NETWORK_ACL_ADMIN.CREATE_ACL (  
acl => 'ses_1.xml',  
description => 'AWS SES ACL 1',  
principal => 'TEST',  
is_grant => TRUE,  
privilege => 'connect');  
COMMIT;  
END;  
/  

BEGIN  
DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL (  
acl => 'ses_1.xml',  
host => 'example-host');  
COMMIT;  
END;  
/

ORA-29278: Si no configura correctamente los grupos de seguridad, el firewall o la ACL de la red, aparece el siguiente error:

«ORA-29278: SMTP transient error: 421 Service not available»

Para solucionar este error, asegúrese de configurar correctamente la red. También puede revisar los registros de flujo de la VPC para obtener la siguiente información:

  • Analice las direcciones IP de origen y destino: En los registros de flujo de la VPC, compruebe que los datos que se transmiten desde las direcciones IP de origen y destino reciban respuestas.
  • Revise el puerto y el protocolo: Confirme que el puerto y el protocolo utilizados sean correctos y que no haya discrepancias inusuales.
  • ACL de la red y grupos de seguridad: Compruebe las configuraciones de ACL de la red y de los grupos de seguridad para confirmar que permiten el tráfico en el puerto necesario.
  • Enrutamiento de subred: Valide que las tablas de enrutamiento de las subredes pertinentes estén configuradas correctamente para enrutar el tráfico al servidor de base de datos.
  • Latencia y pérdida de paquetes: Busque la latencia o la pérdida de paquetes. La latencia y la pérdida de paquetes pueden indicar problemas en la red.

Para obtener más información, consulte Registro del tráfico de IP con registros de flujo de la VPC y Troubleshooting ORA-29278 and ORA-29279 when using UTL_SMTP (Doc ID 2287232.1) en el sitio web de Oracle.

ORA-29279: Si no ha creado una identidad en Amazon SES, puede aparecer el siguiente error:

«ORA-29279: SMTP permanent error: 554 Message rejected: Email address is not verified. The following identities failed the check in region <REGION>:'example-sender-email'»

Para solucionar este error, configure una identidad a nivel de dominio o cree una identidad de dirección de correo electrónico. Para obtener más información, consulte Creating and verifying identities in Amazon SES.

Comprobación de la conectividad de Amazon RDS a su punto de enlace de Amazon SES

Ejecute el siguiente procedimiento para comprobar la conexión entre Amazon RDS y el punto de enlace de Amazon SES:

CREATE OR REPLACE FUNCTION fn_check_network  
(p_remote_host in varchar2, -- host name  
 p_port_no in integer default 587  
)  
RETURN number IS  
   v_connection   utl_tcp.connection;  
BEGIN  
   v_connection := utl_tcp.open_connection(REMOTE_HOST=>p_remote_host, REMOTE_PORT=>p_port_no, IN_BUFFER_SIZE=>1024, OUT_BUFFER_SIZE=>1024,   TX_TIMEOUT=>5);  
   RETURN 1;  
EXCEPTION  
   WHEN others THEN  
      return sqlcode;  
END fn_check_network;  
/
SELECT fn_check_network('email-smtp.<region>.amazonaws.com', 587) FROM dual;

Si el procedimiento se realiza correctamente, la función devuelve 1. Si el procedimiento falla, la función devuelve ORA -29260.

Información relacionada

Overview of the email delivery service en el sitio web de Oracle.

UTL_SMTP en el sitio web de Oracle.

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace un año