Управление сообщениями 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 может быть выполнена двумя способами:
-
используя MsgLoadOptions.PreserveRtfContent свойство MsgLoadOptions class;
-
используя MailConversionOptions.PreserveRtfContent свойство MailConversionOptions class;
Оба свойства получают или задают значение, указывающее, сохранять ли тело в формате 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.
В приведённых ниже кодовых примерах мы:
- Загрузить шаблон, используя MailMessage класс.
- Обновить некоторые свойства.
- Сохранить сообщение в формате 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.
- SecureEmailManager класс для проверки подписи защищённых писем.
- SmimeResult класс для хранения результатов проверки.
- SecureEmailManager.CheckSignature(MapiMessage msg) метод.
- SecureEmailManager.CheckSignature(MapiMessage msg, X509Certificate2 certificateForDecrypt) метод.
- SecureEmailManager.CheckSignature(MapiMessage msg, X509Certificate2 certificateForDecrypt, X509Store store) метод.
Пример кода ниже показывает, как внедрить эти функции в ваш проект:
Проверьте подпись сообщения без указания сертификата:
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 используется для получения всех цветовых категорий из конкретного сообщения.
Следующий пример выполняет указанные ниже задачи:
- Добавить цветовую категорию.
- Добавить еще одну цветовую категорию.
- Получить список всех категорий.
- Удалить все категории.
// 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");