Oracle - Enviar archivos grandes con UTL_SMTP

 
Vista:

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

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
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder