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:
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):
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):
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;
/