Enviar E-mail no Autonomous Database on Dedicated Exadata Infrastructure

Você pode enviar e-mail no Autonomous Database on Dedicated Exadata Infrastructure usando o Serviço Email Delivery ou os procedimentos DBMS_CLOUD_NOTIFICATION. Este artigo descreve como enviar e-mails usando essas duas opções.

Enviar E-mail com o Serviço Email Delivery no Autonomous Database

Descreve as etapas para enviar e-mail usando UTL_SMTP no Autonomous Database on Dedicated Exadata Infrastructure.

Para enviar um e-mail usando UTL_SMTP:
  1. Identifique seu ponto final de conexão SMTP para o serviço Email Delivery.
    1. Se você quiser usar o Serviço Email Delivery do Oracle Cloud Infrastructure (OCI), identifique seu ponto final de conexão para o serviço Email Delivery. Por exemplo, selecione smtp.email.us-phoenix-1.oci.oraclecloud.com quando Oeste dos EUA (Phoenix) for a região de envio. Para obter mais informações, consulte Configurar Conexão SMTP.

      Observação:

      Talvez você precise se inscrever em regiões adicionais do Oracle Cloud Infrastructure se o serviço Email Delivery estiver indisponível na sua região atual.
    2. Se você quiser usar um servidor SMTP de terceiros, o administrador da rede deverá configurar o servidor SMTP e sua conectividade com o tenant do Autonomous Database e fornecer as informações de ponto final da conexão SMTP.
  2. Gere credenciais SMTP para o serviço Email Delivery para o usuário do OCI.
    O UTL_SMTP usa credenciais para fazer autenticação com os servidores do serviço Email Delivery quando você envia um e-mail. Consulte Gerar Credenciais SMTP para um Usuário para obter mais informações.
  3. Crie remetentes aprovados para o serviço Email Delivery.
    Se você estiver usando o serviço Email Delivery do OCI, conclua esta etapa para todos os endereços de e-mail usados como o "De" com UTL_SMTP.MAIL. Consulte Gerenciando Remetentes Aprovados para obter mais informações.
  4. Permita o acesso ao host SMTP para o(s) usuário(s) com a atribuição de administrador incluindo a Entrada de Controle de Acesso (ACE).
    Para usar o SMTP seguro, configure o usuário do banco de dados com a Entrada de Controle de Acesso (ACE) para acesso à wallet, além do acesso ao host SMTP. Para acesso SMTP seguro usando o Serviço Email Delivery do OCI, a conta do Oracle Cloud Infrastructure deve ser autenticada usando protocolos SASL (Simple Authentication and Security Layer), como PLAIN, CRAM-MD5, LOGIN. Por exemplo, consulte o código de amostra em Código de Amostra SMTP de Envio de E-mail.
  5. Escreva o código PL/SQL para enviar e-mails usando UTL_MAIL.

    Dica:

    Se você estiver desenvolvendo o procedimento de envio de e-mail sozinho, certifique-se de que seu código esteja de acordo com o Código de Amostra de Envio de E-mail SMTP.
  6. Envie um e-mail de teste usando o procedimento PL/SQL criado na etapa 5.
    Por exemplo:
    execute send_mail('taylor@example.com', 'Email from Oracle Autonomous Database', 'Sent using UTL_SMTP');

Consulte UTL_SMTP em Pacotes PL/SQL e Referência de Tipos do Oracle Database 19c ou Pacotes PL/SQL do Oracle Database 23ai e Referência de Tipos para obter mais referências.

Consulte Observações sobre o Uso de Pacotes PL/SQL de Banco de Dados para obter mais informações sobre o uso de UTL_SMTP com o Autonomous Database.

Código de Amostra SMTP de Envio de E-mail

Mostra o código de amostra para enviar e-mail com UTL_SMTP em um Autonomous Database.

Código de Amostra

-- As ADMIN user, set up ACE to access SMTP host
connect admin/[password]@[ADBD-host]/[pdbname]_tp.atp.oraclecloud.com
begin
  DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE (
    host       => '[SMTP_Server_address]',
    lower_port => 25,
    upper_port => 25,
    ace        => xs$ace_type(
                    privilege_list => xs$name_list('smtp'),
                    principal_name => '[database_user]',
                    principal_type => xs_acl.ptype_db));
end;

/
-- If using secure SMTP, set up ACE to wallet for certificate-based secure (TLS) email
declare
  m_wallet_path VARCHAR2(512);
begin
  select property_value into m_wallet_path
    from database_properties
   where property_name like '%SSL%';
  m_wallet_path := 'file:' || m_wallet_path;
  DBMS_NETWORK_ACL_ADMIN.APPEND_WALLET_ACE (
    wallet_path => m_wallet_path,
    ace         => xs$ace_type(
                     privilege_list => xs$name_list('use_client_certificates'),
                     principal_name => '[database_user]',
                     principal_type => xs_acl.ptype_db));
end;
/
-- As ADMIN or regular database user with privileges set up above, use UTL_SMTP to send email
connect [database_user]/[password]@[ADBD-host]/[pdbname]_tp.atp.oraclecloud.com

-- Example of normal (non-secure) email
DECLARE
  c         UTL_SMTP.CONNECTION;
  reply     UTL_SMTP.REPLY;
  host      varchar2(64) := '[SMTP_Server_address]',
  port      pls_integer := 25;
  sender    varchar2(64) := '[sender-address@domain.com]';
  recipient varchar2(64) := '[recipient-address@domain.com]';
BEGIN
  c := UTL_SMTP.OPEN_CONNECTION (host, port);
  if (reply.CODE != 220) then
    raise_application_error(-20000,'UTL_SMTP.CONNECTION: '
      || reply.CODE || ' - ' || reply.TEXT);
  end if;

  UTL_SMTP.HELO(c, host);
  UTL_SMTP.MAIL(c, sender);
  UTL_SMTP.RCPT(c, recipient);
  UTL_SMTP.OPEN_DATA(c);
  UTL_SMTP.WRITE_DATA(c,'From:[Sender]  <' || sender || '>'    || UTL_TCP.CRLF);
  UTL_SMTP.WRITE_DATA(c,'To:[Recipient] <' || recipient || '>' || UTL_TCP.CRLF);
  UTL_SMTP.WRITE_DATA(c,'Subject: Email from UTL_SMTP App' || UTL_TCP.CRLF);
  UTL_SMTP.WRITE_DATA(c,'Mail Content');
  UTL_SMTP.CLOSE_DATA(c);
  dbms_output.put_line('Close Data: ' || reply.code);
  UTL_SMTP.QUIT(c);
END;
/

-- Example of secure email using OCI Mail Server as the SMTP server
DECLARE
  m_wallet_path VARCHAR2(256);
  c             UTL_SMTP.CONNECTION;
  reply         UTL_SMTP.REPLY;
  host          varchar2(64) := 'smtp.email.[region].oci.oraclecloud.com';
  port          pls_integer := 25;
  sender        varchar2(64) := '[sender-address@domain.com]';
  recipient     varchar2(64) := '[recipient-address@domain.com]';
BEGIN
  select property_value into m_wallet_path
    from database_properties
   where property_name like '%SSL%';
  m_wallet_path := 'file:' || m_wallet_path;

  -- secure connection with SSL/TLS made *before* SMTP communication
  -- use hostname matched against CN or SMTP server's certificate
  reply := UTL_SMTP.OPEN_CONNECTION (
             host                          => host,
             port                          => port,
             c                             => c,
             wallet_path                   => m_wallet_path,
             wallet_password               => NULL,
             secure_connection_before_smtp => FALSE,
             secure_host                   => NULL);
  if (reply.CODE != 220) then
      raise_application_error(-20000,'UTL_SMTP.OPEN_CONNECTION: '
        || reply.CODE ||' - ' || reply.TEXT);
  end if;

  UTL_SMTP.STARTTLS(c);
 
  -- username is the 'SMTP credential' for the user's email address
  -- obtained from OCI Identity -> Users -> email address.
  -- Scheme refers to SASL (Simple Authentication and Security Layer)
  -- Authentication Schemes for SMTP protocol - PLAIN, CRAM-MD5, LOGIN
  -- https://docs.oracle.com/en-us/iaas/Content/Email/Concepts/overview.htm
  UTL_SMTP.AUTH(
     c        => c,
     username => '[ocid1.user.verylongaddresscreatedinOCIforuseraddress.com]',
     password => '[password-provided-from-create]',
     schemes  => 'PLAIN');

  UTL_SMTP.HELO(c, host);
  UTL_SMTP.MAIL(c, sender);
  UTL_SMTP.RCPT(c, recipient);
  UTL_SMTP.OPEN_DATA(c);
  UTL_SMTP.WRITE_DATA(c, 'From: Sender <' || sender || '>' || UTL_TCP.CRLF);
  UTL_SMTP.WRITE_DATA(c, 'To: Recipient <' || recipient || '>' || UTL_TCP.CRLF);
  UTL_SMTP.WRITE_DATA(c, 'Subject: Email from UTL_SMTP App' || UTL_TCP.CRLF);
  UTL_SMTP.WRITE_DATA(c, 'Mail Content');
  UTL_SMTP.WRITE_DATA(c, 'Sender is a domain-owned approved sender in OCI Mail Service');
  UTL_SMTP.CLOSE_DATA(c);
  dbms_output.put_line('Close Data: ' || reply.code);
  UTL_SMTP.QUIT(c);
END;
/

Enviar Mensagens como E-mail do Autonomous Database

APLICAÇÕES PARA: Aplicável somente Oracle Public Cloud

Você pode usar o DBMS_CLOUD_NOTIFICATION para enviar mensagens como e-mail.
  1. Identifique seu ponto final de conexão SMTP para o serviço Email Delivery. Talvez você precise se inscrever em regiões adicionais do Oracle Cloud Infrastructure se o Email Delivery não estiver disponível na sua região atual.

    Por exemplo, selecione uma das opções a seguir para o ponto final de conexão SMTP:

    • smtp.us-phoenix-1.oraclecloud.com
    • smtp.us-ashburn-1.oraclecloud.com
    • smtp.email.uk-london-1.oci.oraclecloud.com
    • smtp.email.eu-frankfurt-1.oci.oraclecloud.com

    Para obter mais informações, consulte Configurar Conexão SMTP.

  2. Gere as credenciais SMTP para o Email Delivery. O UTL_SMTP usa credenciais para fazer a autenticação nos servidores do serviço Email Delivery quando você envia e-mail.

    Consulte Gerar Credenciais SMTP para um Usuário para obter mais informações.

  3. Crie remetentes aprovados para o Email Delivery. Conclua essa etapa para todos os endereços de e-mail usados como "From" com UTL_SMTP.MAIL.

    Consulte Gerenciando Remetentes Aprovados para obter mais informações.

  4. Permita o acesso SMTP para o usuário ADMIN anexando uma Entrada de Controle de Acesso (ACE).

    Por exemplo:

    BEGIN
      -- Allow SMTP access for user ADMIN
      DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
        host => ’www.us.example.com’,
        lower_port => 587,
        upper_port => 587,
        ace => xs$ace_type(privilege_list => xs$name_list('SMTP'),
                           principal_name => 'ADMIN',
                           principal_type => xs_acl.ptype_db));
    END;
    /
  5. Crie um objeto de credencial e use DBMS_CLOUD_NOTIFICATION.SEND_MESSAGE para enviar uma mensagem como e-mail.
    BEGIN
       DBMS_CLOUD.CREATE_CREDENTIAL(
            credential_name => 'EMAIL_CRED',
            username        => 'username',
            password        => 'password'
       );
       END;
    /
    BEGIN
       DBMS_CLOUD_NOTIFICATION.SEND_MESSAGE(
            provider        => 'email',
            credential_name => 'EMAIL_CRED',
            message         => 'Subject content',
            params          => json_object('recipient' value  'mark@example.com, suresh@example.com',
                                           'to_cc'  value 'nicole@example.com, jordan@example.com',
                                           'to_bcc' value 'manisha@example.com',
                                           'subject' value 'Test subject',
                                           'smtp_host' value 'smtp.email.example.com',
                                           'sender'    value  'approver_sender@example.com' )
       );
       END;
    /

    Use o parâmetro params para especificar o remetente, smtp_host, assunto, destinatário e destinatários de um CC ou Cco nos valores string.

    • remetente: especifica o ID de E-mail do remetente aprovado da Etapa 3.

    • smtp_host: especifica o nome do host SMTP da etapa 2.

    • assunto: especifica o assunto do e-mail.

    • destinatário: especifica os IDs de e-mail dos destinatários. Use uma vírgula entre IDs de e-mail quando houver vários destinatários.

    • to_cc: especifica os IDs de e-mail que estão recebendo um CC do e-mail. Use uma vírgula entre os IDs de e-mail quando houver vários destinatários CC.

    • to_bcc: especifica os IDs de e-mail que estão recebendo um CCO do e-mail. Use uma vírgula entre os IDs de e-mail quando houver vários destinatários Cco.

    Consulte SEND_MESSAGE Procedimento para obter mais informações.

Enviar Resultados da Consulta como E-mail pelo Autonomous Database

APLICAÇÕES PARA: Aplicável somente Oracle Public Cloud

Você pode usar o pacote DBMS_CLOUD_NOTIFICATION para enviar os resultados de uma consulta como um e-mail.

Para usar DBMS_CLOUD_NOTIFICATION para enviar e-mail:

  1. Identifique seu ponto final de conexão SMTP para o serviço Email Delivery. Talvez você precise se inscrever em regiões adicionais do Oracle Cloud Infrastructure se o Email Delivery não estiver disponível na sua região atual.

    Por exemplo, selecione uma das opções a seguir para o ponto final de conexão SMTP:

    • smtp.us-phoenix-1.oraclecloud.com
    • smtp.us-ashburn-1.oraclecloud.com
    • smtp.email.uk-london-1.oci.oraclecloud.com
    • smtp.email.eu-frankfurt-1.oci.oraclecloud.com

    Para obter mais informações, consulte Configurar Conexão SMTP.

  2. Gere as credenciais SMTP para o Email Delivery. O UTL_SMTP usa credenciais para fazer a autenticação nos servidores do serviço Email Delivery quando você envia e-mail.

    Consulte Gerar Credenciais SMTP para um Usuário para obter mais informações.

  3. Crie remetentes aprovados para o Email Delivery. Conclua essa etapa para todos os endereços de e-mail usados como "From" com UTL_SMTP.MAIL.

    Consulte Gerenciando Remetentes Aprovados para obter mais informações.

  4. Permita o acesso SMTP para o usuário ADMIN anexando uma Entrada de Controle de Acesso (ACE).

    Por exemplo:

    BEGIN
      -- Allow SMTP access for user ADMIN
      DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
        host => ’www.us.example.com’,
        lower_port => 587,
        upper_port => 587,
        ace => xs$ace_type(privilege_list => xs$name_list('SMTP'),
                           principal_name => 'ADMIN',
                           principal_type => xs_acl.ptype_db));
    END;
    /
  5. Crie um objeto de credencial e use DBMS_CLOUD_NOTIFICATION.SEND_DATA para enviar a saída de uma consulta como e-mail.
    BEGIN
       DBMS_CLOUD.CREATE_CREDENTIAL(
            credential_name => 'EMAIL_CRED',
            username        => 'username',
            password        => 'password'
       );
       END;
    /
    BEGIN
       DBMS_CLOUD_NOTIFICATION.SEND_DATA(
            provider        => 'email',
            credential_name => 'EMAIL_CRED',
            query           => 'SELECT tablespace_name FROM dba_tablespaces',
            params          => json_object('recipient' value  'mark@example.com, suresh@example.com',
                                           'to_cc'  value 'nicole@example.com1, jordan@example.com',
                                           'to_bcc' value 'manisha@example.com',
                                           'subject' value 'Test subject',
                                           'type' value 'json',
                                           'title' value 'mytitle',
                                           'message' value 'This is the message',
                                           'smtp_host' value 'smtp.email.example.com',
                                           'sender'    value  'approver_sender@example.com' )
       );
       END;
    /
    Use o parâmetro params para especificar o remetente, smtp_host, assunto, destinatário, destinatários de um CC ou Cco, a mensagem, o tipo de dados e o título nos valores String.
    • remetente: especifica o ID de E-mail do remetente aprovado da Etapa 3.

    • smtp_host: especifica o nome do host SMTP da etapa 2.

    • assunto: especifica o assunto do e-mail. O tamanho máximo é de 100 caracteres.

    • destinatário: especifica os IDs de e-mail dos destinatários. Use uma vírgula entre IDs de e-mail quando houver vários destinatários.

    • to_cc: especifica os IDs de e-mail que estão recebendo um CC do e-mail. Use uma vírgula entre os IDs de e-mail quando houver vários destinatários CC.

    • to_bcc: especifica os IDs de e-mail que estão recebendo um CCO do e-mail. Use uma vírgula entre os IDs de e-mail quando houver vários destinatários Cco.

    • message: especifica o texto da mensagem.

    • type: especifica o formato de saída como CSV ou JSON.

    • title: especifica o título do anexo da saída SQL. O título deve conter apenas letras, dígitos, sublinhados, hifens ou pontos como caracteres em seu valor porque ele está sendo usado para gerar um nome de arquivo.

    O tamanho máximo da mensagem a ser usado com DBMS_CLOUD_NOTIFICATION.SEND_DATA para notificação de e-mail é 32k bytes.

    Consulte SEND_DATA Procedimento para obter mais informações.