geracino

sp envia email

Aug 25th, 2023
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PL/SQL 4.71 KB | Source Code | 0 0
  1. CREATE OR REPLACE PROCEDURE sp_envia_email_centerbox(
  2.                             --psNomeUsuEmail     In          Varchar2,
  3.                             --psRemetente        In          Varchar2,
  4.                             psDestinatario     IN          LONG,
  5.                             --psMailHost         In          Varchar2,
  6.                             --pnNroPorta         In          Integer Default 25,
  7.                             psAssunto          IN          VARCHAR2,
  8.                             psMensagem         IN          Clob
  9.                             --psIndAutentica     In          Varchar2,
  10.                             --psUsuario          In          Varchar2,
  11.                             --psSenha            In          Varchar2,
  12.                             --psIndUsaHTML       In          Varchar2
  13.                             )
  14. IS
  15.   -- Variaveis internas
  16.   vConect    UTL_SMTP.Connection;
  17.   Msg        RAW(32000);
  18.   vnContador INTEGER;
  19.   vnInicio   INTEGER;
  20.   mReplies   UTL_SMTP.Replies;
  21.   mAuthStr   VARCHAR2(1024);
  22.  
  23.   psRemetente         VARCHAR2(50)               :='centerbox@centerbox.com.br';      
  24.   psIndAutentica      VARCHAR2(1)                :='S';
  25.   psIndUsaHTML        VARCHAR2(1)                :='S';
  26.   psUsuario           VARCHAR2(50)               :='srvora01@centerbox.com.br';
  27.   psSenha             VARCHAR2(50)               :='ebox12345';
  28.   pnNroPorta          INTEGER(3)                 :=587;
  29.   psMailHost          VARCHAR2(30)               :='mail.centerbox.com.br';
  30.   psNomeUsuEmail      VARCHAR2(30)               :='[CENTERBOX]';
  31.  
  32.  
  33.  
  34. BEGIN
  35.  
  36.  
  37.  
  38.  
  39.  
  40.   -- Valida os dados de entrada
  41.   IF (psRemetente IS NULL) THEN
  42.     Raise_Application_Error(-20200, 'O e-mail do remetente não foi informado!');
  43.   ELSIF (psDestinatario IS NULL) THEN
  44.     Raise_Application_Error(-20200, 'O e-mail do destinatário não foi informado!');
  45.   END IF;
  46.   -- Abre conexão com o servidor SMTP. Porta Padrão: 25
  47.   vConect := UTL_SMTP.Open_Connection(psMailHost, pnNroPorta);
  48.   UTL_SMTP.Helo(vConect, psMailHost);
  49.   IF (psIndAutentica = 'S' AND psUsuario IS NOT NULL AND psSenha IS NOT NULL) THEN
  50.     mReplies := UTL_SMTP.Command_Replies(vConect, 'AUTH LOGIN');
  51.     mAuthStr := UTL_ENCODE.Base64_Encode(UTL_RAW.Cast_To_Raw(psUsuario));
  52.     mAuthStr := UTL_RAW.Cast_To_Varchar2(mAuthStr);
  53.     mAuthStr := REPLACE(mAuthStr, CHR(13), '');
  54.     mAuthStr := REPLACE(mAuthStr, CHR(10), '');
  55.     mReplies := UTL_SMTP.Command_Replies(vConect, mAuthStr);
  56.     mAuthStr := UTL_ENCODE.Base64_Encode(UTL_RAW.Cast_To_Raw(psSenha));
  57.     mAuthStr := UTL_RAW.Cast_To_Varchar2(mAuthStr);
  58.     mAuthStr := REPLACE(mAuthStr, CHR(13), '');
  59.     mAuthStr := REPLACE(mAuthStr, CHR(10), '');
  60.     mReplies := UTL_SMTP.Command_Replies(vConect, mAuthStr);
  61.   END IF;
  62.   -- Define o e-mail do REMETENTE
  63.   UTL_SMTP.Mail(vConect, ('<' || psRemetente || '>'));
  64.   -- Monta linha DESTINATARIO (separa com ';' se existir mais de um)
  65.   BEGIN
  66.     FOR vtEmail IN (SELECT Column_Value Email
  67.                       FROM TABLE(CAST(C5_Complexin.C5intable(REPLACE(REPLACE(REPLACE(TRIM(psDestinatario), CHR(13), NULL), CHR(10), NULL), ';', ',')) AS C5instrtable)))
  68.     LOOP
  69.       UTL_SMTP.Rcpt(vConect, ('<' || vtEmail.Email || '>'));
  70.     END LOOP;
  71.   EXCEPTION
  72.     WHEN OTHERS THEN
  73.       Raise_Application_Error(-20000, 'Erro no e-mail do destinatário: ' || SQLERRM);
  74.   END;
  75.   -- Monta CABEÇALHO do e-mail
  76.   UTL_SMTP.Open_Data(vConect);
  77.   UTL_SMTP.Write_Data(vConect, 'Date: '    || TO_CHAR(SYSDATE, 'DD-MON-YYYY HH24:MI:SS') || UTL_TCP.Crlf);
  78.   UTL_SMTP.Write_Data(vConect, 'From: "'   || psNomeUsuEmail || '" <' || psRemetente || '>' || UTL_TCP.Crlf);
  79.   UTL_SMTP.Write_Data(vConect, 'Subject: ' || psAssunto || UTL_TCP.Crlf);
  80.   UTL_SMTP.Write_Data(vConect, 'To: '      || REPLACE(REPLACE(REPLACE(TRIM(psDestinatario), CHR(13), NULL), CHR(10), NULL), ';', ',') || UTL_TCP.Crlf);
  81.   -- Usa HTML conforme parâmetro
  82.   IF (psIndUsaHTML = 'S') THEN
  83.     UTL_SMTP.Write_Data(vConect, 'Content-Type: text/html; charset=iso-8859-1' || UTL_TCP.Crlf);
  84.   END IF;
  85.   -- Monta CORPO e-mail
  86.   UTL_SMTP.Write_Data(vConect, '' || UTL_TCP.Crlf);
  87.   -- Ajusta conforme tamanho da MENSAGEM
  88.   vnContador := LENGTH(psMensagem);
  89.   vnInicio   := 0;
  90.   WHILE vnContador > 0
  91.   LOOP
  92.     Msg := UTL_RAW.Cast_To_Raw(UTL_TCP.Crlf || SUBSTR(psMensagem, vnInicio, 30000));
  93.     UTL_SMTP.Write_Raw_Data(vConect, Msg);
  94.     vnInicio   := vnInicio + 30000;
  95.     vnContador := vnContador - 30000;
  96.   END LOOP;
  97.   -- Fecha conexão servidor SMTP
  98.   UTL_SMTP.Close_Data(vConect);
  99.   UTL_SMTP.Quit(vConect);
  100. -- Tratamento de ERRO geral
  101. EXCEPTION
  102.   WHEN OTHERS THEN
  103.     Raise_Application_Error(-20200, 'Erro ao enviar e-mail: ' || SQLERRM);
  104. END sp_envia_email_centerbox;
  105.  
  106.  
Add Comment
Please, Sign In to add comment