Pular para o conteúdo
Visualizando 3 posts - 1 até 3 (de 3 do total)
  • Autor
    Posts
  • #103059
    Avatar de airoospairoosp
    Participante

      Boa tarde,

      Criei uma procedure para envio de e-mail pelo banco 9i usando o utl_smtp. Fiz alguns testes e gostaria de saber como capturar mensagens de erro.
      Ou melhor, mensagem enviada mas o endereço de e-mail estava errado. Consequentemente a mesma não foi entregue. É possível capturar o erro e salvar em uma tabela?

      Obrigado.

      Airton

      #103060
      Avatar de Victor ArmbrustVictor Armbrust
      Mestre

        Tenta usar EXCEPTION:

        Exemplo:

        (...)

        mesg:= 'Date: ' || TO_CHAR( SYSDATE, 'dd Mon yy hh24:mi:ss' ) || crlf ||
        'From: ' || crlf ||
        'Subject: '||subject || crlf ||
        'To: '||recipient || 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);

        (...)

        #103063
        Avatar de airoospairoosp
        Participante

          Mesmo usando o exception não foi possível capturar o erro.

          Segue abaixo a procedure.

          PROCEDURE ENVIAR_EMAIL
          (
          p_mailhost IN VARCHAR2,
          p_sender IN VARCHAR2,
          p_recipient IN VARCHAR2,
          p_subject IN VARCHAR2,
          p_message IN VARCHAR2,
          p_oracle_directory IN VARCHAR2,
          p_arquivo IN VARCHAR2,
          r_codigo OUT VARCHAR2,
          r_texto OUT VARCHAR2
          )

          is

          mail_conn UTL_SMTP.CONNECTION;
          v_directory_name varchar2(100);
          v_file_name varchar2(100);
          v_line varchar2(1000);
          crlf varchar2(2):= chr(13) || chr(10);
          mesg varchar2(32767);
          v_slash_pos number;
          v_file_handle utl_file.file_type;
          invalid_path exception;
          mesg_length_exceeded boolean := false;
          v_reply utl_smtp.reply;

          BEGIN

          begin
          mail_conn := UTL_SMTP.OPEN_CONNECTION( p_mailhost, 25 );
          utl_smtp.helo( mail_conn, p_mailhost );
          utl_smtp.mail( mail_conn, p_sender );
          utl_smtp.rcpt( mail_conn, p_recipient );
          utl_smtp.open_data ( mail_conn );

            mesg:='Date: '|| TO_CHAR (SYSDATE-1/24, 'DD/MM/RR HH:MI AM')|| ' '|| DBTIMEZONE|| ' '|| '(GMT'|| DBTIMEZONE|| ')'|| crlf
            ||
            'From: ' || crlf
            ||
            'Subject: ' || p_subject || crlf
            ||
            'To: ' || p_recipient || crlf
            ||
            'Reply-To: ' || p_sender ||  crlf
            ||
            'Content-Transfer-Encoding: 7bit' || crlf ||
               'Content-Type: multipart/mixed; boundary="DMW.Boundary.605592468"' || crlf ||
               'Mime-Version: 1.0' || crlf ||
               '--DMW.Boundary.605592468' || crlf ||
               'Content-Transfer-Encoding: binary'||crlf||
               'Content-Type: text/html' ||crlf ||
               crlf || p_message || crlf ;
          
            utl_smtp.write_raw_data ( mail_conn, utl_raw.cast_to_raw(mesg) );
            v_reply:=UTL_SMTP.close_data( mail_conn );
            Exception 
               WHEN OTHERS THEN 
                  raise_application_error(-20002,'unable to send the mail.'||SQLERRM); 
          
           UTL_SMTP.QUIT( mail_conn );  
          

          end;

          r_codigo:=v_reply.code;
          r_texto:=v_reply.text;

          END;

          No teste foi passado um endereço de destinário errado e mesmo assim não passou pelo exception.

          O que eu fiz foi usar o UTL_SMTP.REPLY e o retorno foi:

          v_reply.code = 25
          v_reply.text = 2.6.0 Queued mail for delivery

          Se alguém tiver mais algum ideia, agradeço.

          Obrigado.

          Airton

        Visualizando 3 posts - 1 até 3 (de 3 do total)
        • Você deve fazer login para responder a este tópico.
        plugins premium WordPress