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 asacap1000
      Salve galera. estou com uma zica aqui e não vai.
      Tenho um servidor WEB final IP final 120 neste servidor eu acesso um banco de dados de outro servidor 122, tem uma tabela com fotos e precisaria mostrar estas fotos na intranet. porém ele me mostra o caminho mas não mostra a imagem.
       
      Na Tabela está sendo salvo desta forma:
      Z:/Avarias/FOTOS/Alfandegado/2020/01.%20JANEIRO/14.01.2020/AVARIA%20CLIENTE%20CN=%20191234%20(2).JPG
       
      Chamei ele na tela desta forma:
      <?php ociexecute($stmt2,OCI_DEFAULT); while ($row = oci_fetch_object($stmt2)) { $string = OCIResult ($stmt2 ,1); ///link da avaria $avaria = OCIResult ($stmt2 ,2); ///titulo da avaria ?> <a href="<?=$string ?>" width="20%" height="30%" data-lightbox="gallery" > <button type="button" class="btn btn-dark active" data-toggle="modal" data-target="#modalExemplo"> <img src="<?=$string?>" width="160" height="100" class="rounded" title="<?=$avaria?>"> <br> </button> Na tela aparece desta forma:

       
      Se eu clicar na imagem fica assim apenas carregando:
       

       
      Se eu mandar abrir em nova guia a imagem aparece essa mensagem:

      Se eu copiar o link com botão direito e abrir no navegador ela abre normalmente.
       
      Ah lembrando que são tres servidores 120 web, 122 banco de dados, 128 as fotos onde salva como mapeamento Z://
      Alguem teria alguma idéia de como chamar estas fotos???
       
    • By Motta
      Google e Oracle decidem na Suprema Corte briga judicial sobre Android
    • By Motta
      Oracle lança programa educacional para capacitar jovens na área de TI
    • By Maccio
      Estou tentando criar um relatório com total de horas trabalhadas do funcionários por dia, tenho uma tabela FRQ_digitacao onde eu tenho os dados para calcular o total de horas e se tiver com zero horas eu digo a ocorrência do mesmo, ex: falta, Folga, etc. Quero também colocar a informação de férias quando o mesmo estiver de férias, porém quando ele está de férias a tabela FRQ_digitacao fica sem registros nos dias de Férias, assim tenho que buscar a informação na tabela FLP_Ferias onde é lá que diz o gozoinicial e gozofinal, porém não estou conseguindo fazer essa comparação já que na tabela FRQ_digitacao nesses dias de ferias o funcionário fica sem registro.
       
      select T.CODINTFUNC, f.CHAPAFUNC, LISTAGG( CASE WHEN T.NORMALDIGIT=0 THEN OC.DESCMAPAOCORR WHEN t.DTDIGIT IS NULL THEN 'dt.dtdigit' --when dt.dtdigit between fe.inicio and fe.fim --then 'FER' ELSE to_char((TRUNC(T.NORMALDIGIT)+TRUNC(t.extradigit)+TRUNC(t.extranotdigit))+ ((trunc(((T.NORMALDIGIT-trunc(T.NORMALDIGIT))+(t.extradigit-trunc(t.extradigit))+(t.extranotdigit-trunc(t.extranotdigit)))/0.60))+ mod(((T.NORMALDIGIT - trunc(T.NORMALDIGIT))+(t.extradigit - trunc(t.extradigit))+(t.extranotdigit - trunc(t.extranotdigit))),0.60)),'FM99999D90', 'nls_numeric_characters=''.,''' ) END, ' ') within group (order by t.dtdigit) horas, MAX(FE.INICIO), MAX(FE.FIM ) from vw_funcionarios f, FRQ_DIGITACAOMOVIMENTO O, FRQ_OCORRENCIA OC, frq_digitacao t, (select f.codintfunc INT, f.chapafunc, max(fe.dtcompetfer)COMPET, MAX(fe.gozoinifer) INICIO, MAX(fe.Gozofinfer) FIM from flp_ferias fe, flp_funcionarios f where f.codintfunc=fe.codintfunc AND F.SITUACAOFUNC='A' and f.codigoempresa=1 AND FE.STATUSFERIAS='N' group by f.chapafunc, f.codintfunc) FE, (select t.DTDIGIT from frq_digitacao t WHERE t.dtdigit between '01-NOV-2019' AND '20-NOV-2019' group by t.dtdigit) DT where DT.DTDIGIT(+)=T.dtdigit and fe.INT=t.codintfunc and f.codintfunc=t.codintfunc AND F.CODIGOEMPRESA=1 and O.CODINTFUNC=T.CODINTFUNC AND T.DTDIGIT=O.DTDIGIT AND O.CODOCORR=OC.CODOCORR AND dt.dtdigit BETWEEN '01-NOV-2019' AND '20-NOV-2019' -- AND F.CODDEPTO BETWEEN 15 AND 15 AND O.STATUSDIGIT='N' and o.iddigit = (select max(p.iddigit) from frq_digitacaomovimento p where o.codintfunc=p.codintfunc and o.dtdigit=p.dtdigit AND P.STATUSDIGIT='N' and p.dtdigit between '01-NOV-2019' AND '20-NOV-2019') group by f.CHAPAFUNC, T.CODINTFUNC  



    • By ronimarcos.silva
      Estou com a seguinte situação: No Mysql eu consegui fazer em  "insert into" de uma única vez, com vários registros, conforme abaixo:
      insert into prefeitos (nome, cidade_id) VALUES ('Rodrigo Neves', 2), ('Caique Rosa Baldran', 9), ('Raquel Lira', 11), ('Maísa Albuquerque Sain', 12), ('Zenaldo Coutinho', null); Porém, no Oracle 12C, usando a mesma forma que no Mysql, está dando o seguinte erro: 
      insert into e080rat (CODEMP, CODSER, SEQRAT, TIPRSC, CRIRAT, NUMPRJ, CODFPJ, CTAFIN, CTARED, PERCTA, CODCCU, PERRAT) values ('800', 'S0001', '279', 'U', '5', '0', '0', '1360', '13730', '100', '31058', '100'), ('800', 'S0001', '280', 'U', '5', '0', '0', '1360', '13730', '100', '31060', '100'), ('800', 'S0001', '281', 'U', '5', '0', '0', '1360', '13730', '100', '31202', '100'), ('800', 'S0001', '282', 'U', '5', '0', '0', '1360', '13730', '100', '31203', '100'); ORA-00933: comando SQL não encerrado adequadamente
      Será que a sintaxe no Oracle é diferente?
       
      Eu sei que assim funciona perfeitamente:
      insert into e080rat (CODEMP, CODSER, SEQRAT, TIPRSC, CRIRAT, NUMPRJ, CODFPJ, CTAFIN, CTARED, PERCTA, CODCCU, PERRAT) values ('800', 'S0001', '279', 'U', '5', '0', '0', '1360', '13730', '100', '31058', '100'); insert into e080rat (CODEMP, CODSER, SEQRAT, TIPRSC, CRIRAT, NUMPRJ, CODFPJ, CTAFIN, CTARED, PERCTA, CODCCU, PERRAT) values ('800', 'S0001', '280', 'U', '5', '0', '0', '1360', '13730', '100', '31060', '100'); insert into e080rat (CODEMP, CODSER, SEQRAT, TIPRSC, CRIRAT, NUMPRJ, CODFPJ, CTAFIN, CTARED, PERCTA, CODCCU, PERRAT) values ('800', 'S0001', '281', 'U', '5', '0', '0', '1360', '13730', '100', '31202', '100'); insert into e080rat (CODEMP, CODSER, SEQRAT, TIPRSC, CRIRAT, NUMPRJ, CODFPJ, CTAFIN, CTARED, PERCTA, CODCCU, PERRAT) values ('800', 'S0001', '282', 'U', '5', '0', '0', '1360', '13730', '100', '31203', '100');  
      Porém, eu tenho uma tabela com quase 100.000 registros e gostaria de fazer em um único "insert". Eu uso o PL/SQLDeveloper e quando faço o "insert" da forma acima, com vários "insert into", ele abre um novo documento para cada "insert into", nisso ele trava, fica horas rodando o "insert" e não conclui se for em um único "insert" como no Mysql, creio que não pesaria tanto.
      Tem uma forma mais fácil de fazer o "insert into" com muitos dados envolvidos?
      Desde já agradeço.
×

Important Information

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