Complete a 3 Question Survey and Earn a re:Post Badge
Help improve AWS Support Official channel in re:Post and share your experience - complete a quick three-question survey to earn a re:Post badge!
Como faço para enviar um e-mail da minha instância de banco de dados Amazon RDS para Oracle?
Quero configurar minha instância de banco de dados Amazon Relational Database Service (Amazon RDS) para Oracle para enviar e-mails.
Breve descrição
Para enviar um e-mail de uma instância de banco de dados RDS para Oracle, use os pacotes UTL_MAIL ou UTL_SMTP. Para usar UTL_MAIL com o RDS para Oracle, adicione a opção UTL_MAIL no grupo de opções não padrão anexado à instância. Para obter mais informações sobre como configurar o UTL_MAIL, consulte Oracle UTL_MAIL.
Para usar ULT_SMTP com o RDS for Oracle, configure um servidor SMTP em uma máquina local ou use o Amazon Simple Email Service (Amazon SES). Confirme se a conectividade da instância de banco de dados RDS para Oracle com o servidor SMTP está configurada corretamente.
A resolução a seguir explica como usar o Amazon SES para enviar e-mails por meio do pacote UTL_SMTP.
Pré-requisitos
Confirme se o endpoint do Amazon SES está acessível a partir da sua instância de banco de dados do RDS. Se sua instância de banco de dados for executada em uma sub-rede privada, crie um endpoint de nuvem privada virtual (VPC) para o Amazon SES.
Observação: para instâncias de banco de dados executadas em uma sub-rede privada, você também pode usar um gateway NAT para se comunicar com o endpoint do Amazon SES.
Configurar sua instância de banco de dados para enviar e-mails
Para configurar sua instância de banco de dados para enviar e-mails, conclua as seguintes etapas:
- Use o Amazon SES para configurar o servidor de e-mail SMTP.
- Crie um endpoint VPC para o Amazon SES.
- Crie uma instância Linux do Amazon Elastic Compute Cloud (Amazon EC2). Em seguida, use o certificado apropriado para configurar o cliente e a carteira Oracle.
- Faça o upload da carteira para um bucket do Amazon Simple Storage Service (Amazon S3).
- Use a integração com o Amazon S3 para baixar a carteira do bucket do Amazon S3 para o servidor Amazon RDS.
- Para usuários não primários, conceda as permissões necessárias aos usuários e, em seguida, crie as listas de controle de acesso à rede (ACLs de rede) necessárias.
- Use suas credenciais do Amazon SES para enviar o e-mail.
Resolução
Observação: se você receber erros ao executar comandos da AWS Command Line Interface (AWS CLI), consulte Solucionar erros da AWS CLI. Além disso, verifique se está usando a versão mais recente da AWS CLI.
Configurar o servidor de e-mail SMTP
Para obter instruções sobre como usar o Amazon SES para configurar um servidor de e-mail SMTP, consulte Como faço para configurar e me conectar ao SMTP usando o Amazon SES?
Criar VPC com o Amazon SES
Para obter instruções sobre como usar o Amazon SES para criar uma VPC, consulte Configurar endpoints de VPC com o Amazon SES.
Criar uma instância do Amazon EC2 e configure o cliente e a carteira Oracle
Conclua as seguintes etapas:
-
Instale um cliente Oracle.
Observação: é uma prática recomendada usar um cliente que tenha a mesma versão da sua instância de banco de dados. Nesta resolução, a versão 19c do Oracle é usada. Para baixar esse cliente, consulte Oracle Database 19c (19.3) no site da Oracle. Esta versão vem com o utilitário orapki. -
Abra o AWS CLI.
-
Na instância do EC2, permita a conexão na porta do banco de dados no grupo de segurança do Amazon RDS. Se a instância de banco de dados e a instância do EC2 usarem a mesma VPC, use seus endereços IP privados para permitir a conexão.
-
Execute o seguinte comando para baixar o certificado AmazonRootCA1:
wget https://www.amazontrust.com/repository/AmazonRootCA1.pem
-
Execute comandos a seguir para criar a carteira:
orapki wallet create -wallet . -auto_login_only orapki wallet add -wallet . -trusted_cert -cert AmazonRootCA1.pem -auto_login_only
Fazer o upload da carteira para o Amazon S3
Conclua as seguintes etapas:
-
Execute o comando a seguir para fazer o upload da carteira em um bucket do Amazon S3:
Observação: o bucket do S3 deve estar na mesma região da AWS que a instância de banco de dados.aws s3 cp cwallet.sso s3://testbucket/
-
Execute o comando a seguir para verificar se o arquivo foi carregado com sucesso:
aws s3 ls testbucket
Usar a integração com o Amazon S3 para baixar a carteira para o servidor Amazon RDS
Conclua as seguintes etapas:
- Abra o console do Amazon RDS e, em seguida, crie um grupo de opções.
- Adicione a opção S3_INTEGRATION ao grupo de opções.
- Crie uma instância de banco de dados com o grupo de opções.
- Crie uma política do AWS Identity and Access Management (IAM). Para obter mais informações, consulte Configurando permissões do IAM para o RDS para integração do Oracle com o Amazon S3.
- Execute os seguintes comandos para baixar a carteira para o Amazon RDS a partir do bucket do 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
Para usuários do RDS não primário para Oracle: Conceder as permissões necessárias ao usuário e crie as ACLs de rede necessárias
Execute o comando a seguir para conceder as permissões necessárias ao usuário não primário:
begin rdsadmin.rdsadmin_util.grant_sys_object( p_obj_name => 'DBA_DIRECTORIES', p_grantee => 'example-username', p_privilege => 'SELECT'); end; /
Execute os seguintes comandos para criar as ACLs de rede necessárias:
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; /
Envie o e-mail
Para enviar o e-mail, execute o procedimento a seguir.
Observação: substitua os seguintes valores pelos seus valores:
- example-server com o nome do seu servidor de e-mail SMTP
- example-sender-email com o endereço de e-mail do remetente
- example-receiver-email com o endereço de e-mail do destinatário
- example-SMTP-username com seu nome de usuário
- example-SMTP-password com sua senha
Se você usa um servidor SMTP local ou o Amazon EC2 como servidor SMTP, substitua as informações do Amazon SES pelos detalhes do seu servidor 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; /
Solucionar erros
ORA-29279: se seu nome de usuário ou senha SMTP estiverem imprecisos, você poderá receber o seguinte erro:
"ORA-29279: SMTP permanent error: 535 Authentication Credentials Invalid"
Para resolver esse problema, verifique se suas credenciais SMTP estão corretas.
ORA-00942: se um usuário não primário executar o pacote de e-mail, você poderá receber o seguinte erro:
"PL/SQL: ORA-00942: table or view does not exist"
Identifique o objeto que não tem acesso e, em seguida, conceda as permissões necessárias. Por exemplo, se certas permissões estiverem ausentes para objetos de propriedade da SYS, como DBA_directories para expample-username, execute o seguinte comando:
begin rdsadmin.rdsadmin_util.grant_sys_object( p_obj_name => 'DBA_DIRECTORIES', p_grantee => 'example-username', p_privilege => 'SELECT'); end; /
ORA-24247: se você não atribuiu a ACL da rede ao host de destino, receberá o erro a seguir. Você também recebe esse erro quando o usuário não tem as permissões necessárias para acessar o host de destino:
"ORA-24247: network access denied by access control list (ACL)"
Para resolver esse problema, execute o procedimento a seguir para criar uma ACL de rede e atribuir a ACL de rede ao host:
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: se você não configurar corretamente os grupos de segurança, o firewall ou a ACL de rede, receberá o seguinte erro:
"ORA-29278: SMTP transient error: 421 Service not available"
Para resolver esse problema, verifique se você definiu corretamente a configuração de rede. Você também pode revisar os logs de fluxo da VPC para obter as seguintes informações:
- Analise os endereços IP de origem e destino: nos logs de fluxo da VPC, verifique se os dados transmitidos dos endereços IP de origem e destino recebem respostas.
- Inspecione a porta e o protocolo: confirme se a porta e o protocolo corretos estão sendo usados e se não há discrepâncias incomuns.
- ACLs de grupo de segurança e rede: verifique as configurações de ACL de rede e grupo de segurança para confirmar se elas permitem tráfego na porta necessária.
- Roteamento de sub-rede: verifique se as tabelas de roteamento nas sub-redes relevantes estão configuradas corretamente para rotear o tráfego para o servidor do banco de dados.
- Latência e perda de pacotes: procure latência ou perda de pacotes. A latência e a perda de pacotes podem indicar problemas de rede.
Para obter mais informações, consulte Registro de tráfego IP usando logs de fluxo de VPC e Solução de problemas com ORA-29278 e ORA-29279 ao usar UTL_SMTP (Doc ID 2287232.1) no site da Oracle.
ORA-29279: se você não criou uma identidade no Amazon SES, poderá receber o seguinte erro:
"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'"
Para resolver esse problema, configure uma identidade no nível do domínio ou crie uma identidade de endereço de e-mail. Para obter mais informações, consulte Como criar e verificar identidades no Amazon SES.
Testar a conectividade do Amazon RDS com seu endpoint do Amazon SES
Execute o procedimento a seguir para testar a conexão entre o Amazon RDS e o endpoint do 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;
Se o procedimento for bem-sucedido, a função retornará 1. Se o procedimento falhar, a função retornará ORA -29260.
Informações relacionadas
Visão geral do serviço de entrega de e-mail no site da Oracle
UTL_SMTP no site da Oracle

Conteúdo relevante
- feita há 2 meseslg...
- feita há 20 diaslg...
- Resposta aceitafeita há 4 meseslg...
- feita há um mêslg...