Wie konfiguriere ich meine Instance von Amazon RDS for Oracle, um E-Mails zu versenden?

Lesedauer: 7 Minute
0

Ich möchte meine DB-Instance von Amazon Relational Database Service (Amazon RDS) for Oracle zum Senden von E-Mails konfigurieren.

Kurzbeschreibung

Um eine E-Mail von einer Instance von Amazon RDS for Oracle zu senden, können Sie UTL_MAIL- oder UTL_SMTP-Pakete verwenden.

  • Um UTL_MAIL mit RDS for Oracle zu verwenden, müssen Sie die Option UTL_MAIL in der nicht standardmäßigen Optionsgruppe hinzufügen, die an die Instance angehängt ist. Weitere Informationen zum Konfigurieren von UTL_MAIL finden Sie unter ORACLE UTL_MAIL.
  • Um UTL_SMTP mit RDS for Oracle zu verwenden, müssen Sie einen SMTP-Server auf einem On-Premises-Computer oder einer Amazon Elastic Compute Cloud (Amazon EC2)-Instance mit Amazon Simple Email Service (Amazon SES) konfigurieren. Stellen Sie in diesem Fall sicher, dass die Konnektivität von RDS for Oracle zum SMTP-Server korrekt konfiguriert ist.

Dieser Artikel konzentriert sich auf die Konfiguration der DB-Instance für das Senden von E-Mails über das UTL_SMTP-Paket mit Amazon SES.

Stellen Sie als Voraussetzung sicher, dass der Amazon-SES-Endpunkt von der RDS-Instance aus zugänglich ist. Wenn Ihre RDS-Instance in einem privaten Subnetz ausgeführt wird, müssen Sie ein NAT-Gateway in der Routing-Tabelle des Subnetzes hinzufügen. Dies ist erforderlich, damit das Subnetz mit dem Amazon-SES-Endpunkt kommunizieren kann. Um die Routing-Tabelle des Subnetzes zu überprüfen, öffnen Sie die Amazon-VPC-Konsole und wählen Sie im Navigationsbereich Routing-Tabellen aus.

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

  1. Richten Sie den SMTP-Mailserver ein. In diesem Artikel wird Amazon SES für die Einrichtung des SMTP-Mailservers verwendet.
  2. Erstellen Sie eine Amazon-EC2-Instance. Konfigurieren Sie anschließend den Oracle-Client und das Wallet mit dem entsprechenden Zertifikat.
  3. Laden Sie das Wallet in einen Amazon Simple Storage Service (Amazon S3)-Bucket hoch.
  4. Laden Sie das Wallet mithilfe der S3-Integration aus dem Amazon-S3-Bucket auf den RDS-Server herunter.
  5. Erteilen Sie dem Benutzer die erforderlichen Berechtigungen (wenn der Benutzer kein Haupt-Benutzer ist) und erstellen Sie die erforderlichen Zugriffskontrolllisten (ACLs).
  6. Senden Sie die E-Mail mit den Amazon-SES-Anmeldeinformationen und dem in diesem Artikel beschriebenen Verfahren.

Auflösung

Einrichten des SMTP-Mailservers mit Amazon SES

Anweisungen finden Sie unter Wie richte ich SMTP über Amazon SES ein und stelle eine Verbindung zu SMTP her?

Erstellen einer Amazon-EC2-Instance und Konfigurieren des Oracle-Clients und des Wallets

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

2.    Installieren Sie den Oracle-Client, der vorzugsweise dieselbe Version wie die der Amazon-RDS-Instance hat. In diesem Artikel wird Oracle-Version 19c verwendet. Sie können den Oracle-19c-Client herunterladen, siehe Oracle-Datenbank 19c (19.3). Diese Version wird auch mit dem orapki-Dienstprogramm geliefert.

3.    Installieren Sie die AWS Command Line Interface (AWS CLI).

4.    Erlauben Sie die Verbindung über den Datenbankport in der RDS-Sicherheitsgruppe von der EC2-Instance aus. Wenn beide Instances dieselbe VPC verwenden, erlauben Sie die Verbindung über ihre privaten IP-Adressen.

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 das Wallet zu erstellen:

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

Hochladen des Wallets auf Amazon S3

1.    Führen Sie den folgenden Befehl aus, um das Wallet in einen Amazon-S3-Bucket hochzuladen:

Hinweis: Stellen Sie sicher, dass sich der S3 Bucket in derselben Region wie die RDS-Instance befindet, damit die S3-Integration funktioniert.

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

Herunterladen des Wallets mithilfe der S3-Integration auf den RDS-Server

1.    Erstellen Sie mithilfe der Amazon-RDS-Konsole eine Optionsgruppe.

2.    Fügen Sie die Option S3_INTEGRATION in die von Ihnen erstellten Optionsgruppe hinzu. Dies ist erforderlich, um die Wallet-Datei von Amazon S3 auf die RDS-Instance herunterzuladen.

3.    Erstellen Sie eine Instance von RDS for Oracle mit der von Ihnen erstellten Optionsgruppe.

4.    Bereiten Sie sich auf die S3-Integration vor, indem Sie eine AWS Identity and Access Management (IAM)-Richtlinie und -Rolle erstellen. Weitere Informationen finden Sie unter Voraussetzungen für Integration von Amazon RDS for Oracle mit Amazon S3.

5.    Führen Sie die folgenden Befehle aus, um das Wallet aus dem S3 Bucket in 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

Erteilen der erforderlichen Berechtigungen an den Benutzer und Erstellen der erforderlichen ACLs

Hinweis: Sie benötigen diesen Schritt, wenn Sie den Nicht-Haupt-Benutzer für RDS for Oracle verwenden.

Führen Sie den folgenden Befehl aus, um dem Nicht-Haupt-Benutzer die erforderlichen Berechtigungen zu erteilen:

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 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: Stellen Sie sicher, dass Sie bei dem Verfahren die folgenden Werte ersetzen:

  • example-server mit dem Namen Ihres SMTP-Mailservers
  • example-sender-email mit der E-Mail-Adresse des Senders
  • example-receiver-email mit der E-Mail-Adresse des Empfängers
  • example-SMTP-username mit Ihrem Benutzernamen
  • example-SMTP-Passwort mit Ihrem Passwort

Wenn Sie On-Premises oder Amazon EC2 als SMTP-Server verwenden, sollten Sie sicherstellen, dass Sie die Informationen zum lokalen oder EC2-Server anstelle von Amazon SES verwenden.

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

Fehlerbehebung

ORA-29279: Wenn Ihr SMTP-Benutzername oder Passwort ungenau ist, wird möglicherweise der folgende Fehler angezeigt

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

Um dieses Problem zu beheben, stellen Sie sicher, dass Ihre SMTP-Anmeldeinformationen korrekt sind.

ORA-00942: Wenn das E-Mail-Paket von einem Nicht-Haupt-Benutzer ausgeführt wird, wird möglicherweise der folgende Fehler angezeigt:

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

Um dieses Problem zu beheben, erteilen Sie dem Benutzer die erforderlichen Berechtigungen, indem Sie das folgende Verfahren ausführen:

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

ORA-24247: Wenn entweder dem Zielhost keine ACL zugewiesen ist oder der Benutzer nicht über die erforderlichen Berechtigungen für den Zugriff auf den Zielhost verfügt, wird möglicherweise der folgende Fehler angezeigt:

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

Um dieses Problem zu beheben, erstellen Sie eine ACL, und weisen Sie die ACL dem Host zu, indem Sie das folgende Verfahren ausführen:

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

Relevante Informationen

Oracle-Dokumentation für Übersicht über den E-Mail-Zustellservice

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 2 Jahren