Come posso configurare la mia istanza Amazon RDS for Oracle per l'invio di e-mail?

7 minuti di lettura
0

Voglio configurare il mio Amazon Relational Database Service (Amazon RDS) per l'istanza database di Oracle per l'invio di e-mail.

Breve descrizione

Per inviare un'e-mail da un'istanza Amazon RDS for Oracle, puoi utilizzare pacchetti UTL_MAIL o UTL_SMTP.

  • Per utilizzare UTL_MAIL con RDS for Oracle, devi aggiungere l'opzione UTL_MAIL nel gruppo di opzioni non predefinito associato all'istanza. Per ulteriori informazioni sulla configurazione di UTL_MAIL, consulta ORACLE UTL_MAIL.
  • Per utilizzare UTL_SMTP con RDS for Oracle, devi configurare un server SMTP su una macchina on-premise o un'istanza Amazon Elastic Compute Cloud (Amazon EC2) utilizzando Amazon Simple Email Service (Amazon SES). In questo caso, assicurati che la connettività da RDS for Oracle al server SMTP sia configurata correttamente.

Questo articolo si concentra sulla configurazione dell'istanza database per l'invio di e-mail tramite il pacchetto UTL_SMTP utilizzando Amazon SES.

Come prerequisito, assicurati che l'endpoint Amazon SES sia accessibile dall'istanza RDS. Se l'istanza RDS viene eseguita in una sottorete privata, devi aggiungere un gateway NAT nella tabella di routing della sottorete. Questo è necessario affinché la sottorete comunichi con l'endpoint Amazon SES. Per controllare la tabella di routing della sottorete, apri la console Amazon VPC e scegli Tabelle di routing nel pannello di navigazione.

Per configurare l'istanza database per l'invio di e-mail, procedi come segue:

  1. Configura il server di posta SMTP. In questo articolo, Amazon SES viene utilizzato per configurare il server di posta SMTP.
  2. Crea un'istanza Amazon EC2. Quindi, configura il client e il wallet Oracle utilizzando il certificato appropriato.
  3. Carica il wallet su un bucket Amazon Simple Storage Service (Amazon S3).
  4. Scarica il wallet dal bucket Amazon S3 al server RDS utilizzando l'integrazione S3.
  5. Concedi i privilegi necessari all'utente (se l'utente non è un utente principale) e crea le liste di controllo accessi (ACL, access control list) necessarie.
  6. Invia l'e-mail utilizzando le credenziali Amazon SES e la procedura fornita in questo articolo.

Risoluzione

Configura il server di posta SMTP utilizzando Amazon SES

Per istruzioni, consulta Come posso configurare e connettermi a SMTP tramite Amazon SES?

Crea un'istanza Amazon EC2 e configura il client e il wallet Oracle

1.    Crea un'istanza Linux Amazon EC2.

2.    Installa il client Oracle che preferibilmente dispone della stessa versione dell'istanza Amazon RDS. In questo articolo viene utilizzata la versione 19c di Oracle. Puoi scaricare il client Oracle 19c, consulta Oracle Database 19c (19.3). Questa versione viene fornita anche con l'utility orapki.

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

4.    Permetti la connessione sulla porta del database nel gruppo di sicurezza RDS dall'istanza EC2. Se entrambe le istanze utilizzano lo stesso VPC, permetti la connessione tramite i loro indirizzi IP privati.

5.    Connettiti all'istanza EC2.

6.    Esegui il seguente comando per scaricare il certificato AmazonRootCA1.

wget https://www.amazontrust.com/repository/AmazonRootCA1.pem

7.    Esegui i seguenti comandi per creare il wallet:

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

Carica il wallet su Amazon S3

1.    Esegui il seguente comando per caricare il wallet su un bucket Amazon S3:

Nota: assicurati che il bucket S3 si trovi nella stessa Regione dell'istanza RDS affinché l'integrazione S3 funzioni.

aws s3 cp cwallet.sso s3://testbucket/

2.    Esegui il seguente comando per verificare se il file è stato caricato correttamente:

aws s3 ls testbucket

Scarica il wallet sul server RDS utilizzando l'integrazione S3

1.    Crea un gruppo di opzioni utilizzando la console Amazon RDS.

2.    Aggiungi l'opzione S3_INTEGRATION nel gruppo di opzioni creato. Questa opzione è necessaria per scaricare il file wallet da Amazon S3 all'istanza RDS.

3.    Crea un'istanza RDS for Oracle con il gruppo di opzioni creato.

4.    Preparati per l'integrazione con S3 creando una policy e un ruolo di AWS Identity and Access Management (IAM). Per ulteriori informazioni, consulta Prerequisiti per l'integrazione di Amazon RDS for Oracle con Amazon S3.

5.    Esegui i seguenti comandi per scaricare il wallet in RDS dal bucket 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

Concedi i privilegi necessari all'utente e creare gli ACL necessari

Nota: è necessario questo passaggio se utilizzi l'utente non principale per RDS for Oracle.

Esegui il seguente comando per concedere i privilegi necessari all'utente non principale:

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

Esegui i seguenti comandi per creare gli ACL necessari:

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

Invia l'e-mail

Esegui la seguente procedura per inviare l'e-mail:

Nota: assicurati di sostituire i seguenti valori nella procedura:

  • example-server con il nome del server di posta SMTP
  • example-sender-email con l'indirizzo e-mail del mittente
  • example-receiver-email con l'indirizzo e-mail del destinatario
  • example-SMTP-username con il tuo nome utente
  • example-SMTP-password con la tua password

Se utilizzi il server SMTP on-premise o Amazon EC2, assicurati di utilizzare le informazioni relative al server on-premise o EC2 anziché 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;
/

Risoluzione degli errori

ORA-29279: se il nome utente o la password SMTP non sono corretti, è possibile che venga visualizzato il seguente errore

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

Per risolvere questo problema, verifica che le credenziali SMTP siano corrette.

ORA-00942: se il pacchetto e-mail è eseguito da un utente non principale, è possibile che venga visualizzato il seguente errore:

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

Per risolvere questo problema, concedi all'utente le autorizzazioni necessarie eseguendo la seguente procedura:

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

ORA-24247: se un ACL non è assegnato all'host di destinazione o se l'utente non dispone dei privilegi necessari per accedere all'host di destinazione, è possibile che venga visualizzato il seguente errore:

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

Per risolvere questo problema, crea un ACL e assegna l'ACL all'host eseguendo la procedura seguente:

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

Informazioni correlate

Documentazione Oracle per Panoramica del servizio di recapito e-mail

AWS UFFICIALE
AWS UFFICIALEAggiornata 2 anni fa