Чтение файлов OLM Microsoft Outlook в C# .NET

OLM — это формат файла, который Microsoft Outlook для Mac использует для хранения локальных данных. OLM содержит локальные данные, такие как электронные письма, вложения, заметки, данные календаря, контакты, задачи, историю и т. д. Файлы OLM используются Outlook для Mac. Outlook для Windows не может получить доступ к ним или открыть их. Версия Outlook для Windows поддерживает только формат файла PST для хранения данных. В этой статье мы рассмотрим как открыть и прочитать файлы формата OLM из приложений C#.

C# .NET API для чтения файлов OLM

Aspose.Email для .NET — это мощный API, который предоставляет множество функций для реализации приложений электронной почты. Кроме того, он позволяет читать файлы OLM и другие форматы хранения почты, такие как MBOX, PST/OST. Вы можете установить библиотеку через NuGet или скачать ее DLL.

PM> Install-Package Aspose.Email

Открытие файлов формата OLM

Aspose.Email API предоставляет два способа открытия файлов формата OLM:

Существует различие в поведении между этими методами. См. раздел ниже.

Открытие файла с помощью конструктора

Чтобы открыть файл, вы должны вызвать конструктор класса OlmStorage и передать полное имя файла или поток в качестве аргумента:

var fileName = "MyStorage.olm";
var olm = new OlmStorage(fileName);

Открытие файла с использованием статического метода FromFile

Чтобы открыть файл, вы должны использовать статический метод FromFile и передать полное имя файла или поток в качестве аргумента:

var fileName = "MyStorage.olm";
var olm = OlmStorage.FromFile(fileName);

Получение папок

После открытия файла с помощью конструктора, будет доступно свойство FolderHierarchy. Оно возвращает список каталогов, которые существуют в файле OLM. Каждый объект класса OlmFolder из списка имеет свойство 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, то по умолчанию свойство FolderHierarchy не будет инициализировано и вернет null. В этом случае необходимо явно вызвать метод GetFolders:

using (var olm = OlmStorage.FromFile(fileName))
{
var folders = olm.GetFolders();
}

Также можно получить любую папку по имени. Для этого вы должны:

  • вызвать метод GetFolder

  • передать имя папки в качестве первого аргумента и значение, указывающее, следует ли игнорировать регистронезависимость при поиске папки, в качестве второго параметра.

using (var olm = OlmStorage.FromFile(fileName))
{
// get inbox folder by name
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())
{
// save message in MSG format
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($"Message count: {folder.MessageCount}");
}
}

Извлечение электронных писем

Класс 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)
{
// Extracts today's messages form Inbox
var msg = olm.ExtractMapiMessage(messageInfo);
}
}
}

Заключение

В этой статье вы узнали, как читать файлы OLM в C#. Вы увидели способы получения списка папок и извлечения сообщений из файла OLM. Кроме того, вы можете узнать больше о Aspose.Email для .NET, воспользовавшись документацией. Также вы можете задать свои вопросы или запросы на нашем форуме.

См. также