Управление сообщениями Outlook

Сохранить письма в формате HTML

Aspose.Email позволяет сохранять ресурсы электронных писем с относительными путями при экспорте сообщений в формат HTML. Эта функция обеспечивает большую гибкость в связывании ресурсов в результирующем HTML‑файле, упрощая обмен и отображение сохранённых писем на разных системах. Чтобы сохранять ресурсы с относительными путями, используйте HtmlSaveOptions.UseRelativePathToResources свойства. Значение свойства по умолчанию — false (ресурсы сохраняются с абсолютными путями). При установке в true ресурсы сохраняются с относительными путями.

HTML‑файлы с относительными путями более портативны и могут корректно отображаться независимо от структуры файлов в среде хостинга. Вы можете выбирать между абсолютными и относительными путями в зависимости от требований. Вы можете задавать пользовательские пути к ресурсам с помощью ResourceHtmlRendering событие.

Следующий пример кода демонстрирует, как сохранять электронное письмо с относительным путём к ресурсам по умолчанию:

var msg = MapiMessage.Load(sourceFileName);

var htmlSaveOptions = new HtmlSaveOptions
{
    ResourceRenderingMode = ResourceRenderingMode.SaveToFile,
    UseRelativePathToResources = true
};

msg.Save(Path.Combine("target_files"), htmlSaveOptions);

В этом случае ресурсы будут сохраняться в папке [html file name]_files, в том же пути, что и файл .html, и HTML будет ссылаться на ресурсы через относительные пути.

Пример кода ниже демонстрирует, как сохранять с абсолютным путём к ресурсам:

var msg = MapiMessage.Load(sourceFileName);

var htmlSaveOptions = new HtmlSaveOptions
{
    ResourceRenderingMode = ResourceRenderingMode.SaveToFile,
    UseRelativePathToResources = false
};

msg.Save(Path.Combine("target_files"), htmlSaveOptions);

Как и в первом случае, ресурсы по умолчанию сохраняются в папке [html file name]_files, но HTML будет ссылаться на ресурсы с помощью абсолютных путей.

Используя ResourceHtmlRendering событие, вы можете задавать пользовательские относительные или абсолютные пути для ресурсов. При настройке путей с помощью ResourceHtmlRendering обработчик события, и поскольку UseRelativePathToResources установлено в true, вам следует задать относительный путь к PathToResourceFile Свойство для обеспечения правильных ссылок.

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

var msg = MapiMessage.Load(sourceFileName);

var htmlSaveOptions = new HtmlSaveOptions
{
    ResourceRenderingMode = ResourceRenderingMode.SaveToFile,
    UseRelativePathToResources = true
};

htmlSaveOptions.ResourceHtmlRendering += (o, args) =>
{
    if (o is AttachmentBase attachment)
    {
	    // Since UseRelativePathToResources = true, you should assign a relative path to the PathToResourceFile property.
        args.PathToResourceFile = $@"images\{attachment.ContentType.Name}";
    }
};

msg.Save(Path.Combine(targetPath, "A Day in the Park.html"), htmlSaveOptions);

Конвертировать MSG в MIME сообщения

API Aspose.Email предоставляет возможность конвертировать файлы MSG в MIME‑сообщения с помощью ToMailMessage метод.

MapiMessage msg = new MapiMessage("sender@test.com","recipient1@test.com; recipient2@test.com","Test Subject","This is a body of message.");
var options = new MailConversionOptions();
options.ConvertAsTnef = true;
MailMessage mail = msg.ToMailMessage(options);

Установить тайм‑ауты для конвертации и загрузки сообщений

Следующие возможности позволят задать тайм‑аут в миллисекундах для процесса конвертации и загрузки:

  • MailConversionOptions.Timeout property — ограничивает время в миллисекундах при конвертации сообщения.

  • MailConversionOptions.TimeoutReached - Выбрасывается, если время ожидания истекло при конвертации в MailMessage.

  • MsgLoadOptions.Timeout - Ограничивает время в миллисекундах при конвертации сообщения.

  • MsgLoadOptions.TimeoutReached - Выбрасывается, если время ожидания истекло при конвертации в MailMessage.

Пример кода ниже покажет, как установить тайм‑аут при конвертации сообщения:

var options = new MailConversionOptions();
// Set the timeout to 5 seconds
options.Timeout = 5000;

options.TimeoutReached += (object sender, EventArgs args) =>
{
    string subj = (sender as MailMessage).Subject;
	 // Set a flag indicating the timeout was reached
    isTimedOut = true;
};

var mailMessage = mapiMessage.ToMailMessage(options);

Конверсия MSG в EML с сохранением тела RTF

Конверсия файла MSG в EML с сохранением тела RTF может быть выполнена двумя способами:

Оба свойства получают или задают значение, указывающее, сохранять ли тело в формате rtf в MailMessage.

Следующие фрагменты кода показывают, как конвертировать файл MSG в EML и сохранить тело в формате RTF:

var loadOptions = new MsgLoadOptions
{
    PreserveRtfContent = true
};

var eml = MailMessage.Load("my.msg", loadOptions);
var conversionOptions = new MailConversionOptions
{
    PreserveRtfContent = true
};

var msg = MapiMessage.Load("my.msg");

var eml = msg.ToMailMessage(conversionOptions);

Работа с файлами шаблонов Outlook (.OFT)

Шаблоны Outlook очень полезны, когда нужно отправлять одинаковое электронное сообщение снова и снова. Вместо того чтобы каждый раз готовить сообщение с нуля, сначала подготовьте его в Outlook и сохраните как шаблон Outlook (OFT). Затем, когда понадобится отправить сообщение, вы можете создать его из шаблона, экономя время на ввод того же текста в тело или строку темы, настройку форматирования и т.д. Aspose.Email MailMessage класс можно использовать для загрузки и чтения файла шаблона Outlook (OFT). Как только шаблон Outlook загружен в экземпляр MailMessage класс, вы можете обновить отправителя, получателя, тело, тему и другие свойства. После обновления свойств:

  • Отправить письмо, используя SmtpClient класс или
  • Сохраняем сообщение как MSG и выполняем дальнейшие обновления/проверку с помощью Microsoft Outlook.

В приведённых ниже кодовых примерах мы:

  1. Загрузить шаблон, используя MailMessage класс.
  2. Обновить некоторые свойства.
  3. Сохранить сообщение в формате MSG.

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

// The path to the File directory.
string dataDir = RunExamples.GetDataDir_Outlook();

// Load the Outlook template (OFT) file in MailMessage's instance
MailMessage message = MailMessage.Load(dataDir + "sample.oft", new MsgLoadOptions());

// Set the sender and recipients information
string senderDisplayName = "John";
string senderEmailAddress = "john@abc.com";
string recipientDisplayName = "William";
string recipientEmailAddress = "william@xzy.com";

message.Sender = new MailAddress(senderEmailAddress, senderDisplayName);
message.To.Add(new MailAddress(recipientEmailAddress, recipientDisplayName));
message.HtmlBody = message.HtmlBody.Replace("DisplayName", "<b>" + recipientDisplayName + "</b>");

// Set the name, location and time in email body
string meetingLocation = "<u>" + "Hall 1, Convention Center, New York, USA" + "</u>";
string meetingTime = "<u>" + "Monday, June 28, 2010" + "</u>";
message.HtmlBody = message.HtmlBody.Replace("MeetingPlace", meetingLocation);
message.HtmlBody = message.HtmlBody.Replace("MeetingTime", meetingTime);

// Save the message in MSG format and open in Office Outlook
MapiMessage msg = MapiMessage.FromMailMessage(message);
msg.SetMessageFlags(MapiMessageFlags.MSGFLAG_UNSENT);
msg.Save(dataDir + "ReadAndWritingOutlookTemplateFile_out.msg");

Сохранить файлы MSG как шаблоны

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

using (MapiMessage mapi = new MapiMessage("test@from.to", "test@to.to", "template subject", "Template body"))
{
    string oftMapiFileName = "mapiToOft.oft";
    mapi.SaveAsTemplate(oftMapiFileName);
}            

Определить тип MAPI‑сообщения (OFT или MSG)

При загрузке объекта MapiMessage из файла может потребоваться определить, является ли загруженное сообщение файлом шаблона или обычным письмом. С помощью IsTemplate свойство MapiMessage класс, позволяющий точно определить, является ли электронное письмо шаблоном. Эта возможность может быть полезна при работе и обработке различных типов файлов электронной почты в приложениях и системах.

Приведённый ниже пример кода демонстрирует, как определить, является ли MapiMessage форматом OFT или MSG:

var msg = MapiMessage.Load("message.msg");
var isOft = msg.IsTemplate; // returns false

var oft = MapiMessage.Load("message.oft");
var isOftTemplate = oft.IsTemplate; // returns true

Сохранить MapiMessage или MailMessage в формате OFT

Этот SaveOptions класс позволяет задавать дополнительные параметры при сохранении MailMessage или MapiMessage в определённый формат.

Следующий пример кода демонстрирует, как сохранить сообщение в формате OFT:

// Save the MailMessage to OFT format
using (var eml = MailMessage.Load("message.eml"))
{
    eml.Save("message.oft", SaveOptions.DefaultOft);
	
	// or alternative way #2
	var saveOptions = new MsgSaveOptions(MailMessageSaveType.OutlookTemplateFormat);
    eml.Save("message.oft", saveOptions);
	
	// or alternative  way #3
	saveOptions = SaveOptions.CreateSaveOptions(MailMessageSaveType.OutlookTemplateFormat);
    eml.Save("message.oft", saveOptions);

}

// Save the MapiMessage to OFT format
using (var msg = MapiMessage.Load("message.msg"))
{
    msg.Save("message.oft", SaveOptions.DefaultOft);
	
	// or alternative way #2
	var saveOptions = new MsgSaveOptions(MailMessageSaveType.OutlookTemplateFormat);
    msg.Save("message.oft", saveOptions);
	
	// or alternative  way #3
	saveOptions = SaveOptions.CreateSaveOptions(MailMessageSaveType.OutlookTemplateFormat);
    msg.Save("message.oft", saveOptions);
}

Управление цифрово подписанными сообщениями

Aspose.Email реализует полный алгоритм объекта электронной почты S/MIME. Это даёт API полные возможности сохранять цифровые подписи при конвертации сообщений между форматами.

Сохранить подпись при конвертации EML в MSG

Aspose.Email сохраняет цифровую подпись при конвертации из EML в MSG. Следующий фрагмент кода показывает, как выполнить конвертацию из EML в MSG.

// The path to the File directory.
string dataDir = RunExamples.GetDataDir_Outlook();

// Load mail message
MailMessage message = MailMessage.Load(dataDir + "Message.eml", new EmlLoadOptions());
// Save as MSG
message.Save(dataDir + "ConvertEMLToMSG_out.msg", SaveOptions.DefaultMsgUnicode);

Конвертировать сообщения S/MIME из MSG в EML

Aspose.Email сохраняет цифровую подпись при конвертации из MSG в EML, как показано в следующем фрагменте кода.

// The path to the File directory.
string dataDir = RunExamples.GetDataDir_Outlook();

// Load the MSG file
MailMessage msg = MailMessage.Load(dataDir + "message.msg", new MsgLoadOptions());

// Save as EML
msg.Save(dataDir + "ConvertMIMEMessagesFromMSGToEML_out.eml", SaveOptions.DefaultEml);

Проверка подписей защищённых писем

Следующие возможности доступны для проверки подписи объектов MapiMessage.

Пример кода ниже показывает, как внедрить эти функции в ваш проект:

Проверьте подпись сообщения без указания сертификата:

var msg = MapiMessage.Load(fileName);
var result = new SecureEmailManager().CheckSignature(msg);

Проверьте подпись зашифрованного сообщения, указав сертификат для дешифрования и хранилище, содержащие сертификаты, использованные для проверки:

var certFileName = "cert.pfx";
var cert = new X509Certificate2(certFileName, "pass");
var msg = MapiMessage.Load(fileName);

var store = new X509Store();
store.Open(OpenFlags.ReadWrite);
store.Add(cert);
store.Close();

var result = new SecureEmailManager().CheckSignature(msg, cert, store);

Удалить подписи из MapiMessage

Для лучшей совместимости, MapiMessage.RemoveSignature метод и MapiMessage.IsSigned свойства используются для удаления цифровой подписи из сообщения.

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

var msg = MapiMessage.Load(fileName);

if (msg.IsSigned)
{
    var unsignedMsg = msg.RemoveSignature();
}

Расшифровать MapiMessage с помощью сертификатов

Если у вас есть зашифрованные MAPI‑сообщения и необходимо расшифровать их с помощью закрытого ключа, хранящегося в сертификате, следующие возможности Aspose.Email могут быть полезны:

  • MapiMessage.IsEncrypted - Возвращает значение, указывающее, зашифровано ли сообщение.
  • MapiMessage.Decrypt() - Расшифровывает это сообщение (метод ищет в хранилищах My текущего пользователя и компьютера соответствующий сертификат и закрытый ключ).
  • MapiMessage.Decrypt(X509Certificate2 certificate) - Расшифровывает это сообщение с помощью сертификата.

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

var privateCert = new X509Certificate2(privateCertFile, "password");
var msg = MapiMessage.Load("encrypted.msg");

if (msg.IsEncrypted)
{
    var decryptedMsg = msg.Decrypt(privateCert);
}

Установить цветовые категории для файлов MSG

Цветовая категория помечает электронное письмо как важное или определённого типа. Microsoft Outlook позволяет пользователям назначать цветовые категории для различения писем. Чтобы работать с цветовой категорией, используйте FollowUpManager. Он содержит функции, такие как AddCategory, RemoveCategory, ClearCategories и GetCategories.

  • AddCategory принимает MapiMessage и строку цветовой категории, например, "Purple Category" или "Red Category", в качестве аргументов.
  • RemoveCategory принимает MapiMessage и строка цветовой категории, которую нужно удалить из сообщения.
  • ClearCategories используется для удаления всех цветовых категорий из сообщения.
  • GetCategories используется для получения всех цветовых категорий из конкретного сообщения.

Следующий пример выполняет указанные ниже задачи:

  1. Добавить цветовую категорию.
  2. Добавить еще одну цветовую категорию.
  3. Получить список всех категорий.
  4. Удалить все категории.
// The path to the File directory.
string dataDir = RunExamples.GetDataDir_Outlook();

MapiMessage msg = MapiMessage.FromFile(dataDir + "message1.msg");

// Add Two category
FollowUpManager.AddCategory(msg, "Purple Category");
FollowUpManager.AddCategory(msg, "Red Category");

// Retrieve the list of available categories
IList<string> categories = FollowUpManager.GetCategories(msg);

// Remove the specified category and then Clear all categories
FollowUpManager.RemoveCategory(msg, "Red Category");
FollowUpManager.ClearCategories(msg);

Получить информацию о последующей обработки в файлах MSG

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

Получить информацию о прочтении и подтверждении доставки

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

MapiMessage msg = MapiMessage.FromFile(dataDir + @"TestMessage.msg");
foreach (MapiRecipient recipient in msg.Recipients)
{
    Console.WriteLine(string.Format("Recipient: {0}", recipient.DisplayName));

    // Get the PR_RECIPIENT_TRACKSTATUS_TIME_DELIVERY property
    Console.WriteLine(string.Format("Delivery time: {0}", recipient.Properties[MapiPropertyTag.PR_RECIPIENT_TRACKSTATUS_TIME_DELIVERY].GetDateTime()));

    // Get the PR_RECIPIENT_TRACKSTATUS_TIME_READ property
    Console.WriteLine(string.Format("Read time: {0}", recipient.Properties[MapiPropertyTag.PR_RECIPIENT_TRACKSTATUS_TIME_READ].GetDateTime()));

    Console.WriteLine();
}

Создать сообщения‑пересылки и ответы

API Aspose.Email предоставляет возможность создавать и форматировать сообщения‑пересылки и ответы. Создание пересылаемых и ответных сообщений и Aspose.Email API предоставляет возможность создавать и форматировать сообщения‑пересылки и‑ответы. ReplyMessageBuilder ForwardMessageBuilder классы API используются для создания ответных и пересылаемых сообщений соответственно. Сообщение‑ответ или‑пересылка может быть создано с использованием любого из режимов

  • OriginalMessageAdditionMode
  • перечисление. Это перечисление имеет следующие значения:
  • OriginalMessageAdditionMode.Textpart — оригинальное сообщение включается в виде текста в тело сообщения‑ответа

Создать сообщения‑ответы

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

// The path to the File directory.
string dataDir = RunExamples.GetDataDir_Outlook();

MapiMessage originalMsg = MapiMessage.FromFile(dataDir + "message1.msg");
ReplyMessageBuilder builder = new ReplyMessageBuilder();

// Set ReplyMessageBuilder Properties
builder.ReplyAll = true;
builder.AdditionMode = OriginalMessageAdditionMode.Textpart;
builder.ResponseText = "<p><b>Dear Friend,</b></p> I want to do is introduce my co-author and co-teacher. <p><a href=\"www.google.com\">This is a first link</a></p><p><a href=\"www.google.com\">This is a second link</a></p>";
            
MapiMessage replyMsg = builder.BuildResponse(originalMsg);
replyMsg.Save(dataDir+ "reply_out.msg");

Создать сообщения‑пересылки

Ниже показан фрагмент кода, демонстрирующий, как создать сообщение‑ответ.

// The path to the File directory.
string dataDir = RunExamples.GetDataDir_Outlook();

MapiMessage originalMsg = MapiMessage.FromFile(dataDir +"message1.msg");
ForwardMessageBuilder builder = new ForwardMessageBuilder();
builder.AdditionMode = OriginalMessageAdditionMode.Textpart;
MapiMessage forwardMsg = builder.BuildResponse(originalMsg);
forwardMsg.Save(dataDir + "forward_out.msg");