Come faccio a inviare un'e-mail dalla mia istanza Amazon RDS per Oracle database?

9 minuti di lettura
0

Desidero configurare la mia istanza database di Amazon Relational Database Service (Amazon RDS) per l'invio di e-mail.

Breve descrizione

Per inviare un'e-mail da un'istanza database RDS per Oracle, usa i pacchetti UTL_MAIL o UTL_SMTP. Per utilizzare UTL_MAIL con RDS per Oracle, aggiungi l'opzione UTL_MAIL nel gruppo di opzioni non predefinito associato all'istanza. Per ulteriori informazioni su come configurare UTL_MAIL, vedi Oracle UTL_MAIL.

Per utilizzare ULT_SMTP con RDS per Oracle, configura un server SMTP su un computer locale o utilizza Amazon Simple Email Service (Amazon SES). Verificare che la connettività dall'istanza database RDS per Oracle al server SMTP sia configurata correttamente.

La seguente risoluzione spiega come utilizzare Amazon SES per inviare e-mail tramite il pacchetto UTL_SMTP.

Prerequisiti

Verifica che il tuo endpoint Amazon SES sia accessibile dalla tua istanza database RDS. Se la tua istanza database viene eseguita in una sottorete privata, crea un endpoint di cloud privato virtuale (VPC) per Amazon SES.

Nota: Per le istanze database eseguite in una sottorete privata, puoi anche utilizzare un gateway NAT per comunicare con l'endpoint Amazon SES.

Configura la tua istanza database per inviare e-mail

Per configurare la tua istanza database per l'invio di e-mail, completa i seguenti passaggi:

  1. Usa Amazon SES per configurare il server di posta SMTP.
  2. Crea un endpoint VPC per Amazon SES.
  3. Avvia un'istanza Linux di Amazon Elastic Compute Cloud (Amazon EC2). Quindi, utilizza il certificato appropriato per configurare il client e il portafoglio Oracle.
  4. Carica il portafoglio in un bucket Amazon Simple Storage Service (Amazon S3).
  5. Usa l'integrazione Amazon S3 per scaricare il portafoglio dal bucket Amazon S3 al server Amazon RDS.
  6. Per gli utenti non primari, concedi le autorizzazioni richieste agli utenti, quindi crea le liste di controllo degli accessi alla rete (ACL di rete) richiesti.
  7. Usa le tue credenziali Amazon SES per inviare l'e-mail.

Risoluzione

Nota: Se ricevi messaggi di errore durante l'esecuzione dei comandi dell'interfaccia della linea di comando AWS (AWS CLI), consulta la sezione Troubleshoot AWS CLI errors. Inoltre, assicurati di utilizzare la versione più recente di AWS CLI.

Configura il server di posta SMTP

Per istruzioni su come utilizzare Amazon SES per configurare un server di posta SMTP, consulta Come faccio a configurare e connettermi a SMTP utilizzando Amazon SES?

Crea VPC con Amazon SES

Per istruzioni su come utilizzare Amazon SES per creare un VPC, consulta Configurare gli endpoint VPC con Amazon SES.

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

Completa i seguenti passaggi:

  1. Crea un'istanza Amazon EC2 Linux.

  2. Installa un client Oracle.
    Nota: È consigliabile utilizzare un client con la stessa versione dell'istanza database. In questa risoluzione, viene utilizzata la versione 19c di Oracle. Per scaricare questo client, consulta Oracle Database 19c (19.3) sul sito Web di Oracle. Questa versione viene fornita con l'utilità orapki.

  3. Apri l'interfaccia della linea di comando AWS.

  4. Dall'istanza EC2, consenti la connessione sulla porta del database nel gruppo di sicurezza Amazon RDS. Se l'istanza database e l'istanza EC2 utilizzano lo stesso VPC, utilizza i loro indirizzi IP privati per consentire la connessione.

  5. Connettiti all'istanza EC2.

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

    wget https://www.amazontrust.com/repository/AmazonRootCA1.pem
  7. Esegui i seguenti comandi per creare il portafoglio:

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

Carica il portafoglio su Amazon S3

Completa i seguenti passaggi:

  1. Esegui il seguente comando per caricare il portafoglio in un bucket Amazon S3:
    Nota: Il bucket S3 deve trovarsi nella stessa regione AWS dell'istanza database.

    aws s3 cp cwallet.sso s3://testbucket/
  2. Esegui il comando seguente per verificare che il file sia stato caricato correttamente:

    aws s3 ls testbucket

Usa l'integrazione con Amazon S3 per scaricare il portafoglio sul server Amazon RDS

Completa i seguenti passaggi:

  1. Apri la console Amazon RDS e crea un gruppo di opzioni.
  2. Aggiungete l'opzione S3_INTEGRATION al gruppo di opzioni.
  3. Crea un'istanza database con il gruppo di opzioni.
  4. Crea una policy e un ruolo di AWS Identity and Access Management (IAM). Per ulteriori informazioni, consulta Configurazione delle autorizzazioni IAM per l'integrazione di RDS for Oracle con Amazon S3.
  5. Esegui i seguenti comandi per scaricare il portafoglio su Amazon 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

Per utenti RDS non primari per utenti Oracle: Concedi le autorizzazioni richieste all'utente e crea gli ACL di rete richiesti

Esegui il comando seguente per concedere le autorizzazioni richieste all'utente non primario:

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 di rete richiesti:

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

Per inviare l'e-mail, esegui la seguente procedura.

Nota: Sostituisci i seguenti valori con i tuoi valori:

  • example-server con il nome del tuo 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 un server SMTP locale o Amazon EC2 come server SMTP, sostituisci le informazioni di Amazon SES con i dettagli del tuo server locale o 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;  
/

Risolvere gli errori

ORA-29279: Se il nome utente o la password SMTP non sono accurati, potresti ricevere il seguente errore:

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

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

ORA-00942: Se un utente non primario esegue il pacchetto di posta elettronica, potresti ricevere il seguente errore:

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

Identifica l'oggetto che non ha accesso e quindi concedi le autorizzazioni richieste. Ad esempio, se mancano determinate autorizzazioni per gli oggetti di proprietà di Sys, come DBA_directories per expample-username, esegui il seguente comando:

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

ORA-24247: Se non hai assegnato l'ACL di rete all'host di destinazione, viene visualizzato il seguente errore. Viene visualizzato questo errore anche quando l'utente non dispone delle autorizzazioni necessarie per accedere all'host di destinazione:

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

Per risolvere questo problema, esegui la seguente procedura per creare un ACL di rete e assegnarlo all'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: Se non configuri correttamente i gruppi di sicurezza, il firewall o l'ACL di rete, viene visualizzato il seguente errore:

"ORA-29278: SMTP transient error: 421 Service not available"

Per risolvere questo problema, assicurati di aver impostato correttamente la configurazione di rete. Puoi anche consultare i log di flusso VPC per le seguenti informazioni:

  • Analizza gli indirizzi IP di origine e destinazione: Dai log di flusso VPC, verifica che i dati trasmessi dagli indirizzi IP di origine e di destinazione ricevano risposte.
  • Ispeziona porta e protocollo: Verifica che siano utilizzati la porta e il protocollo corretti e che non vi siano discrepanze insolite.
  • ACL di rete e gruppo di sicurezza: Controlla le configurazioni ACL del gruppo di sicurezza e della rete per confermare che consentano il traffico sulla porta necessaria.
  • Routing delle sottoreti: Verifica che le tabelle di routing nelle sottoreti pertinenti siano configurate correttamente per indirizzare il traffico al server del database.
  • Latenza e perdita di pacchetti: Cerca latenza o perdita di pacchetti. La latenza e la perdita di pacchetti potrebbero indicare problemi di rete.

Per ulteriori informazioni, consulta Registrazione del traffico IP utilizzando i log di flusso VPC e Risoluzione dei problemi ORA-29278 e ORA-29279 quando utilizzi UTL_SMTP (ID documento 2287232.1) sul sito Web di Oracle.

ORA-29279: Se non hai creato un'identità su Amazon SES, potresti ricevere il seguente errore:

"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'"

Per risolvere questo problema, configura un'identità a livello di dominio o crea un'identità di indirizzo e-mail. Per ulteriori informazioni, consulta Creazione e verifica delle identità in Amazon SES.

Verifica la connettività da Amazon RDS al tuo endpoint Amazon SES

Esegui la seguente procedura per testare la connessione tra Amazon RDS e l'endpoint 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;

Se la procedura ha esito positivo, la funzione restituisce 1. Se la procedura fallisce, la funzione restituisce ORA-29260.

Informazioni correlate

Panoramica del servizio di consegna delle e-mail sul sito Web di Oracle

UTL_SMTP sul sito Web di Oracle

AWS UFFICIALE
AWS UFFICIALEAggiornata un anno fa