En Rentalia.com hace unos meses hemos implementado un sistema llamado “Email flow modifier“. Dado a que existe interés por este tema, vamos a comentar cómo lo hemos implementado técnicamente, y las consideraciones adicionales que hemos discutido.
El resto del artículo tiene connotaciones técnicas.
(Puedes leer esta misma entrada en inglés).
¿Por qué el sistema “email flow modifier”?
Nos permite desarrollos como la tasa de respuesta y velocidad. Poder obtener estadísticas sobre las conversaciones entre propietarios y viajeros, para nosotros es muy importante, ya que es el centro de nuestro negocio.
Además, nos permite evitar el “comportamiento de spammer“. Cuando tienes un formulario en una web, con la finalidad de poner en contacto un usuario ([email protected]) con un servicio ([email protected]). Desde tudominio.com estas escribiendo a [email protected] con remitente [email protected]. Usando el email flow modifier todos los emails salientes tienen como remitente [email protected] lo que el “comportamiento de spammer” se elimina.
Vista general del sistema
Lo que queremos conseguir viene reflejado en el esquema anterior.
Fase 0: El usuario escribe por primera vez a service-[code]@tudominio.com desde [email protected] (el email puede ser generado por un formulario web).
Entre la fase 0 y 1, en el servidor de correo:
Se genera un código del email del usuario para ese servicio (user-[code]@tudominio.com).
Fase 1: Al servicio le llega a su correo electrónico desde el email user-[code]@tudominio.com
Fase 2: El servicio responde al usuario a través de user-[code]@tudominio.com.
Entre la fase 2 y la 3, en el servidor de correo:
La dirección de destino tiene formato user-[code]@tudominio.com. Con este código, obtenemos la dirección [email protected] y la dirección service-[code]@tudominio.com.
Fase 3: Se envía el contenido del email cambiando los campos from y to. Al usuario le llega el email desde service-[code]@tudominio.com.
Fase 4: Es igual que la fase 0, sólo que como ya tenemos el código del usuario, no se crea uno nuevo.
Requisitos del servidor de correo
Es muy probable que el sistema que hemos implantado se pueda hacer en otros servidores de correo. Para el funcionamiento básico, el servidor de correo necesita las siguientes características:
- Crear direcciones de correo con wildcards
- Ejecutar un script para atender el email (qmail es muy flexible en este aspecto)
Implementación
En todo este proyecto, la parte más difícil era saber cómo hacer el sistema consistente. La complejidad de la implementación es directamente proporcional a las cosas que necesitas que haga el email flow modifier. El lenguaje de programación usado es Perl.
Primero, creamos las cuentas de correo para que acepten wildcards. En el caso de qmail tendremos que crear dos archivos, .qmail-user-default y .qmail-service-default. El contenido será identico para ambos archivos:
|/path/to/script/emailflowmodifier.pl
De esta manera cuando llegue un correo electrónico se le pasará integramente al script.
En el script leemos el email completo:
while ($mail=<STDIN>) {
$completeemail .= $mail;
}
Separamos las cabeceras del cuerpo del email, ponemos que cada cabecera ocupe una línea
@tempmail = split(/\n\n/, $completeemail, 2);
$header = @tempmail[0];
$header =~ s/\n\s+/ /g;
Creamos un array asociativo con las cabeceras del email. (nombre/valor)
%hdrs = (UNIX_FROM => split /^(\S*?):\s*/m, $header);
Ya a partir de aquí miramos los emails en el To, en el CC y en el From. Reemplazamos las direcciones de email en todas las cabeceras (incluyendo el cuerpo, si corresponde), y obtenemos nuestro email transformado.
Una vez que tenemos las cabeceras y el cuerpo que queremos enviar, lo guardamos en un archivo en el disco duro y se lo enviamos directamente a través de qmail-inject
$command = "/var/qmail/bin/qmail-inject < /tmp/newmail.tmp";
$res = `$command`;
El qmail-inject interpretará el email y lo enviará donde corresponda.
Por último, devolvemos el código 99 para salir del script confirmando su envío.
Consideraciones a tener en cuenta
- Mucho cuidado con los posibles bucles.
- Remitir mensajes de error al usuario si estan usando direcciones con códigos erróneos.
- Si las direcciones de correo del usuario final o del propietario final, por lo que sea, dan error (tienen llena la cuenta o la dirección no existe) el email de error llegará al remitente sin problemas.
- Si envían emails usando direcciones BCC el sistema no funciona, se les remite un error.
- Las respuestas automáticas de los clientes de correo (confirmación de email recibido, respuestas automáticas) no funcionan, ya que muchos clientes usan direcciones BCC.
Optimizaciones
- Si un spammer intenta enviar emails masivos a fuerza bruta a las direcciones que aceptan wildcard, se puede minimizar el impacto implantando para esas direcciones de correo validrcpto.
Rentalia.com
[EN] Email flow modifier
We have developed a technology that we have called “Email flow modifier”. Some people have interest on this subject, we will expose a technical text about how we have implemented it.The rest of this article has technical connotations.(This article is…