Outlook VBA: reenviar correos de una carpeta inspeccionada

Desafío: Un cliente necesita automatizar un proceso. El recibe numerosos correos electrónicos y necesita reenviar ciertos correos que el marca manualmente a una aplicación «Inbox by Baltic Spot» que trata la información recibida en esos correos y la adjunta a una base de datos, donde se pueden analizar en conjunto con los ya existentes y representa un valor añadido importante.

Escenario: El buzón del usuario esta albergado en servidores Exchange 2010 y la versión de Outlook usada es Microsoft Outlook 2016 (aunque servirá igualmente en 2013). El OS del equipo no es relevante.

Solución: Como solución le propongo una macro ex Outlook 2016, ya que es el software que utiliza habitualmente que «procese» los mensajes que se mueven a una determinada carpeta.

Macro: El objetivo de esta macro es «inspeccionar» los correos electrónicos de una carpeta determinada y realizar con ellos dos acciones: Por una parte reenviarlos a una dirección de correo preestablecida y posteriormente moverlos a una carpeta de «Items Procesados».

Problemas encontrados: Hacer una macro que realice el anterior proceso es relativamente sencillo (dejaré una muestra al final del post). El problema viene dado cuando se intenta realizar lo mismo pero el usuario selecciona y mueve de una sola vez varios correos a esa carpeta. Realmente hay dos problemas:

  1. Por una parte el Evento Items.ItemAdd «literalmente» no se ejecuta cuando se agregan un gran número de elementos a la carpeta. ¿Cuántos? No sé sabe. Yo he probado la macro con 20 o 25 correos y funciona sin problema.
  2. El segundo problema es que este evento se vuelve «un poco loco» al combinarlo con el método MailItem.Send y además mover («eliminar») correos en la carpeta inspeccionada y el resultado es que si se realiza un bucle dentro de Items.ItemAdd para enviar varios elementos, algunos correos aleatoriamente se envían repetidos (Supongo que Outlook no tiene tiempo para todo). Para este segundo problema no he encontrado solución, aunque si he visto que algunas personas lo comentaban en foros, no he localizado una solución «Buena» y la mía es un poco, digamos… «chapucera«, pero funciona que es lo que importa.Si alguien encuentra un solución «más digna», estaré encantado de probarla. ¿Cual ha sido mi solución?, pues después de varios prueba/error meter una pequeña pausa dentro del bucle que procesa cada correo electrónico y mover la declaración del objeto mensaje dentro del bucle.
La macro, que deberemos meter en «ThisOutlookSession» es la siguiente:

En la macro deberás sustituir:

  • example@domain.com, por el nombre del buzón en Outlook y lógicamente adaptar las carpetas a la estructura que uses. Hay más formas de referenciar los items de una carpeta, pero esta a mi me parece muy visual.
  • destination@domain.com, por el correo electrónico donde se reenviarán los mensajes movidos a la carpeta inspeccionada.

La barra de progreso podéis quitarla, pero ya que existe un delay es mejor poner algo que muestre al usuario que Outlook está ocupado y cuánto va a tardar. Para desarrollar esta barra simplemente he seguido las indicaciones de Steve Bateman en su post  VBA dialog/form showing progress. A mi me gusta trabajar con Application.StatusBar, pero lamentablemente no está disponible en Outlook.En cuanto a la pausa, tengo una función ExecPause que simplemente espera un tiempo determinado ya que tampoco tenemos disponible en Outlook Application.Wait y es la mejor forma de imitarla que se me ha ocurrido.

Otra macro que haría lo mismo, pero suponiendo que el usuario va a mover los correos electrónicos uno a uno sería la siguiente, mucho más simple:

El siguiente paso será firmar esta macro, para no tener que rebajar demasiado la seguridad en Outlook, esta explicado en el siguiente post: VBA: Firmar nuestro código.

2 comentarios

  1. estimado para ejecutar el código puede ser en mi bandeja de usuario outlook de la empresa donde laboro o necesito hacerlo en el servidor ???, como lo ejecutas lo he copiado pero cuando lo ejecuto no hace nada (con los cambios de mover carpetas y correo de salida ) ?????.

    1. Hola, el código debes introducirlo en «ThisOutlookSession» dentro del editor VBA de tu Outlook. Estando en Outlook pulsa Alt+F11 y eso te llevará a VBA. Localiza en la parte izquierda «ThisOutlookSession» y copia el código en el panel derecho. Tendrás que modificar los nombres tanto de la cuenta de correo (en el ejemplo example@domain.com» y de la carpeta que quieras monitorizar (en el ejemplo «Bandeja de entrada» y también las direcciones de correo para los reenvios. Puede poner tn un punto de interrupción en la primera instrucción de ItemAdd, así te saltará el editor VBA en cuanto detecte que hay un nuevo correo en la bandeja monitorizada. Si no salta es que algo esta mal definido y por eso no se ejecuta nada.
      Espero haberte ayudado.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *