Розширене керування електронними повідомленнями

Відстеження прогресу конвертації документа

Aspose.Email надає можливість відстежувати прогрес конвертації документа. Для цього API забезпечує SaveOptions.CustomProgressHandler. який представляє метод, що обробляє події прогресу. Типи подій прогресу представляються ProgressEventType перелічення. The ProgressEventType перелічення має такі члени.

  • MimeStructureCreated: Ця подія інформує, що MIME-структуру створено.
  • MimePartSaved: Ця подія інформує, що збереження однієї MIME-частини завершено.
  • SavedToStream: Ця подія інформує, що всі MIME-частини збережено у потік.

Наступний приклад коду демонструє використання SaveOptions.CustomProgressHandler і ProgressEventType перелічення, що відстежує прогрес конвертації документа.

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

Нижче наведений код користувацького класу, який використовується у наведеному вище прикладі коду.

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

Рендеринг гіперпосилань з власними стилями

Іноді може знадобитися виводити гіперпосилання з певним стилем відповідно до вимог вашого застосунку. Для цього Aspose.Email надає HyperlinkRenderingCallback. Ви можете передати HyperlinkRenderingCallback як параметр MailMessage.GetHtmlBodyText.

Наступний фрагмент коду показує, як використовувати HyperlinkRenderingCallback для виведення гіперпосилань з використанням вашого власного стилю.

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

Відображення інформації у довільному порядку у файлах MHTML

Aspose.Email надає MhtSaveOptions.RenderingHeaders властивість, яка повертає список заголовків для рендерингу. Ви можете додати заголовки, використовуючи MhtTemplateName клас. Порядок, у якому додаються заголовки, визначає порядок відображення інформації.

Наступне зображення порівнює три виходи, створені прикладом коду.

todo:image_alt_text

Нижче наведений фрагмент коду демонструє використання MhtSaveOptions.RenderingHeaders властивість для встановлення порядку, у якому інформація відображається у вихідних файлах MHTML.

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

Відображення необов’язкових учасників у MHT‑файлах

Працюючи з форматом MHT, ви можете відображати або приховувати інформацію про необов’язкових учасників у заголовку календарних подій. Щоб налаштувати MhtSaveOptions для роботи з файлами MHT вам необхідно розуміти, як MhtFormatOptions.RenderCalendarEvent і MhtFormatOptions.WriteHeader параметри працюють над налаштуванням вихідних даних відповідно до ваших потреб, особливо при керуванні відображенням необов’язкових учасників.

  • MhtFormatOptions.RenderCalendarEvent: Цей параметр контролює, чи будуть деталі календарних подій відображені у MHT‑файлі. Встановивши цю опцію, ви забезпечуєте включення повної інформації про події, включаючи дані про учасників, у вихідний файл. Це важливо для надання повної документації календарних подій.

  • MhtFormatOptions.WriteHeader: Цей параметр визначає, чи будуть заголовки, що містять метадані, такі як тема, дата та інформація про учасників (включаючи необов’язкових учасників, якщо налаштовано), записані у MHT‑файл. Увімкнення цієї опції забезпечує, що контекстно релевантна інформація супроводжує ваше повідомлення, підвищуючи зрозумілість.

Наведений нижче приклад коду демонструє використання функції display optional attendees при збереженні msg у форматі mhtml:

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

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

Якщо потрібно виключити інформацію про необов’язкових учасників з MHT-файлу, просто очистіть шаблон формату для OptionalAttendees перед збереженням:

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

Зберегти всі заголовки у MHTML

The MhtSaveOptions.SaveAllHeaders властивість MhtSaveOptions клас визначає, чи потрібно зберігати всі заголовки у вихідному mhtml чи ні. Наступний фрагмент коду показує, як зберегти всі заголовки mhtml-файлу:

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

Обробка повернутих повідомлень

Дуже часто повідомлення, надіслане одержувачу, може повернутися (bounce) з будь‑якої причини, наприклад через недійсну адресу отримувача. API Aspose.Email має можливість обробляти таке повідомлення для перевірки, чи є воно повернутим електронним листом чи звичайним листом. The CheckBounced метод MailMessage клас повертає коректний результат, якщо електронне повідомлення є повернутим листом. У цій статті показано використання BounceResult клас, який забезпечує можливість перевірки, чи є повідомлення повернутим (bounced) листом. Він також надає детальну інформацію про отримувачів, вжиті дії та причину сповіщення. Наступний фрагмент коду показує, як обробляти повернені повідомлення.

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

Байєсовий аналізатор спаму

Aspose.Email забезпечує фільтрацію електронної пошти за допомогою баєсового аналізатора спаму. Він забезпечує SpamAnalyzer клас для цієї мети. У цій статті показано, як навчити фільтр розрізняти спам і звичайні листи на основі бази даних слів.

Робочий процес складається з двох кроків. Спершу фільтр навчається на наборі звичайних ("ham") та спам‑повідомлень з TrainFilter метод, а отримана база слів зберігається у SaveDatabase. Потім база даних завантажується у SpamAnalyzer і Тест метод повертає ймовірність (від 0 до 1) того, що повідомлення є спамом.

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

Отримання преамбули та епіграфа з EML‑повідомлень

Електронне повідомлення може містити приховану інформацію у вигляді простого тексту перед тілом повідомлення (тобто преамбула) або після тіла (тобто епіграф). Це зазвичай додаткова інформація або контекст для отримувача перед або після ознайомлення з основним вмістом листа. Ви можете отримати цю інформацію за допомогою MailMessage.Preamble або/і MailMessage.Epilogue властивості відповідно.

Обидві властивості мають тип string і є читабельними/змінними, тому їх можна також використовувати для встановлення прологу та епілогу повідомлення, яке ви створюєте. Наведений код показує, як отримати тексти прологу та епілогу:

var eml = MailMessage.Load("message.eml");

// Gets a preamble text
Console.WriteLine("Preamble: " + eml.Preamble);

// Gets an epilogue text
Console.WriteLine("Epilogue: " + eml.Epilogue);

Відстеження електронної пошти за допомогою MDN та підтверджень прочитання

Aspose.Email API забезпечує підтримку відстеження електронних листів за допомогою Message Disposition Notification (MDN). Це досягається запитом підтверджень прочитання та створенням необхідної інформації. The MailMessage.ReadReceiptTo властивість отримує або встановлює адреси підтвердження прочитання. Це MailAddressCollection, тому єдина адреса може бути присвоєна як рядок, тоді як кілька адрес можуть бути додані до колекції. CreateReadReceipt метод створює підтвердження прочитання для отриманого повідомлення, і MapiMessage.ReadReceiptRequested властивість отримує або встановлює, чи запитується підтвердження прочитання для повідомлення Outlook. Наведений код показує, як відстежувати електронну пошту за допомогою Aspose.Email API.

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