Como faço para enviar um e-mail da minha instância de banco de dados Amazon RDS para Oracle?

10 minuto de leitura
0

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:

  1. Use o Amazon SES para configurar o servidor de e-mail SMTP.
  2. Crie um endpoint VPC para o Amazon SES.
  3. 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.
  4. Faça o upload da carteira para um bucket do Amazon Simple Storage Service (Amazon S3).
  5. Use a integração com o Amazon S3 para baixar a carteira do bucket do Amazon S3 para o servidor Amazon RDS.
  6. 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.
  7. 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:

  1. Para uma instância Linux do Amazon EC2.

  2. 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.

  3. Abra o AWS CLI.

  4. 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.

  5. Conecte-se à instância do EC2.

  6. Execute o seguinte comando para baixar o certificado AmazonRootCA1:

    wget https://www.amazontrust.com/repository/AmazonRootCA1.pem
  7. 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:

  1. 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/
  2. 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:

  1. Abra o console do Amazon RDS e, em seguida, crie um grupo de opções.
  2. Adicione a opção S3_INTEGRATION ao grupo de opções.
  3. Crie uma instância de banco de dados com o grupo de opções.
  4. 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.
  5. 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