Una de las características más utilizadas de TeamworkPM es la capacidad de responder a notificaciones por correo electrónico y agregar su comentario a su proyecto. Los archivos adjuntos que envíe a través de la respuesta por correo electrónico también se agregarán al comentario y se mostrarán en la pestaña Archivos de su proyecto. Una de mis áreas centrales en el equipo de desarrollo es el procesamiento de correo electrónico. Si se envía un correo electrónico a Teamwork, soy yo quien hace que todo funcione. Dado que el correo electrónico es el método de comunicación, existen muchos "problemas" que deben ser abordados por nuestra parte. Estos incluyen el manejo de correos electrónicos de texto / HTML, analizar el bit de "respuesta" y descartar el contenido citado de la notificación original, validar al usuario que envía la respuesta, guardar los archivos adjuntos, etc. En este artículo pensé que sería interesante centrarme en uno de los desafíos que enfrentamos al manejar los archivos adjuntos de correo electrónico y la solución que implementamos: las imágenes de firma.

Algunos antecedentes

Cuando lanzamos por primera vez las notificaciones por correo electrónico de Teamwork eran unidireccionales. Solo pudo recibir notificaciones, pero no aceptamos respuestas. Debía iniciar sesión en Teamwork para responder a un mensaje o comentario. Las personas están acostumbradas a enviar correos electrónicos y esperan poder responder a los correos electrónicos. Agregamos la capacidad de responder a las notificaciones por correo electrónico y agregar la respuesta como comentario o mensaje en su proyecto. En aquel entonces, podía agregar un comentario en Teamwork pero no podía adjuntar archivos al comentario. Debido a esta limitación, solíamos omitir los archivos adjuntos al procesar los correos electrónicos. A medida que avanzaba Teamwork, agregamos la capacidad de adjuntar archivos a los comentarios en Teamwork. Esto significaba que ahora también podíamos procesar los archivos adjuntos en las respuestas de correo electrónico. ¡Fantástico! A la gente le encantó ... Pero surgió un nuevo problema: las imágenes de la firma de las personas ahora se estaban agregando al comentario y, lo que es peor, se estaban agregando a la sección Archivos ... en cada respuesta. La retroalimentación comenzó a llegar.

El problema

Cuando llega un correo electrónico a Teamwork, obtenemos una lista de archivos adjuntos. Algunos son archivos adjuntos genuinos, otros son imágenes de firma. No tenemos absolutamente ninguna forma de saber cuáles son archivos adjuntos legítimos y cuáles son parte de una firma. Analizamos cientos de correos electrónicos y no pudimos encontrar una forma estándar de distinguir los archivos adjuntos. Había algunos nombres de archivo que parecían estándar (como image001.png) que pensamos que podríamos simplemente ignorar, pero luego descubrimos que las imágenes pegadas en línea en un correo electrónico también podrían llamarse image001.png. No podíamos ignorarlos, ya que podrían ser una captura de pantalla importante.

La solución

Inicialmente, pensamos que no había nada que pudiéramos hacer al respecto. Calculamos que las personas reciben correos electrónicos todos los días con las mismas imágenes de firma en Gmail, Thunderbird, Outlook, etc., para que comprendan cuándo las imágenes de firma también se reciben varias veces en Teamwork. Pero Teamwork es diferente. La pestaña Archivos estaba repleta de estas imágenes de firma y estas imágenes estaban utilizando el espacio de archivo. La retroalimentación llegó densa y pesada. Algo había que hacer. Me estaba cansando de responder una y otra vez a los mismos comentarios ... Y luego tuve una epifanía. ¿Qué pasaría si pudiéramos obtener una "huella digital" de cada archivo de imagen para que, sin importar el nombre del archivo, supiéramos que es la misma imagen? ¡Podría usar una función Hash para obtener la huella digital! Una función hash es un algoritmo que toma un bloque de datos arbitrario y devuelve una cadena de bits de tamaño fijo. Por ejemplo, si aplica un hash a un libro electrónico pasando el contenido a la función, obtendrá una cadena de 32 caracteres. Si aplica el hash al mismo libro electrónico 10 veces, siempre obtendrá la misma cadena de 32 caracteres. Si cambiara incluso una sola letra en el libro electrónico y pasara el contenido a través de la función, obtendría una cadena de 32 caracteres completamente diferente. Así que hice algunas pruebas…. Creé una prueba unitaria para una nueva función que escribí que lee el contenido del archivo binario, lo convierte en una cadena y luego codifica el contenido usando un hash MD5. Tomé 3 copias de la misma imagen, las renombré a file1.jpg, file2.jpg y file3.jpg y ejecuté cada una a través de mi función y se devolvió la misma cadena de "huella digital". Luego amplié mi prueba unitaria para que se conectara a un buzón POP, procesara los archivos adjuntos y generara la "huella digital" de cada archivo adjunto. Envié 3 correos electrónicos a esta caja POP, cada uno con la misma imagen adjunta y ¡funcionó! Las 3 huellas dactilares adjuntas coincidieron. Pasé unas horas refinando mi función, expandiendo la base del código Teamwork e implementé el hash de adjuntos. Como las imágenes de firma eran el problema, solo tuve que trabajar la huella digital para los archivos adjuntos que en realidad eran archivos de imagen (png, gif, bmp, jpeg, jpg, tiff, etc.) Las imágenes de firma también son predominantemente archivos de tamaño pequeño, por lo que solo necesito procesar la imagen archivos de menos de 100 kb. Cuando procesamos un correo electrónico y obtenemos la lista de archivos adjuntos, pasamos cualquier archivo adjunto de imagen a través de mi nueva función que devuelve la cadena "huella digital". Procesamos todos los archivos adjuntos con normalidad y almacenamos la "huella digital" en la base de datos junto con la referencia del archivo. La próxima vez que se procesa un correo electrónico, hacemos lo mismo con cada imagen adjunta, pero buscamos en la base de datos para ver si ya tenemos una imagen con la misma "huella digital". Si obtenemos una coincidencia, registramos la coincidencia para analizarla más tarde, saltamos el archivo adjunto y pasamos al siguiente, y así sucesivamente. Agregamos un índice en la tabla Archivos en la base de datos para la "huella digital", lo que significa que incluso si hay millones de registros en la tabla, obtendremos nuestra coincidencia al instante. Desde que implementamos esto ayer, nuestros archivos de registro han mostrado un aumento masivo en la cantidad de Imágenes de Firma detectadas y eliminadas de la funcionalidad de respuesta por correo electrónico. La primera vez que se procesa una respuesta por correo electrónico para un usuario, las imágenes de su firma se agregarán de forma normal, pero a partir de ese momento se omitirán. Si elimina los archivos de su proyecto Teamwork, seguiremos haciendo coincidir las "huellas digitales" de la imagen en el procesamiento posterior. ¡Con suerte, nunca volveré a responder comentarios relacionados con las imágenes de firma! Y.