Продвинутое управление электронными сообщениями
Отслеживание процесса конвертации документа
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 класс. Порядок, в котором добавляются заголовки, определяет порядок отображения информации.
Следующее изображение сравнивает три вывода, сгенерированные примерным кодом.

Следующий фрагмент кода демонстрирует использование 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 при сохранении сообщения в формате 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
Этот MhtSaveOptions.SaveAllHeaders свойство MhtSaveOptions класс определяет, необходимо ли сохранять все заголовки в результирующем mhtml или нет. Следующий фрагмент кода показывает, как сохранить все заголовки файла mhtml:
var eml = MailMessage.Load("message.eml");
var sopt = SaveOptions.DefaultMhtml;
sopt.SaveAllHeaders = true;
eml.Save("message.mhtml", sopt);
Обработка возвратных сообщений
Очень часто сообщение, отправленное получателю, может отскочить по любой причине, например из‑за недействительного адреса получателя. API Aspose.Email обладает возможностью обрабатывать такое сообщение для проверки, является ли оно возвращённым письмом или обычным электронным письмом. The Проверка возврата метод MailMessage класс возвращает действительный результат, если электронное сообщение является отскочившим письмом. Эта статья демонстрирует использование BounceResult класс, предоставляющий возможность проверять, является ли сообщение отскочившим письмом. Он также предоставляет подробную информацию о получателях, предпринятых действиях и причине уведомления. Следующий фрагмент кода показывает, как обрабатывать отскочившие сообщения.
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 и уведомлений о прочтении
API Aspose.Email поддерживает отслеживание писем с использованием 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);