terça-feira, 15 de março de 2011

Enviando e-mails utilizando o banco de dados Oracle

O banco de dados Oracle desde as versões mais antigas (a partir da versão 8i) oferece uma opção para 
DBA´s e desenvolvedores permitir que as aplicações possam enviar mensagens dentro de seus códigos PL/SQLs. Imagine, então as diversas necessidades no mundo dos negócios para o envio de e-mails durante a geração de relatórios, fechamentos de compras, confirmação de pedidos, diversos scripts de monitoração do banco de dados entre outros, sendo realizadas dentro do próprio banco de dados.

Mas, como utilizar esse dispositivo ?

Este artigo irá demonstrar como utilizar essa funcionalidade.

 

Devem-se utilizar os packages UTL_SMTP e UTL_TCP. DBAs ou desenvolvedores poderão escrever uma rotina para empregar estas packages internas e chamá-las eventualmente em todos os lugares aplicáveis nos sistemas. As mensagens poderão ser enviadas sempre que um evento ocorrer ou poderão ser programadas como um JOB (usando a package DBMS_JOB ou DBMS_SCHEDULER  – ver o artigo “Schedulando processos no Oracle”).


Itens importantes para a execução desta tarefa.

1.       O nome do servidor de e-mail “hostname” ou o endereço IP. Este servidor poderá ser de uma intranet ou de um serviço remoto que esteja disponível. A palavra “localhost” pode ser usada para chamar o Oracle a usar o serviço “default” para o Sistema Operacional (SMTP).

2.       O sistema operacional deverá suportar os serviços de SMTP. A maioria dos Unix/Linux suportam este serviço. Para os Windows , verificar se o serviço de SMTP encontra-se disponível.

3.       O serviço irá utilizar uma porta para comunicar-se com o SMTP. Normalmente o valor “default” da porta é o 25.

4.       O banco de dados deverá ter os serviços de Java habilitados. A opção do Jserver deverá ser instalada usando os scripts (initjvm.sql e initplsj.sql). Normalmente o  Jserver é auto instalado em versões Oracle Enterprise.

5.       A package UTL_SMTP deverá existir na base e o seu “owner”  deverá ser o usuário SYS.



Fazer as adaptações do código exemplo e compilar em sua base de dados.

create or replace PROCEDURE send_mail(
sender IN VARCHAR2,
recipient IN VARCHAR2,
subject IN VARCHAR2,
message IN VARCHAR2)
IS
mailhost VARCHAR2(30) := '200.32.0.0';  --> INFORMAR O SERVIDOR DE SMTP
mail_conn utl_smtp.connection;
crlf VARCHAR2( 2 ):= CHR( 13 ) || CHR( 10 );
mesg VARCHAR2( 1000 );

BEGIN
      mail_conn := utl_smtp.open_connection(mailhost, 25);

      mesg:= 'Date: ' || TO_CHAR( SYSDATE, 'dd Mon yy hh24:mi:ss' ) || crlf ||
             'From: <'||sender||'>' || crlf ||
             'Subject: '||subject || crlf ||
             'To: '||recipient || crlf ||
             'ENVIANDO E-MAIL UTILIZANDO ORACLE !!'||crlf||
             ' '||crlf||
             'CORPO DA MENSAGEM... COLOQUE AQUI SUA MENSAGEM !'||crlf||
             'CORPO DA MENSAGEM... COLOQUE AQUI SUA MENSAGEM !'||crlf||
             'CORPO DA MENSAGEM... COLOQUE AQUI SUA MENSAGEM !'||crlf||
             ' '||crlf||message;
      utl_smtp.helo(mail_conn, mailhost);
      utl_smtp.mail(mail_conn, sender);
      utl_smtp.rcpt(mail_conn, recipient);
      utl_smtp.data(mail_conn, mesg);
      utl_smtp.quit(mail_conn);

      Exception
      WHEN OTHERS THEN
        raise_application_error(-20002,'unable to send the mail.'||SQLERRM);
END;
/

show errors;


Para executar a procedure acima utilizar:

execute send_mail('e_mail_destino@seu_dominio.com.br',
'seu.email@seu_dominio.com.br',
'Mensagem Enviada pelo Oracle Database !',
'DIGITAR MENSAGEM !!');

Erros mais comuns

Se o serviço de SMTP não estiver disponível, será apresentada a seguinte mensagem de erro:
ORA-20001: 421 Service not available

Se os objetos Java não estiverem instalados corretamente, será apresentada a mensagem de erro:
ORA-29540: class oracle/plsql/net/TCPConnection does not exist

Descrição das rotinas da package UTL_SMTP


Procedures
Descrição
UTL_SMTP.OPEN_CONNECTION:
Abre uma conexão para um servidor de SMTP.
UTL_SMTP.HELO:
Inicializa o serviço  “handshake”.
UTL_SMTP.MAIL:
Inicializa a transação de envio do e-mail para o servidor.
UTL_SMTP.RCPT:
Especifica o nome do recipiente.
UTL_SMTP.DATA:
Especifica o corpo da mensagem.
UTL_SMTP.OPEN_DATA / UTL_SMTP.WRITE_DATA / UTL_SMTP.CLOSE_DATA:  
Especifica o corpo da mensagem com maiores controles.
UTL_SMTP.VRFY:
Verifica a validade dos endereços.

Principais limitações

Elementos
Limitações
user
O tamanho máximo do nome do usuário é de 64 caracteres.
domain
O tamanho total do nome do domínio ou endereço IP é 64 caracteres.
path
O tamanho máximo do caminho “path” é de 256 caracteres (incluindo a pontuação e elementos separadores).
command line
O tamanho máximo da linha de comando incluindo o  é de 512 caracteres.
reply line
O tamanho máximo de linha de resposta incluindo o  é de 512 caracteres.
text line
O tamanho máxiom da linha de texto incluindo o  é de 1.000 caracteres.
recipients buffer
O tamanho máximo do buffer é de 100 recipientes.


Rubens Oliveira
DBA Oracle Consultor
olivert.dba@consultant.com