Jump to content
Motta

[Resolvido] Oracle SMTP não manda cópia oculta (BCC)

Recommended Posts

 

Estou tentando mandar uma "Blind Copy" pelo nossa Procedure de envio de email , pela documentação estaria ok , mas não está enviando nem gerando qualquer erro , o código está abaixo , os itens sensíveis foram trocados por "x"

O que posso estar fazendo de errado ?

SP :

 

create or replace PROCEDURE ENVIA_EMAIL_CLOBHBC (ds_email_origem_w varchar2,
                                               ds_email_destino_p varchar2,
                                               ds_assunto       varchar2,
                                               p_attach_clob IN CLOB DEFAULT NULL,
                                               p_httm in varchar2 default 'S',
                                               p_log out varchar2,                                                        
                                               p_nome_destino in varchar2 default null) is


  l_step        PLS_INTEGER  := 12000; 
  ds_smtp_w varchar2(20) := 'xx.xx.x.xx';
  /* Abre conex?o SMTP e HTTP */
  CONEXAO UTL_SMTP.CONNECTION;

  vs_origem varchar2(100) := ds_email_origem_w;
  --
  vs_para  varchar2(100);
  vs_cc    varchar2(100);
  --

  PROCEDURE send_header(name IN VARCHAR2, header IN VARCHAR2) AS
  BEGIN
    UTL_SMTP.WRITE_DATA(CONEXAO, name || ': ' || header || UTL_TCP.CRLF);
  END;

BEGIN
  /* Abre conex?o com um Servidor SMTP(Simple Mail Transfer Protocol), porta padr?o SMTP e 25 */
  CONEXAO := utl_smtp.open_connection (ds_smtp_w,25);
  UTL_SMTP.HELO (CONEXAO, ds_smtp_w); /* Endereco do servidor de SMTP */
  --utl_smtp.command (CONEXAO, 'AUTH LOGIN');
  --utl_smtp.command (CONEXAO, utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw((ds_user_id_w)))));
  --UTL_SMTP.COMMAND (CONEXAO, UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_ENCODE(UTL_RAW.CAST_TO_RAW((DS_SENHA_SMTP_W)))));

  UTL_SMTP.MAIL (CONEXAO, ('<' || vs_origem          || '>')); /* E-mail de quem esta mandando */
  -- se estiver em lista separado por ";" manda para o 1º como "para" e para o 2º como CC (copia)
  /* Para quem vou mandar */
  IF INSTR(ds_email_destino_p,';') = 0 THEN 
    vs_para  := ds_email_destino_p;
    UTL_SMTP.RCPT (CONEXAO, ('<' || ds_email_destino_p || '>')); /* Para quem vou mandar */
  ELSE
    vs_para  := SUBSTR(ds_email_destino_p,1,INSTR(ds_email_destino_p,';')-1);
    vs_cc    := SUBSTR(ds_email_destino_p,INSTR(ds_email_destino_p,';')+1,length(ds_email_destino_p));
    UTL_SMTP.RCPT (CONEXAO, ('<' || vs_para || '>')); /* Para quem vou mandar original */
    UTL_SMTP.RCPT (CONEXAO, ('<' || vs_cc || '>')); /* Para quem vou mandar copia */
  END IF;
  UTL_SMTP.OPEN_DATA(CONEXAO); 

  If upper(p_httm) <> 'S' Then  
    send_header('Subject','=?iso-8859-1?Q?' ||UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.QUOTED_PRINTABLE_ENCODE(UTL_RAW.CAST_TO_RAW(ds_assunto))));
  Else  
    --send_header('Subject','=?iso-8859-1?Q?' ||UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.QUOTED_PRINTABLE_ENCODE(UTL_RAW.CAST_TO_RAW(ds_assunto)))|| '?=');
    send_header('Subject',UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.QUOTED_PRINTABLE_ENCODE(UTL_RAW.CAST_TO_RAW(ds_assunto))));
  end if;

  If upper(p_httm) <> 'S' Then  
    UTL_SMTP.write_data(CONEXAO, 'Content-Type: text/html; charset="UTF-8"'   || utl_tcp.CRLF);
  Else  
    UTL_SMTP.write_data(CONEXAO, 'Content-Type: text/html; charset="UTF-8"'  || utl_tcp.CRLF );
  end if;    

  send_header('From',ds_email_origem_w);

  --se denominou o destino formata o envio , senão vai o proprio email
  --tratamento diferente do "from" pois este é em geral dinamico
  --feito pela stored procedure  chamadora
  if trim(p_nome_destino) is null then
    send_header('To',vs_para);
  else
    send_header('To','"'||trim(p_nome_destino)||'" <'||vs_para||'>');
  end if;  

  If Trim(vs_cc) is not null Then--copia (nao formata o destino)
    send_header('CC',vs_cc);
  end if;

  send_header('BCC',vs_origem);---<<< A LINHA COM PROBLEMA PARECE SER ESTA ***********************

  FOR i IN 0 .. TRUNC((DBMS_LOB.getlength(p_attach_clob) - 1 )/l_step) 
  LOOP
    UTL_SMTP.WRITE_DATA(CONEXAO, DBMS_LOB.substr(p_attach_clob, l_step, i * l_step + 1));    
  END LOOP;

  UTL_SMTP.CLOSE_DATA(CONEXAO);
  UTL_SMTP.QUIT (CONEXAO);
Exception
  when OTHERS then
    utl_smtp.quit (conexao);
    p_log := 'Erro: ' || SQLERRM;
END ENVIA_EMAIL_CLOBHBC;

Share this post


Link to post
Share on other sites
 

se um dia vier a ajudar alguém ...

no pedaço

 

ELSE
    vs_para  := SUBSTR(ds_email_destino_p,1,INSTR(ds_email_destino_p,';')-1);
    vs_cc    := SUBSTR(ds_email_destino_p,INSTR(ds_email_destino_p,';')+1,length(ds_email_destino_p));
    UTL_SMTP.RCPT (CONEXAO, ('<' || vs_para || '>')); /* Para quem vou mandar original */
    UTL_SMTP.RCPT (CONEXAO, ('<' || vs_cc || '>')); /* Para quem vou mandar copia */   
  END IF;

colocar
 

ELSE
    vs_para  := SUBSTR(ds_email_destino_p,1,INSTR(ds_email_destino_p,';')-1);
    vs_cc    := SUBSTR(ds_email_destino_p,INSTR(ds_email_destino_p,';')+1,length(ds_email_destino_p));
    UTL_SMTP.RCPT (CONEXAO, ('<' || vs_para || '>')); /* Para quem vou mandar original */
    UTL_SMTP.RCPT (CONEXAO, ('<' || vs_cc || '>')); /* Para quem vou mandar copia */    
    UTL_SMTP.RCPT (CONEXAO, ('<' || vs_origem || '>')); /* Para quem vou mandar copia oculta */    
  END IF;

 

 

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Abran
      Gostaria de poder fazer um SELECT dentro do LOOP igual ao exemplo abaixo.
      Esse exemplo não deu certo, se tirar esse SELECT que está dentro do LOOP, tudo funciona. O problema está no Select dentro do LOOP que nao aceita.
      ORA-01403: dados não encontrados
       
      A ideia é, Z45 grava cliente, e Z46 grava títulos em aberto.

      Toda vez que rodar, deverá checar se existe novos títulos que ainda não foram gravados, e só gravar os que ainda não foram.
       
      Alguem sabe alguma maneira de fazer o que preciso ?
       
      DECLARE      v_CODCLI   VARCHAR2 (6);   vPREFIXO   VARCHAR2 (3);   vNUM       VARCHAR2 (9);   vPARCELA   VARCHAR2 (3); BEGIN          v_CODCLI := '0';          FOR V_FUNC IN     (     SELECT E1_FILIAL, A1_COD, A1_LOJA, A1_PESSOA, E1_PREFIXO, E1_NUM, E1_PARCELA, E1_TIPO, E1_NATUREZ, E1_EMISSAO, E1_VENCREA, E1_VALOR,     CASE WHEN TO_DATE('20190627', 'yyyymmdd') - TO_DATE(E1_VENCTO, 'yyyymmdd') < 0              THEN 0        ELSE TO_DATE('20190627', 'yyyymmdd') - TO_DATE(E1_VENCTO, 'yyyymmdd') END ATRASO      FROM SE1010 SE1      INNER JOIN SA1010 A1 ON A1.A1_COD = E1_CLIENTE AND A1_LOJA = E1_LOJA AND A1.D_E_L_E_T_ = SE1.D_E_L_E_T_      WHERE SE1.D_E_L_E_T_ = ' '      ORDER BY A1_LOJA, A1_COD     )     LOOP                  SELECT Z46_PREFIX, Z46_NUM, Z46_PARCEL, Z46_TIPO, Z46_NATURE          INTO vPREFIXO, vNUM, vPARCELA, vTIPO, vNATUREZ          FROM Z46010 Z46          WHERE Z46_PREFIX = V_FUNC.E1_PREFIXO         AND Z46_NUM = V_FUNC.E1_NUM          AND Z46_PARCEL = V_FUNC.E1_PARCELA         AND D_E_L_E_T_ = ' ' ;                          IF vPREFIXO || vNUM || vPARCELA !=  V_FUNC.E1_PREFIXO || V_FUNC.E1_NUM || V_FUNC.E1_PARCELA THEN                      IF V_FUNC.A1_COD <> v_CODCLI THEN                              v_CODCLI :=  V_FUNC.A1_COD;                                  INSERT                 INTO DADOSADV.Z45010                 (                     Z45_RECNO,                     Z45_FILIAL,                     Z45_CODCLI,                     Z45_LOJA,                     Z45_PESSOA,                     Z45_DTCAD                 )                 VALUES                 (                     (SELECT CASE WHEN MAX(Z45_RECNO) IS NULL THEN 1 ELSE MAX(Z45_RECNO) + 1 END Z45_RECNO FROM Z45010) ,                     V_FUNC.E1_FILIAL,                     V_FUNC.A1_COD,                     V_FUNC.A1_LOJA,                     V_FUNC.A1_PESSOA,                     TO_CHAR(SYSDATE, 'YYYYMMDD')                 );                                  COMMIT;                          END IF;                          INSERT             INTO DADOSADV.Z46010             (                     Z46_RECNO,                     Z46_RECZ45,                     Z46_STATIT,                     Z46_PREFIX,                     Z46_NUM,                     Z46_PARCEL,                     Z46_TIPO,                     Z46_NATURE,                     Z46_VALOR,                     Z46_ATRASO,                     Z46_DTCAD             )             VALUES             (                 (SELECT CASE WHEN MAX(Z46_RECNO) IS NULL THEN 1 ELSE MAX(Z46_RECNO) + 1 END Z46_RECNO FROM Z46010) ,                 (SELECT CASE WHEN MAX(Z45_RECNO) IS NULL THEN 1 ELSE MAX(Z45_RECNO) END Z45_RECNO FROM Z45010),                 0,                 V_FUNC.E1_PREFIXO,                 V_FUNC.E1_NUM,                 V_FUNC.E1_PARCELA,                 V_FUNC.E1_TIPO,                 V_FUNC.E1_NATUREZ,                 20,                 V_FUNC.ATRASO,                 TO_CHAR(SYSDATE, 'YYYYMMDD')             );                          COMMIT;                              END IF;          END LOOP;           END;
    • By felipeaggs
      Boa-tarde, pessoal!
       
      Estou com um problema e não consigo resolvê-lo de forma alguma.
       
      Vou exemplificar aqui o que acontece.
       
      Tenho duas tabelas, uma tabela é relativa a registro de nota fiscal, estruturada da seguinte forma (edição simplificada).
       
      TGFCAB
      ID | DTNEG        | NUMNOTA | CODTIPOPER | CODEMP | 
      1 | 01/01/2019 | 1000            | 50                     | 7              |
      2 | 02/01/2019 | 1001            | 50                     | 7              |
      3 | 02/01/2019 | 1002            | 50                     | 7              |
      4 | 03/01/2019 | 1003            | 50                     | 7              |
       
      TGFITE
      ID | NUMNOTA | QTDNEG| VLRUNIT | VLRTOT | CODVOL | PRODUTONFE 
      1   |1001            | 5              | 10            | 50            | UN           | 10
      2   |1001            | 10            | 700          | 7000        | TN           | 11
      3   |1002            | 3              | 20            |60            | UN           | 12
      4   |1003            | 20            | 7              | 140          | UN           | 10
      5   |1003            | 100          | 7              | 700          | UN           | 10
       
       
      Eu preciso realizar um select de forma que traga as Informação abaixo.
       
      PRODUTO| QTDNEGMES | VALORTOTAL 
      10             | 125           | 890
      11             | 10             | 7000
      12             | 3               | 60
       
      Já tentei de todas as formas possíveis, porém eu não consigo de forma alguma.
       
      Por favor, alguém poderia me ajudar?
       
       
       
       
    • By asacap1000
      Galera estou com uma consulta que travei em uma situação.
      Eu preciso buscar as ultimas informações de uma Nota fiscal.
       
      NUMERO DA NF | DATA FATURAMENTO | COBERTURA
       
      neste select ele utiliza como parâmetro o lote cadastrado no sistema de estoque, e ao pesquisar ele volta a Data do faturamento e cobertura corretos porém o numero da NF é outro bem antiga.
      O que posso estar fazendo errado nesta consulta?? segue a query 
      SELECT TO_CHAR(MAX(OS.NR_NF)) NOTA, TO_CHAR(MAX(TO_DATE(REPLACE(OS.DATE_BILL, '/.', ''), 'dd/mm/yy')), 'dd/mm/yyyy') DATA_FAT, TO_CHAR(MAX(TO_DATE(REPLACE(IT.DIV_6, '/.', ''), 'dd/mm/yy')), 'dd/mm/yyyy') COBERTURA FROM BILL_OS_ITEM IT, BILL_OS OS, BILL_ITEM B WHERE OS.LAGER = IT.LAGER AND OS.ID_KLIENT = IT.ID_KLIENT AND OS.ID_OS = IT.ID_OS AND IT.LAGER = OS.LAGER AND IT.ID_OS = OS.ID_OS AND IT.BILLITE = B.BILLITE AND OS.STATUS <> '80' --AND OS.NR_NF = '119247' AND IT.DIV_1 = 'EX16208816' A nota fiscal que deveria retornar ´seria a 119247, porém vem  99336.
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.