Утилитные функции - MailMessage

Шифрование и расшифровка сообщений

Aspose.Email предоставляет возможность шифровать и расшифровывать электронные сообщения с использованием X509Certificates. В этой статье показано, как существующее или новое сообщение может быть загружено и зашифровано с использованием MailMessage. Методы Encrypt() и Decrypt() возвращают объект MailMessage для примененных эффектов, и с ними нужно обращаться с осторожностью при шифровании/расшифровке сообщений. Шифрование и расшифровка сообщений включает в себя следующие шаги:

  1. Создайте новое сообщение или загрузите существующее
  2. Загрузите сертификат шифрования с использованием объекта X509Certificate
  3. Зашифруйте сообщение с использованием сертификата
  4. Отправьте сообщение или сохраните его
  5. Расшифруйте сообщение по мере необходимости

Следующий фрагмент кода показывает, как шифровать и расшифровывать сообщения.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// The path to the File directory.
string dataDir = RunExamples.GetDataDir_Email();
string publicCertFile = dataDir + "MartinCertificate.cer";
string privateCertFile = dataDir + "MartinCertificate.pfx";
X509Certificate2 publicCert = new X509Certificate2(publicCertFile);
X509Certificate2 privateCert = new X509Certificate2(privateCertFile, "anothertestaccount");
// Create a message
MailMessage msg = new MailMessage("atneostthaecrcount@gmail.com", "atneostthaecrcount@gmail.com", "Test subject", "Test Body");
// Encrypt the message
MailMessage eMsg = msg.Encrypt(publicCert);
if (eMsg.IsEncrypted == true)
Console.WriteLine("Its encrypted");
else
Console.WriteLine("Its NOT encrypted");
// Decrypt the message
MailMessage dMsg = eMsg.Decrypt(privateCert);
if (dMsg.IsEncrypted == true)
Console.WriteLine("Its encrypted");
else
Console.WriteLine("Its NOT encrypted");

Проверка сообщения на шифрование

Класс Aspose.Email MailMessage позволяет проверить, зашифровано сообщение или нет. Свойство IsEncrypted класса MailMessage позволяет проверить это, как показано в следующем примере кода.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
MailMessage mailMessageOrig = MailMessage.Load(Path.Combine(dataDir, "Message.msg"), new MsgLoadOptions());
X509Certificate2 publicCert = new X509Certificate2(publicCertFile);
X509Certificate2 privateCert = new X509Certificate2(privateCertFile, "anothertestaccount");
Console.WriteLine("Message is encrypted: {0}" , mailMessageOrig.IsEncrypted);
MailMessage mailMessage = mailMessageOrig.Encrypt(publicCert);
Console.WriteLine("Message is encrypted: {0}", mailMessage.IsEncrypted);
mailMessage = mailMessage.Decrypt(privateCert);
Console.WriteLine("Message is encrypted: {0}", mailMessage.IsEncrypted);

Электронные сообщения с TNEF-вложениями

Формат транспортной нейтральной инкапсуляции (TNEF) является проприетарным форматом вложений электронной почты, используемым Microsoft Outlook и Microsoft Exchange Server. API Aspose.Email позволяет читать электронные сообщения, которые имеют TNEF-вложения, и изменять содержимое вложения. Электронное сообщение затем может быть сохранено как обычное электронное письмо или в том же формате, сохраняя TNEF-вложения. Эта статья показывает различные примеры кода для работы с сообщениями, содержащими TNEF-вложения. Эта статья также показывает, как создавать TNEF EML файлы из Outlook MSG файлов.

Чтение сообщения с сохранением TNEF-вложений

Следующий фрагмент кода показывает, как читать сообщение, сохраняя TNEF-вложения.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// The path to the File directory.
string dataDir = RunExamples.GetDataDir_Email();
MsgLoadOptions options = new MsgLoadOptions();
options.PreserveTnefAttachments = true;
MailMessage eml = MailMessage.Load(dataDir + "EmbeddedImage1.msg", options);
foreach (Attachment attachment in eml.Attachments)
{
Console.WriteLine(attachment.Name);
}

Чтение сообщения без сохранения TNEF-вложений

Следующий фрагмент кода показывает, как читать сообщение без сохранения TNEF-вложений.

Обновление ресурсов в TNEF-вложении и сохранение формата TNEF

Следующий фрагмент кода показывает, как обновить ресурсы в TNEF-вложении и сохранить формат TNEF.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
public static void TestUpdateResources(string dataDir)
{
string fileName = dataDir + "tnefEML1.eml";
string imgFileName = dataDir + "Untitled.jpg";
string outFileName = dataDir + "UpdateTNEFAttachments_out.eml";
MailMessage originalMailMessage = MailMessage.Load(fileName);
UpdateResources(originalMailMessage, imgFileName);
EmlSaveOptions emlSo = new EmlSaveOptions(MailMessageSaveType.EmlFormat);
emlSo.FileCompatibilityMode = FileCompatibilityMode.PreserveTnefAttachments;
originalMailMessage.Save(outFileName, emlSo);
}
private static void UpdateResources(MailMessage msg, string imgFileName)
{
for (int i = 0; i < msg.Attachments.Count; i++)
{
if ((msg.Attachments[i].ContentType.MediaType == "image/png") || (msg.Attachments[i].ContentType.MediaType == "application/octet-stream" && Path.GetExtension(msg.Attachments[i].ContentType.Name) == ".jpg"))
{
msg.Attachments[i].ContentStream = new MemoryStream(File.ReadAllBytes(imgFileName));
}
else if ((msg.Attachments[i].ContentType.MediaType == "message/rfc822") || (msg.Attachments[i].ContentType.MediaType == "application/octet-stream" && Path.GetExtension(msg.Attachments[i].ContentType.Name) == ".msg"))
{
MemoryStream ms = new MemoryStream();
msg.Attachments[i].Save(ms);
ms.Position = 0;
MailMessage embeddedMessage = MailMessage.Load(ms);
UpdateResources(embeddedMessage, imgFileName);
MemoryStream msProcessedEmbedded = new MemoryStream();
embeddedMessage.Save(msProcessedEmbedded, SaveOptions.DefaultMsgUnicode);
msProcessedEmbedded.Position = 0;
msg.Attachments[i].ContentStream = msProcessedEmbedded;
}
}
foreach (LinkedResource att in msg.LinkedResources)
{
if (att.ContentType.MediaType == "image/png")
att.ContentStream = new MemoryStream(File.ReadAllBytes(imgFileName));
}
}

Добавление новых вложений в основное сообщение, содержащее TNEF

Следующий фрагмент кода показывает, как добавить новые вложения в основное сообщение, содержащее TNEF.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
string fileName = "MainMessage.eml";
string attachName = "s.png";
string outFileName = "test.eml";
MailMessage mailMessage = MailMessage.Load(fileName);
mailMessage.Attachments.Add(new Attachment(File.OpenRead(attachName), "s.png", "image/png"));
mailMessage.Save(outFileName, FileCompatibilityMode.PreserveTnefAttachments);

Создание TNEF EML из MSG

MSG-файлы Outlook иногда содержат информацию, такую как таблицы и текстовые стили, которые могут нарушаться при конвертации в EML. Создание TNEF-сообщений из таких MSG-файлов позволяет сохранить форматирование и даже отправить такие сообщения через почтовые клиенты, сохраняя форматирование. Свойство MailConversionOptions.ConvertAsTnef используется для достижения этого. Следующий фрагмент кода показывает, как создать TNEF EML из MSG.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
MapiMessage mapiMsg = MapiMessage.FromFile(dataDir + "Message.msg");
MailConversionOptions mco = new MailConversionOptions();
mco.ConvertAsTnef = true;
MailMessage message = mapiMsg.ToMailMessage(mco);

Для создания TNEF можно использовать следующий образец кода.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
MailMessageLoadOptions options = new MailMessageLoadOptions();
options.MessageFormat = MessageFormat.Msg;
// The PreserveTnefAttachments option with MessageFormat.Msg will create the TNEF eml.
options.FileCompatibilityMode = FileCompatibilityMode.PreserveTnefAttachments;
MailMessage eml = MailMessage.Load(emlFileName, options);

Определение, является ли сообщение TNEF

Следующий фрагмент кода показывает, как определить, является ли сообщение TNEF.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
MailMessage mail = MailMessage.Load(dataDir + "tnefEml1.eml");
bool isTnef = mail.OriginalIsTnef;
Console.WriteLine("Is input EML originally TNEF? {0}", isTnef.ToString());

Проверка, является ли вложение в формате TNEF

Свойство Attachment.IsTnef позволяет определить, является ли вложение сообщения вложением, оформленным в формате TNEF.

var eml = MailMessage.Load(fileName);

foreach (attachment in eml.Attachments)
{
    Console.WriteLine($"Является ли вложение TNEF?: {attachment.IsTnef}");
}

Обработка возвратных сообщений

Очень часто сообщение, отправленное получателю, может быть возвратным по любой причине, такой как неверный адрес получателя. API Aspose.Email имеет возможность обрабатывать такое сообщение для проверки, является ли оно возвратным письмом или обычным электронным сообщением. Метод CheckBounced класса MailMessage возвращает допустимый результат, если электронное сообщение является возвратным письмом. Эта статья показывает использование класса BounceResult, который предоставляет возможность проверки, является ли сообщение возвратным письмом. Она также предоставляет детальную информацию о получателях, действиях и причинах уведомления. Следующий фрагмент кода показывает, как обрабатывать возвратные сообщения.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
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. Эта статья показывает, как обучить фильтр различать спам и обычные электронные письма на основе базы слов.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
string hamFolder = RunExamples.GetDataDir_Email() + "/hamFolder";
string spamFolder = RunExamples.GetDataDir_Email() + "/Spam";
string testFolder = RunExamples.GetDataDir_Email();
string dataBaseFile = RunExamples.GetDataDir_Email() + "SpamFilterDatabase.txt";
TeachAndCreateDatabase(hamFolder, spamFolder, dataBaseFile);
string[] testFiles = Directory.GetFiles(testFolder, "*.eml");
SpamAnalyzer analyzer = new SpamAnalyzer(dataBaseFile);
foreach (string file in testFiles)
{
MailMessage msg = MailMessage.Load(file);
Console.WriteLine(msg.Subject);
double probability = analyzer.Test(msg);
PrintResult(probability);
}

Получение преамбулы и эпилога из сообщений EML

Электронное сообщение может содержать некоторую скрытую информацию в виде обычного текста перед телом сообщения (т.е. преамбула) или после тела (т.е. эпилог). Обычно это какая-то дополнительная информация или контекст для получателя до или после того, как они прочитают основное содержимое электронной почты. Вы можете получить эту информацию с помощью свойств MailMessage.Preamble или/и MailMessage.Epilogue соответственно.

Следующий фрагмент кода показывает, как получить тексты преамбулы и эпилога:

// Получает или задает текст преамбулы.
public string Preamble

// Получает или задает текст эпилога.
public string Epilogue