¿Por qué firmar digitalmente una macro VBA? Básicamente, para evitar posibles problemas con códigos maliciosos. Si nosotros desarrollamos una macro y la distribuimos a nuestro cliente (o incluso en nuestro propio equipo si no lo hemos configurado), siempre saltará una alerta indicando que se ha identificado un posible problema de seguridad, a no ser que hayamos modificado la Seguridad de las macros, indicando que queremos habilitar todas las macros (algo nada recomendable).
¿Cómo podemos añadir una firma digital a nuestro código? Aquí hay dos opciones, la elección dependerá de si somos profesionales que se dedican a desarrollar código y distribuirlo masivamente a clientes o si desarrollamos poco, para pocas personas, simplemente para aumentar nuestro conocimiento o para uso personal.
  • Si somos profesionales conviene hacerse con un certificado de firma de código de una entidad de certificados comercial (CA). Hay muchas, yo personalmente, para otro tipo de proyectos trabajo con Digicert, gran variedad, buen servicio técnico pos-venta y precios competitivos. Aún así, obtener un certificado de este tipo no es barato.
  • La otra opción que tenemos (gratuita) es hacernos un certificado personal de firma de código. Hay varias formas, pero Microsoft Office dispone de su propia herramienta par estos casos: SelfCert.exe. Aunque en el link anterior está explicado todo el proceso, aquí vamos a tratar de simplificarlo y poner un ejemplo. El problema de esta opción es que como el certificado no lo emite ninguna CA oficial, los proyectos que distribuyamos seguirán mostrando una alerta puesto que sólo se permite confiar en este tipo de certificados en el equipo que los crea.
Vamos a ver paso a paso cómo hacerlo con esta última opción:

Continúa leyendo

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: