Envio de E-mail através de PL/SQL

O objetivo deste é explicar como enviar um e-mail simples usando o PL/SQL. Neste podemos enviar status do banco de dados, estatísticas entre outras. Vamos criar uma função para retornar o estado do banco de dados. Vou criar uma função para a realização do teste para testarmos que podemos usar Functions em Procedimentos, mas antes vamos dar permissão para o usuário tomiasi nas views v$instance e v$database.

SQL> grant all on v_$instance to tomiasi;

Grant succeeded.

SQL> grant all on v_$database to tomiasi;

Grant succeeded.

SQL>

Agora vamos criar a função.

create or replace function tomiasi.estado_banco_dados
return varchar
is
estado char(20);
begin
	select open_mode into estado from v$database;
	return(estado);
end;
/

Com o script abaixo, podemos enviar um e-mail simples como, por exemplo, o estado do banco de dados. OBS: Por motivos de segurança, usarei outro número da porta SMTP de número 999.

create or replace procedure envia_email
(
  de        in varchar2,
  para      in varchar2,
  assunto   in varchar2,
  mailhost  in varchar2,
  username in varchar2,
  password in varchar2
) is
  mail_conn           utl_smtp.connection;
  mail_reply          utl_smtp.replies;
  crlf                varchar2(2):= chr(13)||chr(10);
  v_corpo_da_mensagem varchar2(2000);
  mensagem varchar2(20);
  sid varchar2(30);

begin

  select estado_banco_dados into mensagem from dual;
  select upper(instance_name) into sid from v$instance;

  v_corpo_da_mensagem:= 'Date: '   ||TO_CHAR(SYSDATE,'dd Mon yy hh24:mi:ss')||crlf||
                        'From: '   ||de                                     ||crlf||
                        'To: '     ||para                                   ||crlf||
                        'Subject: '||assunto                                ||crlf||
                        'O estado de seu banco de dados ' || sid ||' esta: ' || mensagem;

  mail_conn := utl_smtp.open_connection(mailhost,999);

  utl_smtp.helo    (mail_conn, mailhost);
  utl_smtp.command (mail_conn, 'AUTH LOGIN');
  utl_smtp.command (mail_conn, utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw(username))));
  utl_smtp.command (mail_conn, utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw(password)))); 
  utl_smtp.mail    (mail_conn, de);
  utl_smtp.rcpt    (mail_conn, para);
  utl_smtp.data    (mail_conn, v_corpo_da_mensagem);
  utl_smtp.quit    (mail_conn);

exception
  when others then
    raise_application_error(-20002,'Não foi possível enviar o email!!!'||sqlerrm);
end;
/

Após criar todos a função e o procedimento vamos executar o procedimento para envio.

exec envia_email('maycon.tomiasi@teiko.com.br','maycon.tomiasi@teiko.com.br','Estado do Banco de Dados','host_email_server','maycon.tomiasi@teiko.com.br','********');

Segue abaixo o e-mail recebido. De: maycon.tomiasi@teiko.com.br [mailto:maycon.tomiasi@teiko.com.br] Enviada em: terça-feira, 11 de outubro de 2011 16:12 Para: maycon.tomiasi@teiko.com.br Assunto: Estado do Banco de Dados O estado de seu banco de dados DBPROD esta: READ WRITE Para maiores informações sobre o assunto entre em http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/u_smtp.htm

%name Envio de E mail através de PL/SQL

Autor: Maycon Tomiasi

Formado em Tecnologia da Informação na FIPP (Faculdade de Informática de Presidente Prudente), Analista DBA Oracle pela Teiko Soluções em Tecnologia da Informação, residente em Blumenau/ SC, Certificado OCP 10g/11g/12c, OCS 11g Implementation, OCE 11g Performance Tuning, OCE 11g RAC & GRID e OPN Specialist. Conhecimentos em PHP.