Gerenciamento Avançado de Mensagens de Email

Rastrear Progresso da Conversão de Documentos

Aspose.Email fornece a funcionalidade de rastrear o progresso da conversão de documentos. Para isso, a API fornece SaveOptions.CustomProgressHandler. que representa o método que lida com os eventos de progresso. Os tipos de evento de progresso são representados por ProgressEventType enumeração. O ProgressEventType enumeração possui os seguintes membros.

  • MimeStructureCreated: Este evento informa que a estrutura MIME foi criada.
  • MimePartSaved: Este evento informa que o salvamento de uma parte MIME foi concluído.
  • SavedToStream: Este evento informa que todas as partes MIME foram salvas no stream.

O código de exemplo a seguir demonstra o uso de SaveOptions.CustomProgressHandler e ProgressEventType enumeração que acompanha o progresso da conversão de documentos.

// 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 seguir está o código da classe personalizada usada no exemplo de código acima.

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;
    }
}

Pode haver momentos em que você precise gerar hiperligações com um estilo específico baseado nos requisitos da sua aplicação. Para isso, Aspose.Email fornece HyperlinkRenderingCallback. Você pode passar o HyperlinkRenderingCallback como parâmetro de MailMessage.GetHtmlBodyText.

O trecho de código a seguir mostra como usar HyperlinkRenderingCallback para exibir hyperlinks usando seu próprio 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;
}

Exibir Informações em Ordem Personalizada em Arquivos MHTML

Aspose.Email fornece MhtSaveOptions.RenderingHeaders propriedade que retorna a lista de cabeçalhos para renderização. Você pode adicionar os cabeçalhos usando o MhtTemplateName classe. A ordem em que os cabeçalhos são adicionados determina a ordem em que as informações são exibidas.

A imagem a seguir compara as três saídas geradas pelo código de exemplo.

todo:image_alt_text

O trecho de código a seguir demonstra o uso de MhtSaveOptions.RenderingHeaders propriedade para definir a ordem em que as informações são exibidas nos arquivos MHTML de saída.

// 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);

Exibir Participantes Opcionais em Arquivos MHT

Ao trabalhar com o formato MHT, você pode exibir ou ocultar informações sobre participantes opcionais no cabeçalho dos eventos de calendário. Para configurar MhtSaveOptions para o tratamento de arquivos MHT, você precisa entender como o MhtFormatOptions.RenderCalendarEvent e MhtFormatOptions.WriteHeader os parâmetros funcionam na personalização da saída de acordo com suas necessidades, particularmente ao gerenciar a exibição de participantes opcionais.

  • MhtFormatOptions.RenderCalendarEvent: Este parâmetro controla se os detalhes dos eventos de calendário são renderizados no arquivo MHT. Ao definir esta opção, você garante que informações abrangentes do evento, incluindo detalhes dos participantes, sejam incluídas na saída. Isso é essencial para fornecer documentação completa dos eventos de calendário.

  • MhtFormatOptions.WriteHeader: Este parâmetro determina se os cabeçalhos contendo metadados como assunto, data e informações dos participantes (incluindo participantes opcionais, quando configurados) são gravados no arquivo MHT. Habilitar esta opção garante que informações contextualizadas acompanhem sua mensagem, aumentando a compreensão.

O exemplo de código abaixo demonstra como usar o recurso exibir participantes opcionais ao salvar um msg no formato mhtml:

MhtSaveOptions options = new MhtSaveOptions()
{
    MhtFormatOptions = MhtFormatOptions.RenderCalendarEvent | MhtFormatOptions.WriteHeader
};

MailMessage eml = MailMessage.Load(fileName);
eml.Save(fileName + ".mhtml", options);

Se precisar excluir informações sobre participantes opcionais do arquivo MHT, basta limpar o modelo de formato para OptionalAttendees antes de salvar:

//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);

Salvar Todos os Cabeçalhos em MHTML

O MhtSaveOptions.SaveAllHeaders propriedade do MhtSaveOptions classe define se há necessidade de salvar todos os cabeçalhos no mhtml de saída ou não. O trecho de código a seguir mostra como salvar todos os cabeçalhos de um arquivo mhtml:

var eml = MailMessage.Load("message.eml");
var sopt = SaveOptions.DefaultMhtml;
sopt.SaveAllHeaders = true;
eml.Save("message.mhtml", sopt);

Processamento de Mensagens Devolvidas

É muito comum que uma mensagem enviada a um destinatário possa ser devolvida por qualquer motivo, como um endereço de destinatário inválido. A API Aspose.Email tem a capacidade de processar tal mensagem para verificar se é um e‑mail devolvido ou uma mensagem de e‑mail normal. O Verificar Mensagens Rejeitadas método do MailMessage classe retorna um resultado válido se a mensagem de email for devolvida. Este artigo mostra o uso do BounceResult classe que fornece a capacidade de verificar se uma mensagem é um email devolvido (bounced). Também fornece informações detalhadas sobre os destinatários, ação tomada e o motivo da notificação. O trecho de código a seguir mostra como processar mensagens devolvidas.

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();

Analisador de Spam Bayesiano

Aspose.Email fornece filtragem de e‑mail usando um analisador de spam Bayesiano. Ele fornece o SpamAnalyzer classe para este propósito. Este artigo mostra como treinar o filtro para distinguir entre spam e emails regulares com base no banco de palavras.

O fluxo de trabalho consiste em duas etapas. Primeiro, o filtro é treinado com um conjunto de mensagens regulares ("ham") e mensagens de spam com o TrainFilter método, e o banco de palavras resultante é armazenado com SaveDatabase. Então o banco de dados é carregado em um SpamAnalyzer e o Teste método retorna a probabilidade (de 0 a 1) de uma mensagem ser 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})");
}

Obter Preâmbulo e Epílogo de Mensagens EML

Uma mensagem de email pode conter algumas informações ocultas como texto simples antes do corpo da mensagem (ou seja, preâmbulo) ou após o corpo (ou seja, epílogo). Normalmente são informações adicionais ou contexto para o destinatário antes ou depois de ler o conteúdo principal do email. Você pode obter essas informações usando MailMessage.Preamble ou/e MailMessage.Epilogue propriedades, respectivamente.

Ambas as propriedades são do tipo string e são leitura/escrita, portanto podem ser usados também para definir o preâmbulo e o epílogo de uma mensagem que você compõe. O trecho de código a seguir mostra como obter os textos de preâmbulo e 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);

Rastreamento de Email usando MDN e Recibos de Leitura

A API Aspose.Email oferece suporte ao rastreamento de email usando Message Disposition Notification (MDN). Isto é alcançado solicitando os recibos de leitura e criando as informações necessárias. O MailMessage.ReadReceiptTo propriedade obtém ou define os endereços de confirmação de leitura. É um MailAddressCollection, portanto um único endereço pode ser atribuído a ele como string, enquanto vários endereços podem ser adicionados à coleção. O CreateReadReceipt método constrói uma confirmação de leitura para uma mensagem recebida, e o MapiMessage.ReadReceiptRequested propriedade obtém ou define se uma confirmação de leitura é solicitada para uma mensagem do Outlook. O trecho de código a seguir mostra como rastrear e‑mail usando a API 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);