Gestión avanzada de mensajes de correo electrónico
Rastrear progreso de conversión de documentos
Aspose.Email ofrece la capacidad de rastrear el progreso de la conversión de documentos. Para ello, la API proporciona SaveOptions.CustomProgressHandler. que representa el método que maneja los eventos de progreso. Los tipos de eventos de progreso están representados por el ProgressEventType enumeración. El ProgressEventType la enumeración tiene los siguientes miembros.
- MimeStructureCreated: Este evento informa que la estructura MIME ha sido creada.
- MimePartSaved: Este evento indica que se ha finalizado el guardado de una parte MIME.
- SavedToStream: Este evento indica que todas las partes MIME se han guardado en el flujo.
El siguiente código de ejemplo demuestra el uso de SaveOptions.CustomProgressHandler y ProgressEventType enumeración que rastrea el progreso de conversión del documento.
// The path to the File directory.
string dataDir = RunExamples.GetDataDir_Email();
var fileName = dataDir + "test.eml";
MailMessage msg = MailMessage.Load(fileName);
MemoryStream ms = new MemoryStream();
EmlSaveOptions opt = new EmlSaveOptions(MailMessageSaveType.EmlFormat);
opt.CustomProgressHandler = new ConversionProgressEventHandler(ShowEmlConversionProgress);
msg.Save(ms, opt);
A continuación se muestra el código de la clase personalizada usada en el ejemplo de código anterior.
private static void ShowEmlConversionProgress(ProgressEventHandlerInfo info)
{
int total;
int saved;
switch (info.EventType)
{
case ProgressEventType.MimeStructureCreated:
total = info.TotalMimePartCount;
saved = info.SavedMimePartCount;
Console.WriteLine("MimeStructureCreated - TotalMimePartCount: " + total);
Console.WriteLine("MimeStructureCreated - SavedMimePartCount: " + saved);
break;
case ProgressEventType.MimePartSaved:
total = info.TotalMimePartCount;
saved = info.SavedMimePartCount;
Console.WriteLine("MimePartSaved - TotalMimePartCount: " + total);
Console.WriteLine("MimePartSaved - SavedMimePartCount: " + saved);
break;
case ProgressEventType.SavedToStream:
total = info.TotalMimePartCount;
saved = info.SavedMimePartCount;
Console.WriteLine("SavedToStream - TotalMimePartCount: " + total);
Console.WriteLine("SavedToStream - SavedMimePartCount: " + saved);
break;
}
}
Renderizar hipervínculos con estilos personalizados
Puede haber ocasiones en que necesites generar hipervínculos con un estilo específico según los requisitos de tu aplicación. Para eso, Aspose.Email ofrece HyperlinkRenderingCallback. Puede pasar el HyperlinkRenderingCallback como parámetro de MailMessage.GetHtmlBodyText.
El siguiente fragmento de código le muestra cómo usar HyperlinkRenderingCallback para generar hipervínculos usando su propio estilo personalizado.
public static void Run()
{
string dataDir = RunExamples.GetDataDir_Email();
var fileName = dataDir + "LinksSample.eml";
MailMessage msg = MailMessage.Load(fileName);
Console.WriteLine(msg.GetHtmlBodyText(RenderHyperlinkWithHref));
Console.WriteLine(msg.GetHtmlBodyText(RenderHyperlinkWithoutHref));
}
private static string RenderHyperlinkWithHref(string source)
{
int start = source.IndexOf("href=\"") + "href=\"".Length;
int end = source.IndexOf("\"", start + "href=\"".Length);
string href = source.Substring(start, end - start);
start = source.IndexOf(">") + 1;
end = source.IndexOf("<", start);
string text = source.Substring(start, end - start);
string link = string.Format("{0}<{1}>", text, href);
return link;
}
private static string RenderHyperlinkWithoutHref(string source)
{
int start = source.IndexOf(">") + 1;
int end = source.IndexOf("<", start);
string text = source.Substring(start, end - start);
return text;
}
Mostrar información en orden personalizado en archivos MHTML
Aspose.Email proporciona MhtSaveOptions.RenderingHeaders propiedad que devuelve la lista de encabezados para renderizar. Puede agregar los encabezados usando el MhtTemplateName clase. El orden en que se agregan los encabezados determina el orden en que se muestra la información.
La siguiente imagen compara los tres resultados generados por el código de ejemplo.

El siguiente fragmento de código demuestra el uso de MhtSaveOptions.RenderingHeaders propiedad para establecer el orden en que la información se muestra en los archivos MHTML de salida.
// The path to the File directory.
string dataDir = RunExamples.GetDataDir_Email();
MailMessage eml = MailMessage.Load(dataDir + "Attachments.eml");
MhtSaveOptions opt = SaveOptions.DefaultMhtml;
eml.Save(dataDir + "CustomOrderOfInformationInMHTML_1.mhtml", opt);
opt.RenderingHeaders.Add(MhtTemplateName.From);
opt.RenderingHeaders.Add(MhtTemplateName.Subject);
opt.RenderingHeaders.Add(MhtTemplateName.To);
opt.RenderingHeaders.Add(MhtTemplateName.Sent);
eml.Save(dataDir + "CustomOrderOfInformationInMHTML_2.mhtml", opt);
opt.RenderingHeaders.Clear();
opt.RenderingHeaders.Add(MhtTemplateName.Attachments);
opt.RenderingHeaders.Add(MhtTemplateName.Cc);
opt.RenderingHeaders.Add(MhtTemplateName.Subject);
eml.Save(dataDir + "CustomOrderOfInformationInMHTML_3.mhtml", opt);
Mostrar asistentes opcionales en archivos MHT
Al trabajar con el formato MHT, puede mostrar u ocultar información sobre asistentes opcionales en la cabecera de los eventos del calendario. Para configurar MhtSaveOptions para el manejo de archivos MHT, necesita entender cómo el MhtFormatOptions.RenderCalendarEvent y MhtFormatOptions.WriteHeader los parámetros funcionan para personalizar la salida según sus necesidades, particularmente al gestionar la visualización de asistentes opcionales.
-
MhtFormatOptions.RenderCalendarEvent: Este parámetro controla si los detalles de los eventos del calendario se renderizan en el archivo MHT. Al establecer esta opción, se asegura de que la información completa del evento, incluidos los detalles de los asistentes, se incluya en la salida. Esto es esencial para proporcionar documentación completa de los eventos del calendario.
-
MhtFormatOptions.WriteHeader: Este parámetro determina si las cabeceras que contienen metadatos como asunto, fecha e información de participantes (incluidos los asistentes opcionales, cuando estén configurados) se escriben en el archivo MHT. Activar esta opción asegura que información contextualmente relevante acompañe su mensaje, mejorando la comprensión.
El ejemplo de código a continuación demuestra cómo usar la función mostrar asistentes opcionales al guardar un msg en formato mhtml:
MhtSaveOptions options = new MhtSaveOptions()
{
MhtFormatOptions = MhtFormatOptions.RenderCalendarEvent | MhtFormatOptions.WriteHeader
};
MailMessage eml = MailMessage.Load(fileName);
eml.Save(fileName + ".mhtml", options);
Si necesita excluir información sobre asistentes opcionales del archivo MHT, simplemente borre la plantilla de formato para OptionalAttendees antes de guardar:
//if you need to skip OptionalAttendees in mhtml file you can clear format template for OptionalAttendees
options.FormatTemplates[MhtTemplateName.OptionalAttendees] = "";
msg.Save(fileName + "2.mhtml", options);
Guardar todas las cabeceras en MHTML
El MhtSaveOptions.SaveAllHeaders propiedad del MhtSaveOptions clase define si es necesario guardar todas las cabeceras en el MHTML de salida o no. El siguiente fragmento de código muestra cómo guardar todas las cabeceras de un archivo MHTML:
var eml = MailMessage.Load("message.eml");
var sopt = SaveOptions.DefaultMhtml;
sopt.SaveAllHeaders = true;
eml.Save("message.mhtml", sopt);
Procesamiento de Mensajes Rebotados
Es muy común que un mensaje enviado a un destinatario pueda rebotar por cualquier razón, como una dirección de destinatario no válida. La API Aspose.Email tiene la capacidad de procesar dicho mensaje para verificar si es un correo electrónico rebotado o un mensaje de correo regular. El CheckBounced método del MailMessage clase devuelve un resultado válido si el mensaje de correo es un correo rebotado. Este artículo muestra el uso de la BounceResult clase que proporciona la capacidad de comprobar si un mensaje es un correo rebotado. Además ofrece información detallada sobre los destinatarios, la acción tomada y la razón de la notificación. El siguiente fragmento de código muestra cómo procesar mensajes rebotados.
string fileName = RunExamples.GetDataDir_Email() + "failed1.msg";
MailMessage mail = MailMessage.Load(fileName);
BounceResult result = mail.CheckBounced();
Console.WriteLine(fileName);
Console.WriteLine("IsBounced : " + result.IsBounced);
Console.WriteLine("Action : " + result.Action);
Console.WriteLine("Recipient : " + result.Recipient);
Console.WriteLine();
Console.WriteLine("Reason : " + result.Reason);
Console.WriteLine("Status : " + result.Status);
Console.WriteLine("OriginalMessage ToAddress 1: " + result.OriginalMessage.To[0].Address);
Console.WriteLine();
Analizador de Spam Bayesiano
Aspose.Email ofrece filtrado de correo electrónico usando un analizador Bayesian de spam. Proporciona el SpamAnalyzer clase para este propósito. Este artículo muestra cómo entrenar el filtro para distinguir entre spam y correos electrónicos regulares basándose en la base de datos de palabras.
El flujo de trabajo consta de dos pasos. Primero, el filtro se entrena con un conjunto de mensajes normales ("ham") y de spam con el TrainFilter método, y la base de datos resultante de palabras se almacena con SaveDatabase. Luego la base de datos se carga en un SpamAnalyzer y el Prueba el método devuelve la probabilidad (de 0 a 1) de que un mensaje sea spam.
string hamFolder = RunExamples.GetDataDir_Email() + "/hamFolder";
string spamFolder = RunExamples.GetDataDir_Email() + "/Spam";
string testFolder = RunExamples.GetDataDir_Email();
string dataBaseFile = RunExamples.GetDataDir_Email() + "SpamFilterDatabase.txt";
// Train the filter and save the words database
SpamAnalyzer teacher = new SpamAnalyzer();
foreach (string file in Directory.GetFiles(hamFolder, "*.eml"))
{
// false marks the message as a regular one
teacher.TrainFilter(MailMessage.Load(file), false);
}
foreach (string file in Directory.GetFiles(spamFolder, "*.eml"))
{
// true marks the message as spam
teacher.TrainFilter(MailMessage.Load(file), true);
}
teacher.SaveDatabase(dataBaseFile);
// Analyze the test messages using the created database
SpamAnalyzer analyzer = new SpamAnalyzer(dataBaseFile);
foreach (string file in Directory.GetFiles(testFolder, "*.eml"))
{
MailMessage msg = MailMessage.Load(file);
Console.WriteLine(msg.Subject);
double probability = analyzer.Test(msg);
Console.WriteLine(probability > 0.5
? $"Spam (probability: {probability:P})"
: $"Not spam (probability: {probability:P})");
}
Obtener preámbulo y epílogo de mensajes EML
Un mensaje de correo electrónico puede contener información oculta como texto plano antes del cuerpo del mensaje (es decir, preámbulo) o después del cuerpo (es decir, epílogo). Normalmente es información adicional o contexto para el destinatario antes o después de leer el contenido principal del correo. Puede obtener esta información usando MailMessage.Preamble o/y MailMessage.Epilogue propiedades respectivamente.
Ambas propiedades son del tipo string y son de lectura/escritura, por lo que también pueden usarse para establecer el preámbulo y el epílogo de un mensaje que usted componga. El siguiente fragmento de código muestra cómo obtener los textos del preámbulo y epílogo:
var eml = MailMessage.Load("message.eml");
// Gets a preamble text
Console.WriteLine("Preamble: " + eml.Preamble);
// Gets an epilogue text
Console.WriteLine("Epilogue: " + eml.Epilogue);
Rastreo de correos electrónicos usando MDN y confirmaciones de lectura
La API Aspose.Email brinda soporte para el rastreo de correos electrónicos usando Message Disposition Notification (MDN). Esto se logra solicitando confirmaciones de lectura y creando la información requerida. La MailMessage.ReadReceiptTo propiedad obtiene o establece las direcciones de acuse de recibo. Es una MailAddressCollection, por lo que una única dirección puede asignarse como cadena, mientras que varias direcciones pueden añadirse a la colección. El CreateReadReceipt el método crea un acuse de recibo de lectura para un mensaje recibido, y el MapiMessage.ReadReceiptRequested la propiedad obtiene o establece si se solicita un acuse de recibo de lectura para un mensaje de Outlook. El siguiente fragmento de código muestra cómo rastrear el correo electrónico usando la API de Aspose.Email.
var client = new SmtpClient("smtp.server.com", 587, "username", "password");
// Send a message with the requested read receipt
var mailMessage = new MailMessage("from@domain.com", "to@domain.com", "test MDN", "This is a test message with read receipt requested");
// Request the read receipt. A single address can be assigned as a string
mailMessage.ReadReceiptTo = "from@domain.com";
client.Send(mailMessage);
// Add multiple ReadReceiptTo addresses and send the message
mailMessage = new MailMessage("from@domain.com", "to@domain.com", "test MDN", "This is a test message with read receipt requested");
var addressCollection = new MailAddressCollection();
addressCollection.Add("from@domain.com");
addressCollection.Add("another@domain.com");
mailMessage.ReadReceiptTo = addressCollection;
client.Send(mailMessage);
// On the recipient side: check the request, then create and send the read receipt
var emlMDN = MailMessage.Load("received.eml");
if (emlMDN.ReadReceiptTo.Count > 0)
{
client.Send(emlMDN.CreateReadReceipt("to@domain.com", null));
}
// Create a MapiMessage with a requested read receipt
var mapiMessage = new MapiMessage("from@domain.com", "to@domain.com", "test MDN", "This is a read requested mapiMessage", OutlookMessageFormat.Unicode);
mapiMessage.ReadReceiptRequested = true;
// Create a MailMessage with a requested read receipt and convert it to MapiMessage
mailMessage = new MailMessage("from@domain.com", "to@domain.com", "test MDN", "This is a test message with read receipt requested");
mailMessage.ReadReceiptTo = "from@domain.com";
mapiMessage = MapiMessage.FromMailMessage(mailMessage, MapiConversionOptions.UnicodeFormat);