En relación a un artículo publicado anteriormente sobre envío de emails, me gustaría hacer las siguientes aclaraciones:
1) Si queremos adjuntar un fichero dentro de un directorio en el servidor, es obligatorio usar un directorio de Oracle previamente creado. No podemos referenciar un directorio del servidor directamente.
Por ejemplo: si tenemos que leer archivos que se encuentren en la ruta /imagenes, habrá que crear el directorio previamente de esta manera:
CREATE OR REPLACE DIRECTORY images_dir AS '/imagenes'
/
Para leer los archivos desde nuestros programas, es necesario otorgar el permiso correspondiente al usuario (siendo usuario el usuario que leerá los adjuntos):
GRANT READ ON DIRECTORY images_dir TO usuario
/
También hay que tener el privilegio de sistema CREATE ANY DIRECTORY para crear un directorio de Oracle.
2) Por otra parte, el directorio del cual leer (/imagenes en este caso) debe existir en el servidor de base de datos y tener al menos el permiso de lectura correspondientes, igual que los archivos que contenga. De no ser así, el procedimiento de envío de emails no será capaz de leerlos. Cómo se hace esto ya depende del sistema operativo del servidor.
3) Si inicialmente no tenéis acceso directo al servidor pero queréis hacer pruebas, es posible crear con PLSQL un fichero con información trivial para utilizarlo desde tus programas. Algo así como:
-- Añade permiso de escritura sobre el directorio Oracle, si no lo tenía
GRANT WRITE ON DIRECTORY images_dir TO usuario
/
-- Crea un fichero de prueba con el texto Texto de prueba
DECLARE
l_output UTL_FILE.file_type;
v_buffer VARCHAR2(255);
BEGIN
-- define output directory
l_output := UTL_FILE.fopen('IMAGES_DIR', 'prueba.txt','a');
UTL_FILE.PUT_LINE(l_output,'Texto de prueba');
UTL_FILE.fflush(l_output);
UTL_FILE.fclose(l_output);
-- Con esto me aseguro de que el fichero ya lo tengo
l_output := UTL_FILE.fopen('IMAGES_DIR', 'prueba.txt','r');
UTL_FILE.GET_LINE(l_output,v_buffer);
UTL_FILE.fclose(l_output);
DBMS_OUTPUT.PUT_LINE(v_buffer);
END;
/
Ahora ya es posible realizar una prueba con adjuntos:
DECLARE
v_ret NUMBER;
v_error VARCHAR2(1024);
v_attachs Pkg_Emails.t_attachments;
v_replies UTL_SMTP.replies;
BEGIN
v_attachs(0).mimetype := 'text/plain';
v_attachs(0).filename := 'prueba.txt';
v_attachs(0).DIRECTORY:='IMAGES_DIR';
v_ret := Pkg_Emails.send_mail_with_attachments(
pe_sender => 'MiEmail@MiDominio',
pe_recipients => 'TuEmail@TuDomicio',
pe_subject => 'Asunto de la prueba con adjunto',
pe_message => 'Texto de la prueba con adjunto',
pe_attachments => v_attachs,
ps_replies => v_replies);
-- Ha habido algún error
IF v_replies.COUNT > 0 THEN
DBMS_OUTPUT.PUT_LINE(v_replies(0).text);
END IF;
END;
/
Un detalle que puede parecer trivial pero nos puede dar muchos quebraderos de cabeza si no lo hacemos bien: si hemos creado el directorio Oracle usando un identificador sin usar comillas dobles, es obligatorio referirnos al mismo, dentro de nuestros programas, en mayúsculas. Por tanto, no es casual que se hayan usado mayúsculas en estas instrucciones PLSQL anteriores:
l_output := UTL_FILE.fopen('IMAGES_DIR', 'prueba.txt','a');
v_attachs(0).DIRECTORY:='IMAGES_DIR';
Un compendio de trucos y utilidades que facilitan la vida del desarrollador de Oracle Forms y Reports y en general de los programadores de PL/SQL.
Mostrando entradas con la etiqueta adjuntos. Mostrar todas las entradas
Mostrando entradas con la etiqueta adjuntos. Mostrar todas las entradas
martes, 13 de mayo de 2014
jueves, 10 de noviembre de 2011
Envío de emails con ficheros adjuntos
Es posible que sepáis que desde hace bastante tiempo, concretamente desde la versión 8.1.7, Oracle nos brinda la posibilidad de hacer envíos de emails desde la base de datos gracias al paquete UTL_SMPT. En él tenemos implementadas las funcionalidades necesarias para establecer una conversación entre el servidor de base de datos y un servidor de correo SMTP que tengamos accesible.
No obstante, la implementación del protocolo de conversación requiere conocer bastante al detalle cómo funciona SMTP; por ello Oracle incluyó en sus distribuciones un paquete de demostración llamado DEMO_MAIL que nos facilitaba bastante las cosas. Más adelante, desde la versión 10g, tenemos a nuestra disposición el paquete UTL_MAIL que es aún nos lo pone más fácil.
Sin embargo, ninguna de estas implementaciones permite enviar un email de manera sencilla para el caso de emails con adjuntos, de manera que sólo haya que indicar el nombre del fichero y ocasionalmente su tipo mime; en la implementación que os presento es así, pero no hay que olvidar que el fichero debe estar almacenado en el propio servidor de base de datos.
Suscribirse a:
Entradas (Atom)