Ir para conteúdo


Atenção - O Canal Dev foi atualizado para última versão do sistema e aparentemente estável. Todas as configurações e definições estão plenamente funcionais. - Roberto Lunelli - Administração Geral

Bem-vindo(a) ao CanalDev!

Se você ainda não é um membro, cadastre-se! Como membro, você poderá:

  • Criar e responder tópicos
  • Criar e votar em enquetes
  • Enviar mensagens privadas a outros membros
  • Adicionar eventos ao nosso calendário comunitário
  • Assinar tópicos e fóruns para receber atualizações automaticamente
  • Usar o sistema de busca próprio (com mais opções)
  • Alterar preferências de exibição em teu painel de controle
  • Ter seu próprio perfil e fazer novos amigos
E muito mais! Participe!

Enviando E-Mail Via Pl/sql


2 respostas neste tópico

#1 Felipe Pena

    O temor do Senhor é o princípio da sabedoria

  • Administração
  • 96 posts
  • Sexo: Masculino
  • Estado:Rio de Janeiro
  • Localidade: Rio de Janeiro
15
Ótima

Postado 31/03/2010, 11:31

Para enviar e-mail via PL/SQL no Oracle, nós podemos recorrer à UTL_SMTP, que é bem simples! Segue abaixo uma package que auxilia na montagem da mensagem:

CREATE OR REPLACE package mail
  as
      type array is table of varchar2(255);

  procedure send( p_sender_email in varchar2,
                  p_from         in varchar2 default NULL,
                  p_to           in array default array(),
                  p_cc           in array default array(),
                  p_bcc          in array default array(),
                  p_subject      in varchar2 default NULL,
                  p_body         in long  default NULL );
  end;
/

CREATE OR REPLACE package body mail
  as

  g_crlf        char(2) default chr(13)||chr(10);
  g_mail_conn   utl_smtp.connection;
  g_mailhost    varchar2(255) := 'smtp.fioprev.org.br';

  function address_email( p_string in varchar2,
                          p_recipients in array ) return varchar2
  is
      l_recipients long;
  begin
     for i in 1 .. p_recipients.count
     loop
        utl_smtp.rcpt(g_mail_conn, p_recipients(i) );
        if ( l_recipients is null )
        then
            l_recipients := p_string || p_recipients(i)  ;
        else
            l_recipients := l_recipients || ', ' || p_recipients(i) ;
        end if;
     end loop;
     return l_recipients;
  end;


  procedure send( p_sender_email in varchar2,
                  p_from         in varchar2 default NULL,
                  p_to           in array default array(),
                  p_cc           in array default array(),
                  p_bcc          in array default array(),
                  p_subject      in varchar2 default NULL,
                  p_body         in long  default NULL )
  is
      l_to_list   long;
      l_cc_list   long;
      l_bcc_list  long;
      l_date      varchar2(255) default
                  to_char( SYSDATE, 'dd Mon yy hh24:mi:ss' );

      procedure writeData( p_text in varchar2 )
      as
      begin
          if ( p_text is not null )
          then
              utl_smtp.write_data( g_mail_conn, p_text || g_crlf );
          end if;
      end;
  begin
      g_mail_conn := utl_smtp.open_connection(g_mailhost, 25);

      utl_smtp.helo(g_mail_conn, g_mailhost);
      utl_smtp.mail(g_mail_conn, p_sender_email);

      l_to_list  := address_email( 'To: ', p_to );
      l_cc_list  := address_email( 'Cc: ', p_cc );
      l_bcc_list := address_email( 'Bcc: ', p_bcc );

      utl_smtp.open_data(g_mail_conn );

      writeData( 'Date: ' || l_date );
      writeData( 'From: ' || nvl( p_from, p_sender_email ) );
      writeData( 'Subject: ' || nvl( p_subject, '(no subject)' ) );

      writeData( l_to_list );
      writeData( l_cc_list );

      utl_smtp.write_data( g_mail_conn, '' || g_crlf );
      utl_smtp.write_data(g_mail_conn, p_body );
      utl_smtp.close_data(g_mail_conn );
      utl_smtp.quit(g_mail_conn);
  end;


  end;
/

E para testar:
  MAIL.send(p_sender_email => '<oracle@suaempresa.com>',
              p_from       => 'oracle@suaempresa.com',
              p_to         => mail.array('email1@host.com', 'email2@host.com'),
              p_subject    => 'Assunto',
              p_body       => 'Sua mensagem');

Muito útil! Ótimo para mandar e-mails avisando de algum erro que ocorreu, por exemplo, em jobs!

Créditos: Blog do Marcio Portes

Editado por Felipe Pena, 31/03/2010, 11:32.


#2 Raimundo Neto

    Newbie

  • Membros
  • 1 posts
  • Sexo: Masculino
  • Estado:Ceará
  • Localidade: Fortaleza
0
Neutra

Postado 13/01/2011, 20:05

Caso precise passar para o p_to uma lista de email que é montada dinamicamente de uma tabela de fornecedores por exemplo. Em qual variável posso armazenar a lista para passar como parâmetro para o p_to? Tentei concatenar em uma variável varchar2, mas não funcionou, embora não desse erro de compilação os emails não chegaram. Criei uma variável do tipo TYPE array IS TABLE OF VARCHAR2(255), mas deu erro de dizendo que estava passando argumento errado. Poderia postar um exemplo de como passar um array contendo os emails?

Visualizar PostFelipe Pena, em 31/03/2010, 11:31, disse:

Para enviar e-mail via PL/SQL no Oracle, nós podemos recorrer à UTL_SMTP, que é bem simples! Segue abaixo uma package que auxilia na montagem da mensagem:

CREATE OR REPLACE package mail
  as
      type array is table of varchar2(255);

  procedure send( p_sender_email in varchar2,
                  p_from         in varchar2 default NULL,
                  p_to           in array default array(),
                  p_cc           in array default array(),
                  p_bcc          in array default array(),
                  p_subject      in varchar2 default NULL,
                  p_body         in long  default NULL );
  end;
/

CREATE OR REPLACE package body mail
  as

  g_crlf        char(2) default chr(13)||chr(10);
  g_mail_conn   utl_smtp.connection;
  g_mailhost    varchar2(255) := 'smtp.fioprev.org.br';

  function address_email( p_string in varchar2,
                          p_recipients in array ) return varchar2
  is
      l_recipients long;
  begin
     for i in 1 .. p_recipients.count
     loop
        utl_smtp.rcpt(g_mail_conn, p_recipients(i) );
        if ( l_recipients is null )
        then
            l_recipients := p_string || p_recipients(i)  ;
        else
            l_recipients := l_recipients || ', ' || p_recipients(i) ;
        end if;
     end loop;
     return l_recipients;
  end;


  procedure send( p_sender_email in varchar2,
                  p_from         in varchar2 default NULL,
                  p_to           in array default array(),
                  p_cc           in array default array(),
                  p_bcc          in array default array(),
                  p_subject      in varchar2 default NULL,
                  p_body         in long  default NULL )
  is
      l_to_list   long;
      l_cc_list   long;
      l_bcc_list  long;
      l_date      varchar2(255) default
                  to_char( SYSDATE, 'dd Mon yy hh24:mi:ss' );

      procedure writeData( p_text in varchar2 )
      as
      begin
          if ( p_text is not null )
          then
              utl_smtp.write_data( g_mail_conn, p_text || g_crlf );
          end if;
      end;
  begin
      g_mail_conn := utl_smtp.open_connection(g_mailhost, 25);

      utl_smtp.helo(g_mail_conn, g_mailhost);
      utl_smtp.mail(g_mail_conn, p_sender_email);

      l_to_list  := address_email( 'To: ', p_to );
      l_cc_list  := address_email( 'Cc: ', p_cc );
      l_bcc_list := address_email( 'Bcc: ', p_bcc );

      utl_smtp.open_data(g_mail_conn );

      writeData( 'Date: ' || l_date );
      writeData( 'From: ' || nvl( p_from, p_sender_email ) );
      writeData( 'Subject: ' || nvl( p_subject, '(no subject)' ) );

      writeData( l_to_list );
      writeData( l_cc_list );

      utl_smtp.write_data( g_mail_conn, '' || g_crlf );
      utl_smtp.write_data(g_mail_conn, p_body );
      utl_smtp.close_data(g_mail_conn );
      utl_smtp.quit(g_mail_conn);
  end;


  end;
/

E para testar:
  MAIL.send(p_sender_email => '<oracle@suaempresa.com>',
              p_from       => 'oracle@suaempresa.com',
              p_to         => mail.array('email1@host.com', 'email2@host.com'),
              p_subject    => 'Assunto',
              p_body       => 'Sua mensagem');

Muito útil! Ótimo para mandar e-mails avisando de algum erro que ocorreu, por exemplo, em jobs!

Créditos: Blog do Marcio Portes


#3 Felipe Pena

    O temor do Senhor é o princípio da sabedoria

  • Administração
  • 96 posts
  • Sexo: Masculino
  • Estado:Rio de Janeiro
  • Localidade: Rio de Janeiro
15
Ótima

Postado 05/03/2011, 14:02

Você pode criar a variável do tipo array, e ir adicionando os itens um a um... e.g. variavel_array(i) := 'email';





1 usuário(s) está(ão) lendo este tópico

0 membros, 1 visitantes, 0 membros anônimos

Entrar


  • Precisa de uma conta? Cadastre-se agora!