Saltar al contenido

¿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 instancia de base de datos de Amazon Relational Database Service (Amazon RDS) para Oracle para que 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, usa los paquetes UTL_MAIL o UTL_SMTP. Para usar UTL_MAIL con RDS para Oracle, añade 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, consulta Oracle UTL_MAIL.

Para usar ULT_SMTP con RDS para Oracle, configura un servidor SMTP en una máquina local o utiliza Amazon Simple Email Service (Amazon SES). Confirma 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

Confirma que se puede acceder a tu punto de enlace de Amazon SES desde tu instancia de base de datos de RDS. Si tu instancia de base de datos se ejecuta en una subred privada, crea 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 puedes usar una puerta de enlace NAT para comunicarte 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, sigue estos pasos:

  1. Utiliza Amazon SES para configurar el servidor de correo SMTP.
  2. Crea un punto de enlace de VPC para Amazon SES.
  3. Crea una instancia de Linux de Amazon Elastic Compute Cloud (Amazon EC2). A continuación, utiliza el certificado correspondiente para configurar el cliente y la cartera de Oracle.
  4. Carga la cartera en un bucket de Amazon Simple Storage Service (Amazon S3).
  5. Utiliza 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, concede los permisos necesarios a los usuarios y, a continuación, crea las listas de control de acceso de la red (ACL de la red) necesarias.
  7. Utiliza tus credenciales de Amazon SES para enviar el correo electrónico.

Resolución

Nota: Si se muestran errores al ejecutar comandos de Interfaz de la línea de comandos de AWS (AWS CLI), consulta Solución de errores para AWS CLI. Además, asegúrate de utilizar la versión más reciente de 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 uso SMTP para enviar correos electrónicos a través de Amazon SES?

Creación de una VPC con Amazon SES

Para obtener instrucciones sobre cómo usar Amazon SES para crear una VPC, consulta Setting up VPC endpoints with Amazon SES (Configuración de puntos de enlace de VPC con Amazon SES).

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

Sigue estos pasos:

  1. Crea una instancia de Linux de Amazon EC2.

  2. Instala 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, consulta Oracle Database 19c (19.3) en el sitio web de Oracle. Esta versión incluye con la utilidad orapki.

  3. Abre AWS CLI.

  4. Desde la instancia de EC2, permite 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, utiliza sus direcciones IP privadas para permitir la conexión.

  5. Conéctate a la instancia de EC2.

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

    wget https://www.amazontrust.com/repository/AmazonRootCA1.pem
  7. Ejecuta 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

Carga de la cartera en Amazon S3

Sigue estos pasos:

  1. Ejecuta 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. Ejecuta el siguiente comando para comprobar que el archivo se ha cargado correctamente:

    aws s3 ls testbucket

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

Sigue estos pasos:

  1. Abre la consola de Amazon Aurora y RDS y, a continuación, crea un grupo de opciones.
  2. Añade la opción S3_INTEGRATION al grupo de opciones.
  3. Crea una instancia de base de datos con el grupo de opciones.
  4. Crea una política y un rol de AWS Identity and Access Management (IAM). Para obtener más información, consulta Configuración de permisos IAM para la integración de RDS para Oracle con Amazon S3.
  5. Ejecuta 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: Concede los permisos necesarios al usuario y crea las ACL de la red necesarias

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

Ejecuta 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, ejecuta el siguiente procedimiento.

Nota: Sustituye los valores siguientes por los tuyos:

  • example-server por el nombre de tu 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 tu nombre de usuario
  • example-SMTP-password por tu contraseña

Si utilizas un servidor de SMTP local o Amazon EC2 como servidor de SMTP, sustituye la información de Amazon SES por los detalles de tu 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, comprueba que tus 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”

Identifica el objeto que no tiene acceso y, a continuación, concede los permisos necesarios. Por ejemplo, si faltan ciertos permisos para los objetos propiedad de SYS, como DBA_directories para example-username, ejecuta 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 asignaste 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, ejecuta 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 configuras 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úrate de configurar correctamente la red. También puedes revisar los registros de flujo de la VPC para obtener la siguiente información:

  • Analiza las direcciones IP de origen y destino: en los registros de flujo de la VPC, comprueba que los datos que se transmiten desde las direcciones IP de origen y destino reciban respuestas.
  • Revisa el puerto y el protocolo: confirma que el puerto y el protocolo utilizados sean correctos y que no haya discrepancias inusuales.
  • ACL de la red y grupos de seguridad: comprueba 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: verifica 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: busca 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, consulta 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 has 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, configura una identidad de dominio o crea una identidad de dirección de correo electrónico. Para obtener más información, consulta Creating and verifying identities in Amazon SES (Creación y verificación de identidades en Amazon SES).

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

Ejecuta 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

Visión general de Email Delivery en el sitio web de Oracle.

UTL_SMTP en el sitio web de Oracle.

OFICIAL DE AWSActualizada hace 3 años