Librería POP3 en CSharp (II)

Librería POP3 en CSharp (II)

October 11, 2019

Siguiendo con la explicación de la librería POP3 en CSharp hoy vamos a hablar de mensajes.

Como vimos hace ya unos meses, se pueden descargar mensajes de correo fácilmente utilizando el método FetchEMail pero una vez que tenemos este mensaje debemos interpretarlo y tratarlo adecuadamente.

Para los nuevos en el protocolo POP3 debemos decir que todos los mensajes que se reciben utilizando este protocolo son cadenas en texto plano en formato MIME. Este formato no se utiliza únicamente en este protocolo, también se usa en SMTP, IMAP y el omnipresente REST por citar sólo algunos ejemplos.

Por resumir diremos que en este formato se combina toda la información del correo recibido en una cadena, es decir, incluye cabeceras con el tipo de codificación, los datos del destinatario y el remitente, el asunto, el cuerpo y los adjuntos. Si tenéis curiosidad por ver un ejemplo simplemente buscad en vuestro gestor de correo una opción de “Ver mensaje original” o similar.

Para mantener este formato la librería utiliza las clases del espacio de nombres Bau.Libraries.LibMailProtocols.Messages, en concreto la clase MimeMessage es la encargada de almacenar las propiedades del correo del remitente (From), destinatario o destinatarios (To, CC y BCC), asunto (Subject), cuerpo del mensaje (Body) y cuerpo del mensaje en HTML (BodyHTML) y adjuntos (Attachment).

Nota: puede que parezca extraño que haya dos cuerpos en el mensaje (Body y BodyHTML) pero el protocolo distingue entre ambos formatos.

Si lo que deseamos es interpretar la cadena de texto que hemos recibido como salida del método FethEMail podemos utilizar la clase MimeMessageParser de esta forma:

string strMessage = objPop3.FetchEMail(1);

MimeMessage objMimeMessage = MimeMessageParser.Parse(strMessage);

A partir de este momento podemos utilizar las propiedades del objeto MimeMessage para lo que deseemos, por ejemplo, para mostrarlo:

// Propiedades del mensaje
txtFrom.Text = GetAddress(objMessage.From);
txtTo.Text = GetAddress(objMessage.To);
txtCC.Text = GetAddress(objMessage.CC);
txtSubject.Text = objMessage.Subject;
txtDate.Text = string.Format("{0:dd-MM-yyyy HH:mm}", objMessage.DateSend);
// Cuerpo del mensaje
txtMessage.Text = objMessage.Body.Replace("\n", Environment.NewLine);

El método GetAddress simplemente crea una cadena con las direcciones de correo y no tiene interés para este artículo.

Si lo que deseamos es archivar los adjuntos en nuestro disco, podemos utilizar el método Save de la clase Section (los adjuntos se consideran secciones del correo igual que el cuerpo) de esta forma:

foreach (Section objAttachment in objMimeMessage.Attachments)
	objAttachment.Save(strFileName);