Comment configurer mon instance Amazon RDS for Oracle pour envoyer des e-mails ?

Dernière mise à jour : 16/11/2021

Je souhaite configurer mon instance de base de données Amazon Relational Database Service (Amazon RDS) for Oracle afin d'envoyer des e-mails.

Brève description

Pour envoyer un e-mail à partir d'une instance Amazon RDS for Oracle, vous pouvez utiliser les packages UTL_MAIL ou UTL_SMTP.

  • Pour utiliser UTL_MAIL avec RDS for Oracle, vous devez ajouter l'option UTL_MAIL dans le groupe d'options qui n'est pas associé par défaut à l'instance. Pour plus d'informations sur la configuration d'UTL_MAIL, veuillez consulter ORACLE UTL_MAIL.
  • Pour utiliser UTL_SMTP avec RDS for Oracle, vous devez configurer un serveur SMTP sur une machine sur site ou sur une instance Amazon Elastic Compute Cloud (Amazon EC2) à l'aide d'Amazon Simple Email Service (Amazon SES). Dans ce cas, assurez-vous que la connectivité entre RDS for Oracle et le serveur SMTP soit correctement configurée.

Cet article se concentre sur la configuration de l'instance de base de données pour envoyer des e-mails via le package UTL_SMTP à l'aide d'Amazon SES.

Comme condition préalable, assurez-vous que le point de terminaison Amazon SES est accessible depuis l'instance RDS. Si votre instance RDS s'exécute dans un sous-réseau privé, vous devez ajouter une passerelle NAT dans la table de routage du sous-réseau. Cette opération est nécessaire pour que le sous-réseau puisse communiquer avec le point de terminaison Amazon SES. Pour vérifier la table de routage du sous-réseau, ouvrez la console Amazon VPC et choisissez Tables de routage dans le panneau de navigation.

Pour configurer votre instance de base de données afin d'envoyer des e-mails, procédez comme suit :

  1. Configurez le serveur de messagerie SMTP. Dans cet article, Amazon SES est utilisé pour configurer le serveur de messagerie SMTP.
  2. Créez une instance Amazon EC2. Configurez ensuite le client et le wallet Oracle à l'aide du certificat approprié.
  3. Chargez le wallet dans un compartiment Amazon Simple Storage Service (Amazon S3).
  4. Téléchargez le wallet depuis le compartiment Amazon S3 vers le serveur RDS à l'aide de l'intégration S3.
  5. Accordez les privilèges requis à l'utilisateur (s'il n'est pas un utilisateur principal) et créez les listes de contrôle d'accès (ACL) requises.
  6. Envoyez l'e-mail en utilisant les informations d'identification Amazon SES et la procédure décrite dans cet article.

Résolution

Configurez le serveur de messagerie SMTP à l'aide d'Amazon SES

Créez une instance Amazon EC2 et configurez le client et le wallet Oracle

1.    Créez une instance Linux Amazon EC2.

2.    Installez le client Oracle qui a de préférence la même version que celle de l'instance Amazon RDS. Dans cet article, la version 19c d'Oracle est utilisée. Vous pouvez télécharger le client Oracle 19c, veuillez pour ce faire consulter Oracle Database 19c (19.3). Cette version est également livrée avec l'utilitaire orapki.

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

4.    Autorisez la connexion sur le port de base de données du groupe de sécurité RDS à partir de l'instance EC2. Si les deux instances utilisent le même VPC, autorisez la connexion via leurs adresses IP privées.

5.    Connectez-vous à l'instance EC2.

6.    Exécutez la commande suivante pour télécharger le certificat AmazonRootCA1.

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

7.    Exécutez les commandes suivantes pour créer le wallet :

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

Chargez le wallet sur Amazon S3

1.    Exécutez la commande suivante pour charger le wallet vers un compartiment Amazon S3 :

Remarque : assurez-vous que le compartiment S3 se trouve dans la même région que l'instance RDS pour que l'intégration S3 fonctionne.

aws s3 cp cwallet.sso s3://testbucket/
2.    Exécutez la commande suivante pour vérifier si le fichier a été téléchargé avec succès :
aws s3 ls testbucket

Téléchargez le wallet sur le serveur RDS à l'aide de l'intégration S3

1.    Créez un groupe d'options à l'aide de la console Amazon RDS.

2.    Ajoutez l'option S3_INTEGRATION dans le groupe d'options que vous avez créé. Cette opération est nécessaire pour télécharger le fichier de wallet d'Amazon S3 vers l'instance RDS.

3.    Créez une instance RDS for Oracle avec le groupe d'options que vous avez créé.

4.    Préparez-vous à l'intégration S3 en créant une stratégie et un rôle AWS Identity and Access Management (IAM). Pour plus d'informations, veuillez consulter Conditions préalables à l'intégration d'Amazon RDS for Oracle avec Amazon S3.

5.    Exécutez les commandes suivantes pour télécharger le wallet dans RDS à partir du compartiment 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

Accordez les privilèges requis à l'utilisateur et créez les listes de contrôle d'accès (ACL) requises

Remarque : vous avez besoin de cette étape si vous utilisez l'utilisateur non principal pour RDS for Oracle.

Exécutez la commande suivante pour accorder les privilèges requis à l'utilisateur non principal :

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

Exécutez les commandes suivantes pour créer les ACL requises :

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

Envoyer l'e-mail

Exécutez la procédure suivante pour envoyer l'e-mail :

Remarque : assurez-vous de remplacer les valeurs suivantes dans la procédure :

  • example-server par le nom de votre serveur de messagerie SMTP
  • example-sender-email par l'adresse e-mail de l'expéditeur
  • example-receiver-email par l'adresse e-mail du destinataire
  • example-SMTP-username par votre nom d'utilisateur
  • example-SMTP-password par votre mot de passe

Si vous utilisez une machine sur site ou une instance Amazon EC2 comme serveur SMTP, veillez à utiliser les informations relatives au serveur sur site ou à l’instance EC2 au lieu d'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;
/

Dépannage des erreurs

ORA-29279 : si votre nom d'utilisateur ou votre mot de passe SMTP est inexact, l'erreur suivante peut survenir

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

Pour résoudre ce problème, vérifiez que vos informations d'identification SMTP sont exactes.

ORA-00942 : si le package de messagerie est exécuté par un utilisateur non principal, l'erreur suivante peut survenir :

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

Pour résoudre ce problème, accordez les autorisations requises à l'utilisateur en exécutant la procédure suivante :

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

ORA-24247 : si une liste de contrôle d'accès (ACL) n'est pas attribuée à l'hôte cible ou si l'utilisateur ne dispose pas des privilèges requis pour accéder à l'hôte cible, l'erreur suivante peut survenir :

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

Pour résoudre ce problème, créez une liste de contrôle d'accès (ACL) et attribuez-la à l'hôte en exécutant la procédure suivante :

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

Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?