jueves, 13 de septiembre de 2007

Forms 6: Enviar correo con adjunto a través de Outlook

Con este código nos permite añadir un mensaje en la bandeja de salida y luego enviarlo o mostrar el mensaje para ser enviado luego por el usuario.

DECLARE
v_outlookapp ole2.obj_type;
v_namespace ole2.obj_type;
v_mailitem ole2.obj_type;
v_oleparam ole2.list_type;
v_attachments ole2.obj_type;
BEGIN
v_outlookapp := ole2.create_obj('Outlook.Application');
v_oleparam := ole2.create_arglist;
ole2.add_arg(v_oleparam, 'MAPI');
v_namespace := ole2.invoke_obj(v_outlookapp, 'GetNameSpace', v_oleparam);
ole2.destroy_arglist(v_oleparam);
v_oleparam := ole2.create_arglist;
ole2.add_arg(v_oleparam, 0);
v_mailitem := ole2.invoke_obj(v_outlookapp, 'CreateItem', v_oleparam);
ole2.destroy_arglist(v_oleparam);
ole2.set_property(v_mailitem, 'To', 'xxxx@xxxmail.com');
ole2.set_property(v_mailitem, 'Subject', 'Asunto');
ole2.set_property(v_mailitem, 'Body', 'Texto del mensaje');

-- Añadimos el adjunto
v_attachments := ole2.get_obj_property(v_mailitem, 'Attachments');
v_oleparam := ole2.create_arglist;
ole2.add_arg(v_oleparam, 'C:\Temp\prueba.pdf');
ole2.invoke(v_attachments, 'add', v_oleparam);
ole2.destroy_arglist(v_oleparam);

-- Con esta línea invocamos el envío, si queremos
-- simplemente abrir el Outlook para que pueda revisar
-- el correo cambiamos 'Send' por 'Display'
ole2.invoke(v_mailitem, 'Send');

ole2.RELEASE_OBJ(v_mailitem);
ole2.RELEASE_OBJ(v_namespace);
ole2.RELEASE_OBJ(v_outlookapp);
END;

Sin adjunto sería parecido pero con menos código, ahí va el ejemplo:

DECLARE
v_outlookapp ole2.obj_type;
v_namespace ole2.obj_type;
v_mailitem ole2.obj_type;
v_oleparam ole2.list_type;
BEGIN
v_outlookapp := ole2.create_obj('Outlook.Application');
v_oleparam := ole2.create_arglist;
ole2.add_arg(v_oleparam, 'MAPI');
v_namespace := ole2.invoke_obj(v_outlookapp, 'GetNameSpace', v_oleparam);
ole2.destroy_arglist(v_oleparam);
v_oleparam := ole2.create_arglist;
ole2.add_arg(v_oleparam, 0);
v_mailitem := ole2.invoke_obj(v_outlookapp, 'CreateItem', v_oleparam);
ole2.destroy_arglist(v_oleparam);
ole2.set_property(v_mailitem, 'To', 'xxxx@xxxmail.com');
ole2.set_property(v_mailitem, 'Subject', 'Asunto');
ole2.set_property(v_mailitem, 'Body', 'Texto del mensaje sin adjunto');

-- Con esta línea invocamos el envío, si queremos
-- simplemente abrir el Outlook para que pueda revisar
-- el correo cambiamos 'Send' por 'Display'
ole2.invoke(v_mailitem, 'Send');

ole2.RELEASE_OBJ(v_mailitem);
ole2.RELEASE_OBJ(v_namespace);
ole2.RELEASE_OBJ(v_outlookapp);
END;

10 comentarios:

Javier dijo...

Una opción muy interesante , aunque creo haber visto eso en algún sitio, nose , jeje

Espero poder seguir viendo pequeños detalles de estos en los siguientes post. Y que dure mucho tiempo.

Maynor dijo...

Excelente aporte. El código funciona muy bien y lo encontré en el momento más oportuno.

Gracias.

Tomás dijo...

uso forms 10 y me peta :_(

sailefm dijo...

El post es específico para Forms 6, para Forms10 hay que usar la librería WEBUTIL. El funcionamiento es similiar, pero a las instrucciones hay que añadirle CLIENT_ delante.

david dijo...

Al ejecutarlo me salta la excepcion ORA-305500. Alguna idea de lo que puede ser?

sailefm dijo...

El ora ORA-305500 a que no tengas instalado el Microsoft Outlook (componente de Office), ya que con el Outlook express esto no funciona.

david dijo...

Y este codigo solo funciona para Microsoft Outlook? Y para Outlook Express o Mozilla Thunderbird hay algo al respecto?

sailefm dijo...

Que yo sepa no hay nada parecido.

En algún proyecto he tenido la necesidad de enviar correos sin pasar por ningún cliente de correo y los solucioné usando utilidad de línea de comandos BLAT http://www.blat.net/ llamándola con un HOST.

El problema es que al usuario no le queda el mensaje en elementos enviados, pero eso lo solucioné poniendole una copia oculta (CCO) para que también le llegase el correo al usuario que lo envía.

Agel dijo...

Hola, me funciona en outlook 2003 pero no en outlook 2007. sabe alguien por que?

Alex dijo...

Una dia tuve enojoso problema con mis outlook emails y no solvì el problema entre corto tiempo. Pero por fortuna supe solver este complejidad ayudarse un utiliza de Internet. Lo utiliza sabe ayudar en dificil cuestiòn lo mismo de me - reparar archivos .pst.