Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Email
Code

Construyendo Características Avanzadas de Correo Electrónico Con IMAP y PHP

by
Difficulty:IntermediateLength:LongLanguages:

Spanish (Español) translation by Rafael Chavarría (you can also view the original English article)

What You'll Be Creating

En este tutorial, te guiaré a través de algunos ejemplos del mundo real de cómo puedes usar PHP e IMAP para construir nuevas características para administrar tu correo electrónico---características que los grandes proveedores de correo electrónico no han construido para nosotros.

Mi interés en esto comenzó en 2010 cuando escribí Doce Ideas de Gmail para Revolucionar el Correo Electrónico (De nuevo), pero la mayoría de las ideas que deseaba tener permanecieron fuera de alcance. Por tan importante que es el correo electrónico, la innovación del correo electrónico como aplicación ha sido bastante lenta.

Nos estamos ahogando en correo electrónico, y administrar nuestras bandejas de entrada aún es una pesada carga. Los servicios de correo y clientes han hecho muy poco para ayudarnos con esto. La mayoría del correo electrónico que recibimos es enviado por máquinas, no personas, y aún así somo los que tenemos que procesar de manera individual todo eso.

Un análisis de mi propio correo electrónico mostró que estaba recibiendo correo electrónico de más de 230 remitentes automáticos, mucho menos personas reales. Estaba cansado de construir filtros en Gmail y llenando una miriada de formularios de cancelación de suscripción. Quería tener más control sobre administrar mi correo electrónico y simplificar mi vida.

Finalmente, este año anterior, decidí construir las características que necesitaba. El resultado es Simplify Email (SE), una pequeña aplicación web que puedes hospedar tu mismo la cuál ofrece una variedad de geniales nuevas características de correo electrónico que puedes revisar todas en el sitio web del proyecto.

La cosa más genial sobre SE es que es una plataforma para leer, analizar, enrutar y administrar tu correo electrónico---las posibilidades abundan. Simplify Email es esencialmente un patio de recreo programable para "hackear" tu propio correo electrónico.

Te guiaré a través del código de tres ejemplos de SE que usan PHP, IMAP y MySQL para trabajar con correo electrónico:

  1. Revisar tu bandeja de entrada y filtrar mensajes
  2. Implementar un reto de Lista blanca para remitentes desconocidos
  3. Reportar correo electrónico sin responder

Este tutorial definitivamente te dará un buen comienzo para escribir código IMAP en PHP. Pero también puedes trabajar directamente con el código base de Simplify Email. Puedes comprar el código por tan poco como $10, y aquí está una versión más antigua de código abierto (la cuál carece de otras características que describimos abajo). Se proporcionan guías de instalación para configuraciones Linux típicas. También ofrezco imágenes pre-instaladas en Digital Ocean por $25 así como una instalación hanheld valet. SE está escrito en PHP, en el Framework Yii.

Nota que no podrás acceder a la mayoría de servidores de correo electrónico por medio de tu máquina local de desarrollo a menos que compiles una librería IMAP segura para PHP. Esta es una de las razones por las que aliento a la gente a ejecutar SImplify Email en droplets en Digital Ocean. También hay unos cuántos trucos para hacer que la seguridad de cuenta Google te deje entrar vía IMAP.

Trabajando con IMAP

Cómo Funciona Simplify Email

Con SE, puedes continuar usando tu cliente elegido de correo electrónico en Web y tus dispositivos móviles. No tienes que cambiar ninguna aplicación o hábitos personales. SE accede a tus cuentas de correo electrónico tras bambalinas vía IMAP; actuando como un asistente personal inteligente, SE pre-procesa tu correo electrónico, moviendo mensajes a los lugares apropiados basado en todo lo que le has dicho.

Cuando un mensaje llega de un remitente familiar, SE lo mueve a la carpeta que hayas especificado. Cuando uno llega de un remitente desconocido por primera vez, este lo mueve a la carpeta de revisión.

Cada par de horas (o a una frecuencia de tu elección), SE te enviará un resumen de a dónde movió tus mensajes y qué mensajes están en revisión. Nota, los enlaces para entrenar remitentes están incluidos para la carpeta de revisión, haciendo bastante sencillo entrenar a SE con el tiempo.

The Simplify Email Message Digest Shows You What Came In and How It Was Filtered

En cualquier momento, puedes navegar tu carpeta de revisión---no tienes que esperar para que el resumen llegue. Pero la ventaja de SE es que ya no necesitas navegar tus carpetas; puedes solo leer tu resumen para obtener una vista del correo electrónico que has recibido y entrenar nuevos remitentes.

1. Revisando Tu Bandeja de Entrada y Filtrando Mensajes

SE usa varias tareas cron para operar en segundo plano en tu servidor. Cada una llamada desde DaemonController.php.

El primero, processInbox, es llamado frecuentemente y necesita operar rápidamente---su trabajo es filtrar correo electrónico y sacarlo de la bandeja de entrada tan rápido como sea posible y a la carpeta de triaje, llamada la carpeta de filtrado.

El segundo, processFiltering, es más intenso en el procesamiento y realiza operaciones más profundas en correo electrónico, moviendo finalmente mensajes a su destino final.

El Método ProcessInbox

Las tareas cron llaman a processInbox de manera regular:

The Simplify Email Accounts Configuration Page

Para cada cuenta, desencriptamos tus credenciales de correo electrónico y después usamos imap_open para crear un flujo IMAP a tu carpeta de bandeja de entrada:

Dentro de processInbox, usamos las funciones de la librería PHP imap_search y imap_fetch_overview para recuperar un arreglo de mensajes:

Después procesamos el arreglo de mensajes en la bandeja de entrada:

Aquí está una versión adaptada del código de análisis de encabezado IMAP públicamente disponible que reúne la información adicional que SE necesita para una variedad de tareas. Básicamente, usa imap_rfc822_parse_adrlist para determinar información de remitente, id de mensaje, asunto y estampas de tiempo (o información de remitente cuando se escanea la carpeta de enviados):

Creamos registros para el remitente y el sobre de mensaje dentro de nuestra base de datos:

Si el remitente es nuevo para nosotros (desconocido), enviaremos un correo electrónico de reto de lista blanca (hablaremos más sobre los retos de lista blanca en la siguiente sección de abajo):

Después, determinamos si el usuario pudiera haber arrastrado un mensaje de otra carpeta de vuelta a la bandeja de entrada---pretendiendo entrenarla vía arrastrar y soltar. Si es así, establecemos el entrenamiento para este remitente a la bandeja de entrada. En otras palabras, la siguiente vez, quisiéramos solo enrutar mensajes de este remitente a la bandeja de entrada:

Si no, nos prepararemos para mover el mensaje a la carpeta de Filtrado para futuro procesamiento. Primero, deberíamos enviar notificaciones al teléfono del usuario si hay una coincidencia de remitente o palabra clave para notificaciones (y no son horas tranquilas):

Si el mensaje fue arrastrado a la bandeja de entrada, entonces actualizaremos nuestros ajustes de entrenamiento:

El Método ProcessFiltering

El método de procesamiento secundario es llamado processFiltering, también en DaemonController.php. Este hace los aspectos que consumen más tiempo de mover mensajes a las carpetas apropiadas:

Este método abre tu cuenta de correo electrónico para buscar mensajes recientes y reunir información acerca de estos. También usa imap_searchimap_fetch_overview y parseHeader:

El ciclo primario de procesamiento para cada mensaje en la carpeta de filtrado está bastante detallado. Primero vemos la dirección de receptor, ej. mensajes para el dominio happyvegetarian.com van a la carpeta veggie:

Después buscamos al remitente y creamos un nuevo registro en la base de datos (si es necesario). Si existe entrenamiento para el remitente, podemos establecer la carpeta de destino:

Si un remitente no entrenado (nuevo) se ha verificado a sí mismo vía un reto de Lista Blanca (que discutiré en la siguiente sección de abajo), entonces enrutaremos este mensaje a la bandeja de entrada:

Después, creamos una entrada de mensaje en la base de datos con la información de sobre acerca de este mensaje:

Si es de un remitente desconocido sin verificar, podemos mover el mensaje a la carpeta de revisión. La carpeta de revisión contiene todos los mensajes de remitentes que no reconocemos.

Si el mensaje es de un remitente desconocido y tenemos un destino en mente, podemos moverlo mientras no sean horas tranquilas (y no molestar esté apagado):

Durante las horas tranquilas, los mensajes son mantenidos primariamente en la carpeta de filtrado.

Cada par de horas, un proceso diferente construirá el resumen de mensaje usando los registros de la tabla de mensaje para determinar cuáles correos electrónicos fueron recientemente recibidos y filtrados y cómo fueron enrutados.

2. Implementando un Reto de Lista Blanca para Remitentes Desconocidos

La meta del reto de lista blanca es mantener cualquier mensaje de un remitente desconocido, ej. posiblemente un robot de mercadeo o spammer, fuera de tu bandeja de entrada. SE coloca correo electrónico de remitentes desconocidos en la carpeta de revisión. Sin embargo, si enciendes el listado blanco, enviamos un correo de reto que le da al remitente una oportunidad para verificar que son humanos. Si ellos responde, moveremos el mensaje a tu bandeja de entrada. Si el correo electrónico resulta ser no solicitado, puedes borrar el mensaje del resumen o arrastrarlo a cualquier carpeta a la que lo quieres entrenar.

El usuario puede encender y apagar el listado blanco en los ajustes:

Simplify email settings for whitelisting

Para implementar listado blanco, enviamos retos de correo electrónico siempre que nuevo correo llega de un nuevo remitente:

ChallengeSender envía un enlace codificado al usuario para que le den clic. También tenemos algunas protecciones para asegurar que no nos atrapamos a nosotros mismos en un ciclo de correo con un mensaje de fuera de la oficina:

Después, si el receptor da clic en el enlace codificado, lo verificamos en la base de datos. El Controlador de Envío procesa estas peticiones y revisa su validez:

Esto le dice a nuestros ciclos de procesamiento que mueva este y futuros mensajes de este remitente a la bandeja de entrada.

3. Reportando Correo Electrónico Sin Responder

Algunas veces ayuda ver un resumen de mensajes que has enviado pero no recibido una respuesta a estos. Para identificar estos, Simplify Email monitorea mensajes que han sido enviados pero no han recibido una respuesta.

Cada mensaje que recibimos contiene un id único, llamado el message_id (parte de la especificación IMAP). Frecuentemente luce como esto:

Además, cuando los mensajes son enviados en respuesta a otros mensajes, estos tienen un campo in_reply_to que enlaza de vuelta al message_id original.

Así que, usamos una consulta SQL para encontrar todos los mensajes recibidos que no tienen un mensaje de respuesta correspondiente referenciando su message_id. Para eso, usamos un LEFT OUTER JOIN en donde no hay id in_reply_to:

Usamos el modo $subject_compare para diferenciar entre mensajes enviados que no han sido contestados y nuestras respuestas enviadas a un hilo que no ha sido respondido. Aquí está el reporte de mensaje sin responder en tu cuenta:

Unanswered sent emails and unanswered sent replies threads

SE también ofrece esta información como un resumen opcional, llamado el resumen de correo electrónico sin responder. Puedes recibirlo todos los días, cada ciertos días o cada semana.

También usamos tabulación SQL similar con Google Charts para proporcionar reportes de qué tan frecuentemente ciertas personas te envían correo electrónico:

Reports of inbound email frequency by sender

Estaré escribiendo más sobre Google Charts para Tuts+ pronto.

Siguientes Pasos

Espero que hayas encontrado a Simplify Email lo suficientemente intrigante para probar en programación PHP IMAP. También muchas características geniales que puedes construir sin ninguna necesidad de grandes proveedores de correo electrónico para hacer cualquier cosa nueva.

Si tienes cualquier pregunta o correcciones, por favor publícalas en los comentarios. Si quisieras mantenerte al día con mis futuros turoriales Tuts+ y otras series, por favor sígueme @reifman o visita mi página de autor. También puedes contactarme aquí.

Enlaces Relacionados

Aquí hay algunos enlaces adicionales que podrías encontrar útiles:

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.