4 de fevereiro de 2013 Fábio Prado Banco de Dados, Desenvolvimento de Software
Utilizar a package UTL_SMTP para mandar e-mail é bastante complexo e trabalhoso. É bem mais fácil e mais rápido utilizar a package UTL_MAIL, mas como eu havia dito no parágrafo acima, ela possui restrições, tais como: enviar somente 1 anexo e o tamanho do anexo deve ser de no máximo 32K. Estas restrições não existem na package UTL_SMTP, que não vou explicar neste artigo. Na 2a. parte vou compartilhar uma package que usa tanto a UTL_SMTP quanto a UTL_MAIL para enviar e-mails. O código desta package poderá servir como referência para quem pretende ver como usar qualquer uma delas.
1– Instalar a package executando os scripts: $ORACLE_HOME/rdbms/admin/utlmail.sql e $ORACLE_HOME/rdbms/admin/prvtmail.plb. A instalação deve ser efetuada por um usuário que tenha privilégios de DBA;
2– Configurar o parâmetro de sistema SMTP_OUT_SERVER, com um valor contendo o nome ou IP + porta de um servidor SMTP válido. Se você omitir o endereço da porta, será utilizada como padrão, a porta 25. É importante salientar que a máquina host do BD tenha comunicação com o servidor SMTP, e também, autorização para enviar mensagens (no software do servidor SMTP não deve existir regras que bloqueiem mensagens da máquina host do BD).
Ex.: ALTER SYSTEM SET smtp_out_server = 'smtp.empresa.com.br:25';
3– O remetente (sender) do e-mail deve ser uma conta de e-mail que não requer autenticação para envio de mensagens.
(SENDER => '[email protected]', -- remetente da mensagem
RECIPIENTS => '[email protected]',  -- destinatário da mensagem
CC => null,  -- destinatário copiado na mensagem
BCC => null,  -- destinatário com cópia oculta da  mensagem
SUBJECT =>  'Assunto do e-mail', -- assunto da mensagem
MESSAGE => 'Mensagem do e-mail', -- mensagem do e-mail
MIME_TYPE => 'text/plain; charset=iso-8859-1' -- mime type do texto da mensagem
Como pode ser observado no bloco PL/SQL acima, é muito fácil enviar uma mensagem sem anexo usando a package UTL_MAIL, mas a coisa complica quando você tem que mandar mensagens com anexo, e fica impossível quando o anexo é maior que 32K. Um detalhe em que muitos profissionais encontram problemas e dificuldades, é a configuração dos caracteres do texto das mensagens e do texto dos anexos, que podem apresentar, em muitos casos, os chamados "caracteres desconfigurados". Para evitar estes caracteres desconfigurados é necessário passar o valor adequado para os parâmetros MIME_TYPE. Eu normalmente configuro o valor 'text/plain; charset=iso-8859-1' e isso já é suficiente para resolver os meus problemas. Para aqueles que ainda assim tiverem problemas e precisarem de mais informações sobre mime types, sugiro a leitura do artigo http://en.wikipedia.org/wiki/MIME.
dbms_network_acl_admin.create_acl ( acl => 'grant_acl', description => 'Permite enviar e-mail e usar outras packages', principal => 'FABIO', is_grant => TRUE, privilege => 'connect' );
commit; end; /
dbms_network_acl_admin.add_privilege ( acl => 'grant_acl', principal => 'FABIO', is_grant => TRUE, privilege => 'resolve' );