Чтение файла OLM Outlook для Mac и получение информации о папках и подпапках
OLM - это специфический формат файла, используемый Microsoft Outlook для хранения локальных данных, таких как электронные письма, вложения, заметки, данные календаря, контакты, задачи, история и многое другое. Файлы OLM совместимы только с Outlook для Mac и не могут быть открыты или доступны с помощью Outlook для Windows, который вместо этого использует формат файла PST.
Открытие файлов формата OLM
Файлы формата OLM можно открыть двумя способами:
- с использованием конструктора
- с использованием статического метода FromFile
Существуют различия в поведении между этими методами. См. раздел ниже.
Открытие файлов с помощью конструктора
Чтобы открыть файл, вызовите конструктор класса OlmStorage и передайте полное имя файла или поток в качестве аргумента:
var fileName = "MyStorage.olm";
var olm = new OlmStorage(fileName);
Открытие файлов с использованием статического метода FromFile
Чтобы открыть файл, используйте статический метод FromFile и передайте полное имя файла или поток в качестве аргумента:
var fileName = "MyStorage.olm";
var olm = OlmStorage.FromFile(fileName);
Получение папок
Чтобы получить доступ к структуре директорий файла OLM, создайте экземпляр класса OlmStorage с использованием его конструктора и передайте путь к файлу. После открытия файла получите доступ к его структуре директорий, используя свойство FolderHierarchy. Это свойство возвращает список объектов OlmFolder, каждый из которых представляет директорию в файле OLM. Чтобы дальше исследовать структуру каталогов, получите доступ к свойству SubFolders каждого объекта, которое возвращает список его подпапок. Используя эти свойства, вы можете перемещаться по всей иерархии каталогов файла OLM и получать доступ ко всем директориям и подпапкам, которые он содержит.
Пример ниже отображает список всех папок в иерархическом порядке:
using (var olm = new OlmStorage(fileName))
{
PrintAllFolders(olm.FolderHierarchy, string.Empty);
}
private void PrintAllFolders(List<OlmFolder> folderHierarchy, string indent)
{
foreach (var folder in folderHierarchy)
{
Console.WriteLine($"{indent}{folder.Name}");
PrintAllFolders(folder.SubFolders, indent+"-");
}
}
При использовании метода FromFile для открытия файла OLM свойство FolderHierarchy по умолчанию не будет инициализировано и вернет null. В этом случае вызовите метод GetFolders явно, чтобы инициализировать свойство FolderHierarchy и получить список директорий в файле OLM:
using (var olm = OlmStorage.FromFile(fileName))
{
var folders = olm.GetFolders();
}
Также можно получить любую папку по имени:
- Вызовите метод GetFolder.
- Передайте имя папки в качестве первого аргумента и значение, показывающее, следует ли игнорировать чувствительность к регистру при поиске папки, в качестве второго параметра.
using (var olm = OlmStorage.FromFile(fileName))
{
// получить папку «Входящие» по имени
OlmFolder folder = olm.GetFolder("Inbox", true);
}
Список писем
Класс OlmFolder, представляющий папку, имеет следующие методы для получения списка писем:
- EnumerateMessages реализует итерацию по письмам в папке. В этом случае каждая итерация возвращает объект OlmMessageInfo, который предоставляет краткую информацию о письме.
- EnumerateMapiMessages, также реализует итерацию по письмам в папке, но в этом случае каждая итерация возвращает объект MapiMessage, представляющий само письмо, со всеми его свойствами.
Использование метода EnumerateMessages
using (var olm = OlmStorage.FromFile(fileName))
{
var folder = olm.GetFolder("Inbox", true);
foreach (var messageInfo in folder.EnumerateMessages())
{
Console.WriteLine(messageInfo.Subject);
}
}
Использование метода EnumerateMapiMessages
using (var olm = OlmStorage.FromFile(fileName))
{
var folder = olm.GetFolder("Inbox", true);
foreach (var msg in folder.EnumerateMapiMessages())
{
// сохранить сообщение в формате MSG
msg.Save($"{msg.Subject}.msg");
}
}
Другие полезные свойства
Другие полезные свойства класса OlmFolder включают: HasMessages и MessageCount свойства, которые возвращают наличие сообщений в папке и их количество.
using (var olm = OlmStorage.FromFile(fileName))
{
var folder = olm.GetFolder("Inbox", true);
if (folder.HasMessages)
{
Console.WriteLine($"Количество сообщений: {folder.MessageCount}");
}
}
Получение или установка даты изменения сообщения
Дата изменения представляет собой дату и время последнего изменения сообщения OLM. Вы можете использовать свойство OlmMessageInfo.ModifiedDate для получения или обновления значения даты изменения сообщения OLM.
Вот пример, который демонстрирует использование этого свойства:
foreach (OlmMessageInfo messageInfo in inboxFolder.EnumerateMessages())
{
DateTime modifiedDate = messageInfo.ModifiedDate;
}
Извлечение писем
Класс OlmStorage имеет метод ExtractMapiMessage, который позволяет извлекать письма. Этот метод принимает объект OlmMessageInfo.
using (var olm = OlmStorage.FromFile(fileName))
{
var folder = olm.GetFolder("Inbox", true);
foreach (var messageInfo in folder.EnumerateMessages())
{
if (messageInfo.Date == DateTime.Today)
{
// Извлеките сегодняшние сообщения из «Входящих»
var msg = olm.ExtractMapiMessage(messageInfo);
}
}
}
Извлечение всех элементов из письма с использованием Traversal API
Вы можете извлечь все элементы из файла OLM Outlook, насколько это возможно, не вызывая исключений, даже если некоторые данные оригинального файла повреждены. Для этого используйте конструктор OlmStorage(TraversalExceptionsCallback callback) и метод Load(string fileName) вместо метода FromFile. Конструктор позволяет определить метод обратного вызова.
using (var olm = new OlmStorage((exception, id) => { /* Код обработки исключений. */ }))
Метод обратного вызова делает доступными исключения загрузки и обхода.
Метод Load возвращает ‘true’, если файл был успешно загружен и дальнейший обход возможен. Если файл поврежден и обход невозможен, возвращается ‘false’.
if (olm.Load(fileName))
Следующий код-фрагмент и шаги показывают, как использовать этот API:
- Создайте новый экземпляр класса OlmStorage, передав метод обратного вызова для обработки исключений, возникающих в процессе.
- Загрузите файл OLM, вызвав метод Load экземпляра OlmStorage.
- Если файл OLM успешно загружен, получите иерархию папок, вызвав метод GetFolders на экземпляре OlmStorage. Это возвращает список объектов OlmFolder.
- Вызовите метод ExtractItems, передав экземпляр OlmStorage и список объектов OlmFolder.
- В методе ExtractItems выполните итерацию по каждой папке в списке папок.
- Если папка содержит сообщения (письма), выведите имя папки в консоль с помощью Console.WriteLine(folder).
- Выполните итерацию по сообщениям текущей папки, вызвав метод EnumerateMessages на экземпляре OlmStorage, передав текущую папку в качестве аргумента.
- Выведите тему каждого сообщения в консоль с помощью Console.WriteLine(msg.Subject).
- Если папка имеет подпапки, рекурсивно снова вызовите метод ExtractItems, передав экземпляр OlmStorage и подпапки текущей папки.
using (var olm = new OlmStorage((exception, id) => { /* Код обработки исключений. */ }))
{
if (olm.Load(fileName))
{
var folderHierarchy = olm.GetFolders();
ExtractItems(olm, folderHierarchy);
}
}
private static void ExtractItems(OlmStorage olm, List<OlmFolder> folders)
{
foreach (var folder in folders)
{
if (folder.HasMessages)
{
Console.WriteLine(folder);
foreach (var msg in olm.EnumerateMessages(folder))
{
Console.WriteLine(msg.Subject);
}
}
if (folder.SubFolders.Count > 0)
{
ExtractItems(olm, folder.SubFolders);
}
}
}
Извлечение сообщений из OLM по идентификаторам
Процесс извлечения писем стал проще благодаря возможности извлекать выбранные сообщения OLM по идентификаторам. Это срочно необходимо для приложений, хранящих идентификаторы в базе данных. Извлечение сообщений по требованию - эффективный способ избежать обхода всего хранилища каждый раз, чтобы найти конкретное сообщение для извлечения. Свойство EntryId класса OlmMessageInfo получает идентификатор записи сообщения. Переопределенный метод ExtractMapiMessage(string id) класса OlmStorage получает сообщение из OLM. Следующий код-фрагмент демонстрирует использование этих функций:
foreach (OlmMessageInfo msgInfo in olmFolder.EnumerateMessages())
{
MapiMessage msg = storage.ExtractMapiMessage(msgInfo.EntryId);
}
Получение пути к папке
Вы также можете получить путь к папке папок в файле OLM. Aspose.Email предоставляет свойство OlmFolder.Path, которое возвращает путь к папке. Следующий код-фрагмент демонстрирует использование свойства OlmFolder.Path для получения путей к папкам в файле OLM.
var storage = new OlmStorage("SampleOLM.olm");
PrintPath(storage, storage.FolderHierarchy);
public static void PrintPath(OlmStorage storage, List<OlmFolder> folders)
{
foreach (OlmFolder folder in folders)
{
// вывести текущий путь к папке
Console.WriteLine(folder.Path);
if (folder.SubFolders.Count > 0)
{
PrintPath(storage, folder.SubFolders);
}
}
}
Подсчет количества элементов в папке
Вы также можете подсчитать количество элементов в папке. Aspose.Email предоставляет свойство OlmFolder.MessageCount, которое возвращает количество элементов в папке. Следующий код-фрагмент демонстрирует использование свойства OlmFolder.MessageCount для получения количества элементов в папках файла OLM.
var storage = new OlmStorage("SampleOLM.olm");
PrintMessageCount(storage.FolderHierarchy);
public static void PrintMessageCount(List<OlmFolder> folders)
{
foreach (OlmFolder folder in folders)
{
Console.WriteLine("Количество сообщений [" + folder.Name + "]: " + folder.MessageCount);
}
}
Получение общего количества элементов OlmStorage
Класс OlmStorage также имеет метод GetTotalItemsCount(), который возвращает общее количество элементов сообщений, содержащихся в хранилище OLM.
using (var olm = new OlmStorage("storage.olm"))
{
var count = olm.GetTotalItemsCount();
}
Извлечение сообщений из OLM по идентификаторам
Иногда необходимо извлекать выбранные сообщения по идентификаторам. Например, ваше приложение хранит идентификаторы в базе данных и извлекает сообщение по требованию. Это эффективный способ избежать обхода всего хранилища каждый раз, чтобы найти конкретное сообщение для извлечения. Эта функция доступна для хранилищ OLM.
Код ниже показывает, как извлекать сообщения из OLM по идентификаторам.
Код выполняет следующие шаги:
- Инициирует цикл foreach для итерации по списку объектов OlmMessageInfo. Цикл использует метод EnumerateMessages объекта olmFolder для получения списка всех сообщений в текущей папке, по которой выполняется итерация.
- Цикл извлекает соответствующий объект MapiMessage из хранилища, вызывая метод ExtractMapiMessage(string id) класса OlmStorage, передавая идентификатор записи текущего сообщения в качестве параметра.
Полученный объект MapiMessage может быть использован для доступа и манипуляции содержимым сообщения. Цикл продолжается до обработки всех сообщений в папке.
foreach (OlmMessageInfo msgInfo in olmFolder.EnumerateMessages())
{
MapiMessage msg = storage.ExtractMapiMessage(msgInfo.EntryId);
}
Получение цветов категорий Outlook
Для работы с цветами категорий или категориями элементов Outlook, хранящимися в файлах OLM, Aspose.Email предлагает следующие решения:
- Класс OlmItemCategory - представляет категории элементов Outlook, которые доступны по их имени и ассоциированным цветам, представленным в шестнадцатеричном формате.
- Метод GetCategories() класса OlmStorage - извлекает список категорий.
Следующий пример кода демонстрирует, как получить все используемые категории из хранилища OLM:
using (var olm = OlmStorage.FromFile("storage.olm"))
{
var categories = olm.GetCategories();
foreach (var category in categories)
{
Console.WriteLine($"Имя категории: {category.Name}");
// Цвет представлен в виде шестнадцатеричного значения: #rrggbb
Console.WriteLine($"Цвет категории: {category.Color}");
}
}
Пример кода ниже показывает, как получить цвет категории сообщения:
foreach (var msg in olm.EnumerateMessages(folder))
{
if (msg.Categories != null)
{
foreach (var msgCategory in msg.Categories)
{
Console.WriteLine($"Имя категории: {msgCategory}");
var categoryColor = cat.First(c => c.Name.Equals(msgCategory, StringComparison.OrdinalIgnoreCase)).Color;
Console.WriteLine($"Цвет категории: {categoryColor}");
}
}
}