Come faccio a inviare un'e-mail dalla mia istanza Amazon RDS per Oracle database?
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:
- Usa Amazon SES per configurare il server di posta SMTP.
- Crea un endpoint VPC per Amazon SES.
- Avvia un'istanza Linux di Amazon Elastic Compute Cloud (Amazon EC2). Quindi, utilizza il certificato appropriato per configurare il client e il portafoglio Oracle.
- Carica il portafoglio in un bucket Amazon Simple Storage Service (Amazon S3).
- Usa l'integrazione Amazon S3 per scaricare il portafoglio dal bucket Amazon S3 al server Amazon RDS.
- 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.
- 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:
-
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. -
Apri l'interfaccia della linea di comando AWS.
-
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.
-
Esegui il comando seguente per scaricare il certificato AmazonRootCA1:
wget https://www.amazontrust.com/repository/AmazonRootCA1.pem
-
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:
-
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/
-
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:
- Apri la console Amazon RDS e crea un gruppo di opzioni.
- Aggiungete l'opzione S3_INTEGRATION al gruppo di opzioni.
- Crea un'istanza database con il gruppo di opzioni.
- 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.
- 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
Contenuto pertinente
- AWS UFFICIALEAggiornata 3 anni fa
- AWS UFFICIALEAggiornata un anno fa
- AWS UFFICIALEAggiornata un anno fa