Enviando e-mail no Oracle usando SSL/TLS.

Atualmente criptografar os dados trafegados é uma coisa fundamental, inclusive a Oracle liberou o uso de algumas funcionalidades de criptografia para versões não Enterprise , e a criptografia de e-mail está implementada nos grandes fornecedores de tecnologia.

Então preparei o seguinte tutorial de como se configurar uma Wallet, importar os certificados e também um exemplo bem útil de como enviar o e-mail.

Vamos utilizar o Gmail para testes e você precisa ativar o acesso à aplicativos menos seguros senão mesmo com as credenciais corretas o login não vai ser possível:

https://support.google.com/accounts/answer/6010255?p=lsa_blocked&hl=pt-BR&visit_id=637184509838379444-493512541&rd=1

Baixando o certificado

O primeiro passo para isso é baixar o certificado que vai ser utilizado para a autenticação segura no serviço de e-mail. Usando o Google Chrome, basta acessar o site (nesse caso o Gmail) e clicar no cadeado na barra de navegação (1) e após isso clicar no campo certificado(2):

enter image description here

Na janela que abrir, clique em Caminho de certificação (1), depois clique no certificado root (o primeiro de cima para baixo) e por fim use a opção Exibir certificado (2):

enter image description here

Na janela que se abrir, clique na aba detalhes e depois Copiar para arquivo e siga os passos apresentados para salvar o certificado na sua máquina, copie o arquivo gerado para o servidor de banco de dados.

Criando a Wallet

Para essa autenticação, precisamos passar o certificado do passo anterior nas nossas chamadas e para isso vamos criar uma wallet seguindo os passos:

Criar a Wallet:

[oracle@db-orig email_ssl]$ orapki wallet create -wallet $PWD/wallet_email -pwd Oracle123 -auto_login
Oracle PKI Tool Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
Copyright (c) 2004, 2019, Oracle and/or its affiliates. All rights reserved.

Operation is successfully completed.

Adicionar o certificado à Wallet:

[oracle@db-orig email_ssl]$ orapki wallet add -wallet $PWD/wallet_email/ewallet.p12 -trusted_cert -cert gmail.com.cer -pwd Oracle123
Oracle PKI Tool Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
Copyright (c) 2004, 2019, Oracle and/or its affiliates. All rights reserved.

Operation is successfully completed.

Listar os certificados presentes em uma Wallet:

[oracle@db-orig email_ssl]$ orapki wallet display -wallet $PWD/wallet_email/ -pwd Oracle123
Oracle PKI Tool Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
Copyright (c) 2004, 2019, Oracle and/or its affiliates. All rights reserved.

Requested Certificates: 
User Certificates:
Trusted Certificates: 
Subject:        CN=GlobalSign,O=GlobalSign,OU=GlobalSign Root CA - R2
[oracle@db-orig email_ssl]$  #### Dica: É importante lembrar o caminho e a senha utilizada na Wallet pois vamos aponta-los no nosso envio de email.

Criando uma ACL

Precisamos criar uma ACL que é o recurso que controla as conexões de rede de um determinado usuário.

begin
  dbms_network_acl_admin.create_acl (
    acl         => 'acl_gmail.xml',
    description => 'Libera conexao ao GMAIL',
    principal   => 'USUARIO_QUE_ENVIA_EMAIL',
    is_grant    => TRUE,
    privilege   => 'connect',
    start_date  => null,
    end_date    => null
  );
 
  dbms_network_acl_admin.add_privilege (
    acl        => 'acl_gmail.xml',
    principal  => 'USUARIO_QUE_ENVIA_EMAIL',
    is_grant   => TRUE,
    privilege  => 'resolve',
    start_date => null,
    end_date   => null
  );
 
  dbms_network_acl_admin.assign_acl (
    acl        => 'acl_gmail.xml',
    host       => '*.gmail.com',
    lower_port => 587,
    upper_port => 587
  );
  commit;
end;
/

Testando a nossa conexão

Para testar nossa conexão, podemos utilizar a package UTL_HTTP da seguinte forma:

Sem apontar a Wallet e tentando se conectar no servidor:

SQL> SELECT UTL_HTTP.REQUEST('https://gmail.com') FROM DUAL;
SELECT UTL_HTTP.REQUEST('https://gmail.com') FROM DUAL
       *
ERROR at line 1:
ORA-29273: HTTP request failed
ORA-06512: at "SYS.UTL_HTTP", line 1530
ORA-29024: Certificate validation failure
ORA-06512: at "SYS.UTL_HTTP", line 380
ORA-06512: at "SYS.UTL_HTTP", line 1470
ORA-06512: at line 1

Apontando a Wallet criada:

SQL> select utl_http.request('https://gmail.com',NULL,'file:/home/oracle/email_ssl/wallet_email','Oracle123') from dual;

UTL_HTTP.REQUEST('HTTPS://GMAIL.COM',NULL,'FILE:/HOME/ORACLE/EMAIL_SSL/WALLET_EMAIL','ORACLE123')
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

<!DOCTYPE html>
<html lang="pt">
  <head>
  <meta charset="utf-8">
  <meta content="width=300, initial-scale=1" name="viewport">
  <meta name="description" content="O Gmail e um e-mail intuitivo, eficiente e util. S?o 15 GB de armazenamento, acesso em dispositivos moveis e menos spam.">
  <meta name="google-site-verification" content="LrdTUW9psUAMbh4Ia074-BPEVmcpBxF6Gwf0MSgQXZs">
  <title>Gmail</title>
  <style>
  @font-face {
  font-family: 'Open Sans';
  font-style: normal;
  font-weight: 300;
  src: local('Open Sans Light'), local('OpenSans-Light'), url(//fonts.gstatic.com/s/opensans/v15/mem5YaGs126MiZpBA-UN_r8OUuhs.ttf) format('truetype');
}
@font-face {
  font-family: 'Open Sans';
  font-style: normal;
  font-weight: 400;
  src: local('Open Sans'), local('OpenSans'), url(//fonts.gstatic.com/s/opensans/v15/mem8YaGs126MiZpBA-UFVZ0e.ttf) format('truetype');

}

Cortei o resultado para ocupar menos espaço.

Código para enviar e-mails no Oracle usando SSL:

Abaixo um pequeno código de exemplo de como utilizar o que foi apresentado aqui nesse tutorial:

DECLARE 
    c          utl_smtp.connection;
    l_mailhost VARCHAR2 (64) := 'smtp.gmail.com'; -- Seu servidor de e-mail
    l_from     VARCHAR2 (64) := 'adriano.tanakaa@gmail.com';     -- Conta que está mandando o e-mail
    l_to       VARCHAR2 (64) := 'adriano.tanakaa@gmail.com';     -- Conta que vai receber o e-mail
    l_subject  VARCHAR2 (64) := 'Mensagem de teste ';  -- Titulo do e-mail
    crlf       VARCHAR2(2) := utl_tcp.crlf;
    corpo_mail VARCHAR2(32767);
    l_boundary VARCHAR2(50) := '----=*#abc1234321cba#*=';
       
BEGIN
    c := utl_smtp.Open_connection(host => l_mailhost, port => 587,
              wallet_path => 'file:/home/oracle/email_ssl/wallet_email',
              wallet_password => 'Oracle123',
         secure_connection_before_smtp => FALSE
         );

    utl_smtp.Ehlo(c, 'smtp.gmail.com');
    utl_smtp.Starttls(c);
    utl_smtp.Ehlo(c, 'smtp.gmail.com');
    utl_smtp.Auth(c, 'EMAIL', 'SENHA', utl_smtp.all_schemes);
    utl_smtp.Mail (c, l_from);
    utl_smtp.Rcpt (c, l_to);
    utl_smtp.Open_data (c);
    utl_smtp.Write_data (c, 'Date: '
                            || To_char (SYSDATE, 'DD-MON-YYYY HH24:MI:SS')
                            || crlf);
    utl_smtp.Write_data (c, 'From: '
                            || l_from
                            || crlf);

    utl_smtp.Write_data (c, 'Subject: '
                            || l_subject
                            || SYSDATE
                            || crlf);

    utl_smtp.Write_data (c, 'To: '
                            || l_to
                            || crlf);

    utl_smtp.Write_data(c, 'MIME-Version: 1.0'
                           || utl_tcp.crlf);

    utl_smtp.Write_data(c, 'Content-Type: multipart/alternative; boundary="'
                           || l_boundary
                           || '"'
                           || utl_tcp.crlf
                           || utl_tcp.crlf);

    utl_smtp.Write_data(c, 'Content-Type: text/html; charset="iso-8859-1"'
                           || utl_tcp.crlf
                           || utl_tcp.crlf);

    utl_smtp.Write_data (c, ''
                            || crlf);

    corpo_mail := '<html>     <head>       <title>Você pode usar HTML em seus e-mails !!!</title>     </head>     <body>      <b> Você pode colocar um texto em negrito</b> <br>      <i> italico</i><br>      Entre outros !     </body>   </html>';

    utl_smtp.Write_raw_data (c, utl_raw.Cast_to_raw (utl_tcp.crlf || corpo_mail));

    utl_smtp.Close_data (c);

    utl_smtp.Quit (c);
EXCEPTION
    WHEN utl_smtp.transient_error
        OR
        utl_smtp.permanent_error
        THEN
      utl_smtp.Quit(c);

      Raise_application_error(-20001, 'Falha ao enviar e-mail devido ao seguite erro: '
      || SQLERRM);
    WHEN OTHERS THEN
      NULL;
END;

/
chevron_left
chevron_right