Oracle Package SMTP , espaço branco meio palavra
Alguém já passou por este problema ?Prezado(a)s : Ao enviar um email em HTML pelo package SMTP o Oracle coloca um espaço em branco no meio de uma palavra do nada ,algo comoOracle coloca um espaçoficaOracle colo ca um espaço
SP de Envio
Pesquisei alguns sites e vi relação com um buffer limitado a 1000 caracteres , não achei nenhum parâmetro para aumentar isto.Talvez a solução seja varrer o blob de 1000 em 1000 registros e tratar isto , pegar uma palavra no meio quando na posição 1000.
create or replace PROCEDURE ENVIA_EMAIL_CLOBH (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 := 900;--12000;-- make sure you set a multiple of 3 not higher than 24573 (doc Oracle)
ds_smtp_w varchar2(20) := '......';
/* Abre conex?o SMTP e HTTP */
CONEXAO UTL_SMTP.CONNECTION;
-- fixar este envio por segurança
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)))|| '?=');
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;
FOR i IN 0 .. TRUNC((DBMS_LOB.getlength(p_attach_clob) - 1 )/l_step)
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_CLOBH;
A rotina do SMTP é basicamente a que a documentação do Oracle indica.Discussão (0)
Carregando comentários...