Comment envoyer un e-mail depuis mon instance de base de données Amazon RDS pour Oracle ?

Lecture de 10 minute(s)
0

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

Brève description

Pour envoyer un e-mail depuis une instance de base de données RDS pour Oracle, utilisez les packages UTL_MAIL ou UTL_SMTP. Pour utiliser UTL_MAIL avec RDS pour Oracle, ajoutez l’option UTL_MAIL dans le groupe d’options autre que celui par défaut qui est attaché à l’instance. Pour plus d’informations sur la configuration d’UTL_MAIL, consultez Oracle UTL_MAIL.

Pour utiliser ULT_SMTP avec RDS pour Oracle, configurez un serveur SMTP sur une machine locale ou utilisez Amazon Simple Email Service (Amazon SES). Vérifiez que la connectivité entre l’instance de base de données RDS pour Oracle et le serveur SMTP est correctement configurée.

La résolution suivante explique comment utiliser Amazon SES pour envoyer des e-mails via le package UTL_SMTP.

Prérequis

Vérifiez que votre point de terminaison Amazon SES est accessible depuis votre instance de base de données RDS. Si votre instance de base de données s’exécute dans un sous-réseau privé, créez un point de terminaison de cloud privé virtuel (VPC) pour Amazon SES.

Remarque : pour les instances de base de données qui s’exécutent dans un sous-réseau privé, vous pouvez également utiliser une passerelle NAT pour communiquer avec le point de terminaison Amazon SES.

Configurez votre instance de base de données pour envoyer des e-mails

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

  1. Utilisez Amazon SES pour configurer le serveur de messagerie SMTP.
  2. Créez un point de terminaison VPC pour Amazon SES.
  3. Créez une instance Linux Amazon Elastic Compute Cloud (Amazon EC2). Utilisez ensuite le certificat approprié pour configurer le client et le portefeuille Oracle.
  4. Téléchargez le portefeuille dans un compartiment Amazon Simple Storage Service (Amazon S3).
  5. Utilisez l’intégration Amazon S3 pour télécharger le portefeuille depuis le compartiment Amazon S3 vers le serveur Amazon RDS.
  6. Pour les utilisateurs non principaux, accordez les autorisations requises aux utilisateurs, puis créez les listes de contrôle d’accès réseau requises (ACL réseau).
  7. Utilisez vos informations d’identification Amazon SES pour envoyer l’e-mail.

Résolution

Remarque : si des erreurs surviennent lorsque vous exécutez des commandes de l’interface de la ligne de commande AWS (AWS CLI), consultez la page Résoudre les erreurs liées à AWS CLI. Vérifiez également que vous utilisez la version la plus récente de l'interface AWS CLI.

Configuration du serveur de messagerie SMTP

Pour savoir comment utiliser Amazon SES pour configurer un serveur de messagerie SMTP, consultez Comment configurer et me connecter à SMTP à l’aide d'Amazon SES ?

Créez un VPC avec Amazon SES

Pour savoir comment utiliser Amazon SES pour créer un VPC, consultez Configuration des points de terminaison VPC avec Amazon SES.

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

Procédez comme suit :

  1. Créez une instance Amazon EC2 Linux.

  2. Installez un client Oracle.
    Remarque : il est recommandé d’utiliser un client qui possède la même version que votre instance de base de données. Dans cette résolution, la version 19c d’Oracle est utilisée. Pour télécharger ce client, consultez la base de données Oracle 19c (19.3) sur le site Web d’Oracle. Cette version est fournie avec l’utilitaire orapki.

  3. Ouvrez l’interface de ligne de commande AWS.

  4. À partir de l’instance EC2, autorisez la connexion sur le port de base de données du groupe de sécurité Amazon RDS. Si l’instance de base de données et l’instance EC2 utilisent le même VPC, utilisez leurs adresses IP privées pour autoriser la connexion.

  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 portefeuille :

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

Téléchargez le portefeuille sur Amazon S3

Procédez comme suit :

  1. Exécutez la commande suivante pour charger le portefeuille dans un compartiment Amazon S3 :
    Remarque : le compartiment S3 doit se trouver dans la même région AWS que l’instance de base de données.

    aws s3 cp cwallet.sso s3://testbucket/
  2. Exécutez la commande suivante pour vérifier que le fichier a été correctement chargé :

    aws s3 ls testbucket

Utilisez l’intégration Amazon S3 pour télécharger le portefeuille sur le serveur Amazon RDS

Procédez comme suit :

  1. Ouvrez la console Amazon RDS, puis créez un groupe d'options.
  2. Ajoutez l’option S3_INTEGRATION au groupe d’options.
  3. Créez une instance de base de données avec le groupe d’options.
  4. Créez une politique de Gestion des identitéset des accès AWS (AWS IAM). Pour plus d’informations, consultez Configuration des autorisations IAM pour l’intégration de RDS pour Oracle avec Amazon S3.
  5. Exécutez les commandes suivantes pour télécharger le portefeuille sur Amazon RDS depuis le 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

Pour les utilisateurs RDS pour Oracle qui ne sont pas des utilisateurs principaux : Accordez les autorisations requises à l'utilisateur et créez les ACL réseau requises

Exécutez la commande suivante pour accorder les autorisations requises à 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 réseau 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

Pour envoyer l’e-mail, exécutez la procédure suivante.

Remarque : remplacez les valeurs suivantes par les vôtres :

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

Si vous utilisez un serveur SMTP sur site ou Amazon EC2 comme serveur SMTP, remplacez les informations Amazon SES par les informations relatives à votre serveur local ou 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;  
/

Résoudre les erreurs

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

« 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 un utilisateur non principal exécute le package de messagerie, l’erreur suivante peut s’afficher :

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

Identifiez l’objet auquel vous n’avez pas accès, puis accordez les autorisations requises. Par exemple, si certaines autorisations sont manquantes pour les objets appartenant à SYS, tels que DBA_directories pour expample-username, exécutez la commande suivante :

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

ORA-24247 : si vous n’avez pas attribué l’ACL réseau à l’hôte cible, l’erreur suivante s’affiche. Cette erreur s’affiche également lorsque l’utilisateur ne dispose pas des autorisations requises pour accéder à l’hôte cible :

« ORA-24247 : accès réseau refusé par la liste de contrôle d'accès (ACL) »

Pour résoudre ce problème, exécutez la procédure suivante pour créer une ACL réseau et attribuer l’ACL réseau à l’hôte :

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 : si vous ne configurez pas correctement les groupes de sécurité, le pare-feu ou l’ACL réseau, l’erreur suivante s’affiche :

« ORA-29278: SMTP transient error: 421 Service not available »

Pour résoudre ce problème, assurez-vous de configurer correctement la configuration réseau. Vous pouvez également consulter les journaux de flux VPC pour obtenir les informations suivantes :

  • Analysez les adresses IP source et de destination : À partir des journaux de flux VPC, vérifiez que les données transmises depuis les adresses IP source et de destination reçoivent des réponses.
  • Inspectez le port et le protocole : Vérifiez que le port et le protocole appropriés sont utilisés et qu’il n’y a pas de différences inhabituelles.
  • ACL de groupe de sécurité et de réseau : Vérifiez les configurations du groupe de sécurité et de l’ACL réseau pour vous assurer qu'elles autorisent le trafic sur le port requis.
  • Routage des sous-réseaux : Vérifiez que les tables de routage des sous-réseaux concernés sont correctement configurées pour acheminer le trafic vers le serveur de base de données.
  • Latence et perte de paquets : Recherchez la latence ou la perte de paquets. La latence et la perte de paquets peuvent indiquer des problèmes de réseau.

Pour plus d’informations, consultez les sections Journalisation du trafic IP à l’aide des journaux de flux VPC et Résolution des problèmes ORA-29278 et ORA-29279 lors de l’utilisation d’UTL_SMTP (Doc ID 2287232.1) sur le site Web d’Oracle.

ORA-29279 : si vous n’avez pas créé d’identité sur Amazon SES, l’erreur suivante peut s’afficher :

« 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' »

Pour résoudre ce problème, configurez une identité au niveau du domaine ou créez une identité d’adresse e-mail. Pour plus d’informations, consultez la section Création et vérification d'identités dans Amazon SES.

Testez la connectivité entre Amazon RDS et votre point de terminaison Amazon SES

Exécutez la procédure suivante pour tester la connexion entre Amazon RDS et le point de terminaison 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;

Si la procédure aboutit, la fonction renvoie 1. Si la procédure échoue, la fonction renvoie ORA -29260.

Informations connexes

Présentation du service de distribution de courrier électronique sur le site Web d’Oracle

UTL_SMTP sur le site Web d’Oracle

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a 2 ans