¿Cómo configuro mi instancia de Amazon RDS for Oracle para que envíe correos electrónicos?

Última actualización: 16-11-2021

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

Descripción corta

Para enviar un correo electrónico desde una instancia de Amazon RDS for Oracle, puede usar los paquetes UTL_MAIL o UTL_SMTP.

  • Para usar UTL_MAIL con RDS for Oracle, debe agregar la opción UTL_MAIL en el grupo de opciones no predeterminado adjunto a la instancia. Para obtener más información sobre la configuración de UTL_MAIL, consulte ORACLE UTL_MAIL.
  • Para usar UTL_SMTP con RDS for Oracle, debe configurar un servidor SMTP en una máquina local o una instancia de Amazon Elastic Compute Cloud (Amazon EC2) mediante Amazon Simple Email Service (Amazon SES). En este caso, asegúrese de que la conectividad de RDS for Oracle al servidor SMTP esté configurada correctamente.

Este artículo se centra en la configuración de la instancia de base de datos para que envíe correos electrónicos a través del paquete UTL_SMTP mediante Amazon SES.

Como requisito previo, asegúrese de que el punto de enlace de Amazon SES sea accesible desde la instancia de RDS. Si su instancia de RDS se ejecuta en una subred privada, debe agregar una puerta de enlace NAT en la tabla de enrutamiento de la subred. Esto es necesario para que la subred se comunique con el punto de enlace de Amazon SES. Para comprobar la tabla de rutas de la subred, abra la consola de Amazon VPC y elija Route Tables (Tablas de enrutamiento) en el panel de navegación.

Para configurar la instancia de base de datos para que envíe correos electrónicos, haga lo siguiente:

  1. Configure el servidor de correo SMTP. En este artículo, Amazon SES se utiliza para configurar el servidor de correo SMTP.
  2. Cree una instancia de Amazon EC2. A continuación, configure el cliente y la cartera de Oracle con el certificado apropiado.
  3. Cargue la cartera en un bucket de Amazon Simple Storage Service (Amazon S3).
  4. Descargue la cartera desde el bucket de Amazon S3 al servidor RDS mediante la integración de S3.
  5. Otorgue los privilegios de usuario requeridos (si el usuario no es un usuario maestro) y cree las listas de control de acceso (ACL) requeridas.
  6. Envíe el correo electrónico mediante las credenciales de Amazon SES y el procedimiento que se proporciona en este artículo.

Resolución

Configurar el servidor de correo SMTP mediante Amazon SES

Para ver más instrucciones, consulte ¿Cómo configuro y me conecto a SMTP con Amazon SES?

Crear una instancia de Amazon EC2 y configurar el cliente y la cartera de Oracle

1.    Cree una instancia de Linux de Amazon EC2.

2.    Instale el cliente de Oracle que preferiblemente tenga la misma versión que la de la instancia de Amazon RDS. En este artículo, se utiliza la versión 19c de Oracle. Puede descargar el cliente Oracle 19c; consulteBase de datos de Oracle 19c (19.3). Esta versión también viene con la utilidad orapki.

3.    Instale AWS Command Line Interface (AWS CLI).

4.    Permita la conexión en el puerto de la base de datos en el grupo de seguridad de RDS desde la instancia EC2. Si ambas instancias usan la misma VPC, permita la conexión a través de sus direcciones IP privadas.

5.    Conéctese a la instancia 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

1.    Ejecute el siguiente comando para cargar la cartera en un bucket de Amazon S3:

Nota: Asegúrese de que el bucket de S3 esté en la misma región que la instancia de RDS para que la integración de S3 funcione.

aws s3 cp cwallet.sso s3://testbucket/
2.    Ejecute el siguiente comando para verificar si el archivo se cargó correctamente:
aws s3 ls testbucket

Descargue la cartera en el servidor RDS mediante la integración con S3

1.    Cree un grupo de opciones mediante la consola de Amazon RDS.

2.    Agregue la opción S3_INTEGRATION en el grupo de opciones que creó. Esto es necesario para descargar el archivo de cartera de Amazon S3 a la instancia de RDS.

3.    Cree una instancia de RDS for Oracle con el grupo de opciones que creó.

4.    Prepárese para la integración de S3 mediante la creación de una política y un rol de AWS Identity and Access Management (IAM). Para obtener más información, consulte Requisitos previos para la integración de Amazon RDS for Oracle con Amazon S3.

5.    Ejecute los siguientes comandos para descargar la cartera en 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

Otorgar los privilegios requeridos al usuario y crear las ACL requeridas

Nota: Necesita este paso si utiliza un usuario no maestro para RDS for Oracle.

Ejecute el siguiente comando para otorgar los privilegios necesarios al usuario no maestro:

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

Enviar el correo electrónico

Ejecute el siguiente procedimiento para enviar el correo electrónico:

Nota: Asegúrese de sustituir los siguientes valores en el procedimiento:

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

Si utiliza Amazon EC2 local o como servidor SMTP, asegúrese de usar la información relacionada con el servidor local o EC2 en lugar de Amazon SES.

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 problemas de errores

ORA-29279: Si su nombre de usuario o contraseña SMTP son incorrectos, es posible que aparezca el siguiente error

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

Para resolver este problema, compruebe que sus credenciales SMTP sean correctas.

ORA-00942: Si el paquete de correo electrónico lo ejecuta un usuario no maestro, es posible que aparezca el siguiente error:

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

Para resolver este problema, conceda los permisos necesarios al usuario mediante la ejecución del siguiente procedimiento:

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

ORA-24247: Si no se asigna una ACL al host de destino o el usuario no tiene los privilegios necesarios para acceder al host de destino, es posible que aparezca el siguiente error:

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

Para resolver este problema, cree una ACL y asigne la ACL al host mediante la ejecución del siguiente procedimiento:

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

¿Le resultó útil este artículo?


¿Necesita asistencia técnica o con la facturación?