Comment envoyer un e-mail depuis mon instance de base de données Amazon RDS pour Oracle ?
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 :
- Utilisez Amazon SES pour configurer le serveur de messagerie SMTP.
- Créez un point de terminaison VPC pour Amazon SES.
- Créez une instance Linux Amazon Elastic Compute Cloud (Amazon EC2). Utilisez ensuite le certificat approprié pour configurer le client et le portefeuille Oracle.
- Téléchargez le portefeuille dans un compartiment Amazon Simple Storage Service (Amazon S3).
- Utilisez l’intégration Amazon S3 pour télécharger le portefeuille depuis le compartiment Amazon S3 vers le serveur Amazon RDS.
- 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).
- 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 :
-
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. -
Ouvrez l’interface de ligne de commande AWS.
-
À 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.
-
Exécutez la commande suivante pour télécharger le certificat AmazonRootCA1 :
wget https://www.amazontrust.com/repository/AmazonRootCA1.pem
-
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 :
-
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/
-
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 :
- Ouvrez la console Amazon RDS, puis créez un groupe d'options.
- Ajoutez l’option S3_INTEGRATION au groupe d’options.
- Créez une instance de base de données avec le groupe d’options.
- 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.
- 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

Contenus pertinents
- demandé il y a 4 moislg...
- demandé il y a un anlg...
- demandé il y a 2 anslg...
- AWS OFFICIELA mis à jour il y a 2 ans
- AWS OFFICIELA mis à jour il y a 2 ans
- AWS OFFICIELA mis à jour il y a un an
- AWS OFFICIELA mis à jour il y a 6 mois