Wie sende ich eine E-Mail von meiner Amazon RDS for Oracle DB-Instance?

Lesedauer: 9 Minute
0

Ich möchte meine Amazon Relational Database Service (Amazon RDS) for Oracle DB-Instance für den Versand von E-Mails konfigurieren.

Kurzbeschreibung

Um eine E-Mail von einer RDS for Oracle DB-Instance zu senden, verwenden Sie die Pakete UTL_MAIL oder UTL_SMTP. Um UTL_MAIL mit RDS for Oracle zu verwenden, fügen Sie die Option UTL_MAIL in die nicht standardmäßige Optionsgruppe ein, die an die Instance angehängt ist. Weitere Informationen zur Konfiguration von UTL_MAIL finden Sie unter Oracle UTL_MAIL.

Um ULT_SMTP mit RDS for Oracle zu verwenden, konfigurieren Sie einen SMTP-Server auf einem lokalen Computer oder verwenden Sie Amazon Simple Email Service (Amazon SES). Stellen Sie sicher, dass die Konnektivität von der RDS for Oracle DB-Instance zum SMTP-Server korrekt konfiguriert ist.

Die folgende Lösung erklärt, wie Amazon SES zum Senden von E-Mails über das UTL_SMTP-Paket verwendet wird.

Voraussetzungen

Vergewissern Sie sich, dass Ihr Amazon-SES-Endpunkt von Ihrer RDS-DB-Instance aus zugänglich ist. Wenn Ihre DB-Instance in einem privaten Subnetz läuft, erstellen Sie einen Virtual Private Cloud (VPC)-Endpunkt für Amazon SES.

Hinweis: Für DB-Instances, die in einem privaten Subnetz ausgeführt werden, können Sie auch ein NAT-Gateway verwenden, um mit dem Amazon-SES-Endpunkt zu kommunizieren.

Konfigurieren Sie Ihre DB-Instance für den Versand von E-Mails

Gehen Sie wie folgt vor, um Ihre DB-Instance für den Versand von E-Mails zu konfigurieren:

  1. Verwenden Sie Amazon SES, um den SMTP-Mailserver einzurichten.
  2. Erstellen Sie einen VPC-Endpunkt für Amazon SES.
  3. Erstellen Sie eine Amazon Elastic Compute Cloud (Amazon EC2)-Linux-Instance. Verwenden Sie dann das entsprechende Zertifikat, um den Oracle-Client und die Wallet zu konfigurieren.
  4. Laden Sie die Wallet in einen Amazon Simple Storage Service (Amazon S3)-Bucket hoch.
  5. Verwenden Sie die Amazon-S3-Integration, um die Wallet aus dem Amazon-S3-Bucket auf den Amazon-RDS-Server herunterzuladen.
  6. Erteilen Sie Benutzern, die keine primären Benutzer sind, die erforderlichen Berechtigungen und erstellen Sie dann die erforderlichen Netzwerkzugriffskontrolllisten (Network Access Control Lists, Netzwerk-ACLs).
  7. Verwenden Sie Ihre Amazon-SES-Anmeldeinformationen, um die E-Mail zu senden.

Behebung

Hinweis: Wenn bei der Ausführung von AWS Command Line Interface (AWS CLI)-Befehlen Fehler auftreten, finden Sie weitere Informationen unter Beheben von AWS-CLI-Fehlern. Stellen Sie außerdem sicher, dass Sie die neueste Version von AWS CLI verwenden.

Einrichtung des SMTP-Mailservers

Anweisungen zur Verwendung von Amazon SES zur Einrichtung eines SMTP-Mailservers finden Sie unter Wie richte ich SMTP mithilfe von Amazon SES ein und stelle eine Verbindung dazu her?

Erstellen einer VPC mit Amazon SES

Anweisungen zur Verwendung von Amazon SES zum Erstellen einer VPC finden Sie unter Einrichten von VPC-Endpunkten mit Amazon SES.

Erstellen Sie eine Amazon-EC2-Instance und konfigurieren Sie den Oracle-Client und die Wallet

Führen Sie die folgenden Schritte aus:

  1. Erstellen Sie eine Amazon-EC2-Linux-Instance.

  2. Installieren Sie einen Oracle-Client.
    Hinweis: Es ist eine bewährte Methode, einen Client zu verwenden, der dieselbe Version wie Ihre DB-Instance hat. Für diese Behebung wird Oracle-Version 19c verwendet. Informationen zum Herunterladen dieses Clients finden Sie unter Oracle Database 19c (19.3) auf der Oracle-Website. Diese Version enthält das Tool orapki.

  3. Öffnen Sie die AWS CLI.

  4. Erlauben Sie von der EC2-Instance aus die Verbindung über den Datenbank-Port in der Amazon-RDS-Sicherheitsgruppe. Wenn die DB-Instance und die EC2-Instance dieselbe VPC verwenden, verwenden Sie ihre privaten IP-Adressen, um die Verbindung zuzulassen.

  5. Stellen Sie eine Verbindung zur EC2-Instance her.

  6. Führen Sie den folgenden Befehl aus, um das AmazonRootCA1-Zertifikat herunterzuladen:

    wget https://www.amazontrust.com/repository/AmazonRootCA1.pem
  7. Führen Sie die folgenden Befehle aus, um die Wallet zu erstellen:

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

Laden Sie die Wallet auf Amazon S3 hoch

Führen Sie die folgenden Schritte aus:

  1. Führen Sie den folgenden Befehl aus, um die Wallet in einen Amazon-S3-Bucket hochzuladen:
    Hinweis: Der S3-Bucket muss sich in derselben AWS-Region wie die DB-Instance befinden.

    aws s3 cp cwallet.sso s3://testbucket/
  2. Führen Sie den folgenden Befehl aus, um zu überprüfen, ob die Datei erfolgreich hochgeladen wurde:

    aws s3 ls testbucket

Verwenden Sie die Amazon-S3-Integration, um die Wallet auf den Amazon-RDS-Server herunterzuladen

Führen Sie die folgenden Schritte aus:

  1. Öffnen Sie die Amazon-RDS-Konsole und erstellen Sie dann eine Optionsgruppe.
  2. Fügen Sie die Option S3_INTEGRATION zur Optionsgruppe hinzu.
  3. Erstellen Sie eine DB-Instance mit der Optionsgruppe.
  4. Erstellen einer Richtlinie und Rolle für AWS Identity and Access Management (IAM). Weitere Informationen finden Sie unter Konfiguration von IAM-Berechtigungen für RDS für die Oracle-Integration mit Amazon S3.
  5. Führen Sie die folgenden Befehle aus, um die Wallet aus dem S3-Bucket auf Amazon RDS herunterzuladen:
    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

Für Benutzer, die keine primären Benutzer von RDS for Oracle sind: Gewähren Sie dem Benutzer die erforderlichen Berechtigungen und erstellen Sie die erforderlichen Netzwerk-ACLs

Führen Sie den folgenden Befehl aus, um dem Nicht-Primärbenutzer die erforderlichen Berechtigungen zu gewähren:

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

Führen Sie die folgenden Befehle aus, um die erforderlichen Netzwerk-ACLs zu erstellen:

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

Senden der E-Mail

Führen Sie das folgende Verfahren aus, um die E-Mail zu senden.

Hinweis: Ersetzen Sie die folgenden Werte durch Ihre Werte:

  • example-server durch dem Namen Ihres SMTP-Mailservers
  • example-sender-email durch die Absender-E-Mail-Adresse
  • example-receiver-email durch die E-Mail-Adresse des Empfängers
  • example-SMTP-username durch Ihren Benutzernamen
  • example-SMTP-password durch Ihr Passwort

Wenn Sie einen lokalen SMTP-Server oder Amazon EC2 als SMTP-Server verwenden, ersetzen Sie die Amazon-SES-Informationen durch Ihre lokalen oder EC2-Serverdetails.

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

Fehler beheben

ORA-29279: Wenn Ihr SMTP-Benutzername oder -Passwort falsch ist, wird möglicherweise die folgende Fehlermeldung angezeigt:

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

Stellen Sie sicher, dass Ihre SMTP-Anmeldeinformationen korrekt sind, um dieses Problem zu beheben.

ORA-00942: Wenn ein nicht primärer Benutzer das E-Mail-Paket ausführt, wird möglicherweise die folgende Fehlermeldung angezeigt:

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

Identifizieren Sie das Objekt, das keinen Zugriff hat, und gewähren Sie dann die erforderlichen Berechtigungen. Wenn beispielsweise bestimmte Berechtigungen für SYS-eigene Objekte fehlen, wie DBA_directories für expample-username, führen Sie den folgenden Befehl aus:

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

ORA-24247: Wenn Sie dem Zielhost die Netzwerk-ACL nicht zugewiesen haben, erhalten Sie die folgende Fehlermeldung. Sie erhalten diesen Fehler auch, wenn der Benutzer nicht über die erforderlichen Berechtigungen für den Zugriff auf den Zielhost verfügt:

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

Um dieses Problem zu beheben, führen Sie das folgende Verfahren aus, um eine Netzwerk-ACL zu erstellen und die Netzwerk-ACL dem Host zuzuweisen:

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: Wenn Sie die Sicherheitsgruppen, die Firewall oder die Netzwerk-ACL nicht richtig konfigurieren, erhalten Sie die folgende Fehlermeldung:

„ORA-29278: SMTP transient error: 421 Service not available“

Stellen Sie sicher, dass Sie die Netzwerkkonfiguration korrekt eingerichtet haben, um dieses Problem zu beheben. Sie können die VPC-Flow-Protokolle auch auf die folgenden Informationen überprüfen:

  • Analysieren von Quell- und Ziel-IP-Adressen: Stellen Sie anhand der VPC-Flow-Protokolle sicher, dass Daten, die von den Quell- und Ziel-IP-Adressen übertragen werden, Antworten erhalten.
  • Überprüfen des Ports und des Protokolls: Vergewissern Sie sich, dass der richtige Port und das richtige Protokoll verwendet werden und dass keine ungewöhnlichen Abweichungen vorliegen.
  • Sicherheitsgruppen- und Netzwerk-ACLs: Überprüfen Sie die Sicherheitsgruppen- und Netzwerk-ACL-Konfigurationen, um sicherzustellen, dass sie den Datenverkehr auf dem erforderlichen Port zulassen.
  • Subnetz-Routing: Stellen Sie sicher, dass die Routing-Tabellen in den relevanten Subnetzen korrekt konfiguriert sind, um den Datenverkehr an den Datenbankserver weiterzuleiten.
  • Latenz und Paketverlust: Achten Sie auf Latenz oder Paketverlust. Latenz und Paketverlust können auf Netzwerkprobleme hinweisen.

Weitere Informationen finden Sie unter Protokollieren von IP-Datenverkehr mit VPC Flow Logs und Fehlerbehebung für ORA-29278 und ORA-29279 bei der Verwendung von UTL_SMTP (Doc-ID 2287232.1) auf der Oracle-Website.

ORA-29279: Wenn Sie keine Identität auf Amazon SES erstellt haben, wird möglicherweise die folgende Fehlermeldung angezeigt:

„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'“

Um dieses Problem zu beheben, konfigurieren Sie eine Identität auf Domänenebene oder erstellen Sie eine E-Mail-Adressidentität. Weitere Informationen finden Sie unter Identitäten in Amazon SES erstellen und verifizieren.

Testen Sie die Konnektivität von Amazon RDS zu Ihrem Amazon-SES-Endpunkt

Führen Sie das folgende Verfahren aus, um die Verbindung zwischen Amazon RDS und dem Amazon-SES-Endpunkt zu testen:

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;

Wenn die Prozedur erfolgreich ist, gibt die Funktion 1 zurück. Wenn die Prozedur fehlschlägt, gibt die Funktion ORA -29260 zurück.

Ähnliche Informationen

Überblick über den E-Mail-Zustelldienst auf der Oracle-Website

UTL_SMTP auf der Oracle-Website

AWS OFFICIAL
AWS OFFICIALAktualisiert vor einem Jahr