Hace un tiempo hablamos sobre la posibilidad de saber si un correo ha sido abierto por parte del destinatario, sin la necesidad de emitir un acuse de recibo. Este post lo titulamos Comprobación de apertura del correo.

Como en aquel post escribimos, para tener un control total sobre los correos enviados y recibidos, es necesario poder consultar nuestro buzón de correo desde el que mandamos los correos corporativos.

Con la técnica anterior, podemos saber si la dirección está bien formada, o si el usuario ha abierto el correo e incluso a veces si la dirección existe o no. Pero aun así, hay veces que esto no lo podremos saber, y hay que esperar a que nuestro servidor nos envíe un correo en el que nos informe del resultado del envío. Estos correos son los famosos Delivery Failure que aparece en el asunto del mismo.

En este post hablaremos de una API () y como esta nos ayuda a realizar las consultas y cómo manejar los datos obtenidos del  servidor pop. Esta API la podéis descargar de aquí, y se llama smtpop.

Una vez incluida esta librería al proyecto podemos crearnos un una clase que la consuma y realice las consultas, yo recomiendo un método estático que evite tener que instanciar la clase. El código seria el siguiente

public static bool ConsultaPop()

{

POP3Client pop = new POP3Client();

try

{

pop.ReceiveTimeout = 3 * 60000; // Set the timeout to 3 minutes

pop.Open(ConfigurationManager.AppSettings[“pop”].ToString(),                Convert.ToInt32(ConfigurationManager.AppSettings[“puertoPop”].ToString()), ConfigurationManager.AppSettings[“usuarioMail”].ToString(), ConfigurationManager.AppSettings[“ClaveCuentaPop”].ToString());

 

// retrieve messages list from pop server

POPMessageId[] messages = pop.GetMailList();

messages.OrderBy(x => x.Id);

 

foreach (POPMessageId id in messages)

{

POPReader reader = pop.GetMailReader(id);

MimeMessage msg = new MimeMessage();

// read the message

msg.Read(reader);

try

{

//Buscamos aquellos que han fallado en el envío

if (msg.Subject.Contains(“Delivery Failure”))

{

foreach (MimeAttachment attach in msg.Attachments)

{

string  expresion = “\\w+([-+.’]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*”;

if (Regex.IsMatch(attach.Body, expresion))

{

//busqueda del fallo

//Buscamos el correo que falla

string cadenaSeparadora =attach.Body.Remove(0, attach.Body.IndexOf(“To:”));

//Solo me vale la primera, ya que solo mando un mail, por correo (persona)

string[] mail = cadenaSeparadora.Remove(0, 3).Split(‘\r’);

string subj = (from s in mail

where s.Contains(“Subject:”)

select s).First();

string subjectCasiAsilado = subj.Remove(0,subj.IndexOf(“Subject:”)).Replace(“Subject:”,string.Empty).Trim();

GestionContactoBll.ActualizarIncidenciaContacto(mail[0].ToString(), subjectCasiAsilado, Entidades.TiposErrorMailing.NO_EXISTE_MAIL, “Error enviado por su gestor de correo, este correo no existe”);

 

return true;

 

 

}

}

}

}

catch

{

}

}

}

catch (Exception err)

{

}

pop.Quit();

return false;

}

 

Hay que tener en cuenta que hay parámetros de configuración que los estamos cogiendo del web.config (appSetting). Que el cuerpo del mensaje se envía como archivos adjuntos por eso tenemos que ir leyendo estos archivos para sacar la información que deseamos.

 

Conclusión:

El proceso de gestión de campañas de e-mailing, son procesos claves para el funcionamiento de muchas empresas, por ser un método de publicidad gratuita o al menos barata. Por ello hay que tener un control exhaustivo de aquellas direcciones que existentes y de los temas de interés del usuario.

A veces no vale con técnicas de apertura del correo electrónico (como son las técnicas de pixel mágico comentadas en el post sobre la comprobación de apertura del correo. ) Sino que a veces hay que ir más allá y hay que realizar consultas a un buzón o servidor pop con la librería smtpop, podemos hacer estas consultas de manera sencilla, pero conociendo como los servidores notifican el fallo del envío (subject y ficheros adjuntos).

 

Un saludo a todos

Anuncios