Enviar archivos grandes con UTL_SMTP
Publicado por Oscar Rios (1 intervención) el 24/10/2017 18:16:21
Hola a todos
Estoy tratando de enviar un archivo de 194KB a travez del UTL_SMTP lo adjunto pero al descargar el archivo este baja con 32KB y falla al levantar.
Estoy utilizando las siguientes funciones para trabajar el archivo
Esta función almacena el archivo en un directorio de mi servidor de base de datos
esta función toma el archivo que puse en el directorio para esto cree un procedimiento send_mail que utiliza el utl_smtp para el envio de correos lo cual hace pero los envia con tamaño de 32KB.
Esta es la parte de mi codigo donde atacho el documento.
Si alguien ya soluciono esto le agradeceria me indique que hacer. He leido que blob soporta hasta 4GB pero nose si por estar utilizando funciones raw este teniendo algun inconveniente.
Saludos
Estoy tratando de enviar un archivo de 194KB a travez del UTL_SMTP lo adjunto pero al descargar el archivo este baja con 32KB y falla al levantar.
Estoy utilizando las siguientes funciones para trabajar el archivo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
function sf_guarda_archivo (p_directory varchar2,
p_filename varchar2,
p_archivo blob)
return number
is
v_amount BINARY_INTEGER := 1024;
v_pos number := 1;
v_buffer RAW(32767);
v_blob_len number;
v_file UTL_FILE.FILE_TYPE;
v_error varchar2(30000) default null;
begin
v_blob_len := DBMS_LOB.getlength(p_archivo);
v_error := 'SI';
begin
v_file := UTL_FILE.fopen(p_directory,p_filename,'wb');
EXCEPTION
WHEN OTHERS THEN
v_error := sqlerrm;
return 0;
END;
if v_error = 'SI' then
WHILE v_pos < v_blob_len LOOP
begin
DBMS_LOB.read(p_archivo, v_amount, v_pos, v_buffer);
UTL_FILE.put_raw(v_file, v_buffer, TRUE);
v_pos := v_pos + v_amount;
exception
WHEN OTHERS THEN
v_error := sqlerrm;
end;
END LOOP;
UTL_FILE.fclose(v_file);
end if;
return 1;
end;
Esta función almacena el archivo en un directorio de mi servidor de base de datos
1
2
3
4
5
6
7
8
9
10
11
12
function sf_captura_archivo (p_directory varchar2,
p_filename varchar2)
return Blob
is
v_archivo Blob;
f bfile := bfilename(p_directory,p_filename);
begin
dbms_lob.fileopen(f,dbms_lob.file_readonly);
v_archivo := dbms_lob.substr(f);
dbms_lob.close(f);
return v_archivo;
end;
esta función toma el archivo que puse en el directorio para esto cree un procedimiento send_mail que utiliza el utl_smtp para el envio de correos lo cual hace pero los envia con tamaño de 32KB.
1
2
3
4
5
6
7
8
9
10
11
12
IF p_attach_name IS NOT NULL THEN
UTL_SMTP.write_data(l_mail_conn, '--' || l_boundary || UTL_TCP.crlf);
UTL_SMTP.write_data(l_mail_conn, 'Content-Type: ' || p_attach_mime || '; name="' || p_attach_name || '"' || UTL_TCP.crlf);
UTL_SMTP.write_data(l_mail_conn, 'Content-Transfer-Encoding: base64' || UTL_TCP.crlf);
UTL_SMTP.write_data(l_mail_conn, 'Content-Disposition: attachment; filename="' || p_attach_name || '"' || UTL_TCP.crlf || UTL_TCP.crlf);
FOR i IN 0 .. TRUNC((DBMS_LOB.getlength(p_attach_blob) - 1 )/l_step) LOOP
UTL_SMTP.write_data(l_mail_conn, UTL_RAW.cast_to_varchar2(UTL_ENCODE.base64_encode(DBMS_LOB.substr(p_attach_blob, l_step, i * l_step + 1))));
END LOOP;
UTL_SMTP.write_data(l_mail_conn, UTL_TCP.crlf || UTL_TCP.crlf);
END IF;
Esta es la parte de mi codigo donde atacho el documento.
Si alguien ya soluciono esto le agradeceria me indique que hacer. He leido que blob soporta hasta 4GB pero nose si por estar utilizando funciones raw este teniendo algun inconveniente.
Saludos
Valora esta pregunta


0