Odczytywanie i konwertowanie plików Outlook
Praca z plikami OST
Aspose.Email dla .NET udostępnia API do odczytu plików OST Microsoft Outlook. Możesz wczytać plik OST z dysku lub strumienia do instancji Aspose.Email.Outlook.Pst.PersonalStorage klasa umożliwiająca dostęp do jej zawartości, takiej jak foldery, podfoldery i wiadomości. Microsoft Outlook tworzy plik PST do przechowywania wiadomości e‑mail przy użyciu serwerów POP3 lub IMAP. Natomiast tworzy plik OST, gdy serwer poczty to Microsoft Exchange. Pliki OST obsługują także większe rozmiary niż pliki PST.
Odczyt plików OST
Proces odczytu pliku OST przy użyciu Aspose.Email jest dokładnie taki sam jak odczyt pliku PST. Ten sam kod może odczytać zarówno pliki PST, jak i OST: wystarczy podać prawidłową nazwę pliku do PersonalStorage.FromFile() metoda. Poniższy fragment kodu pokazuje, jak odczytać pliki OST.
Konwertuj OST na PST
Wypróbuj!
Konwertuj e‑maile i archiwa wiadomości online za darmo Aplikacja konwersji Aspose.Email.
Aby wykonać inne operacje na plikach OST, zapoznaj się z następującymi stronami:
- Odczyt plików PST i pobieranie informacji
- Uzyskaj informacje o wiadomościach z pliku Outlook PST
- Wyodrębnij wiadomości z pliku Outlook PST i zapisz je na dysku lub w strumieniu w formacie MSG
- Uzyskaj informacje o kontaktach z pliku Outlook PST i zapisz je na dysku w formacie MSG
Konwertuj PST na OST
Konwersja z PST do OST nie jest obsługiwana przez Aspose.Email, ponieważ plik OST jest zawsze tworzony przez Outlook podczas dodawania konta i synchronizacji z serwerem poczty. Różnica między plikami PST i OST polega na tym, że PST jest dostępny wyłącznie lokalnie, natomiast zawartość OST jest również dostępna na serwerze e‑mail. Dlatego nie ma potrzeby konwertowania PST do OST do użytku lokalnego. Można jednak zaimportować plik PST do istniejącego konta za pomocą kreatora Import/Eksport w Outlooku.
OLM to specyficzny format pliku używany przez Microsoft Outlook do przechowywania danych lokalnych, takich jak e-maile, załączniki, notatki, dane kalendarza, kontakty, zadania, historia i inne. Pliki OLM są kompatybilne wyłącznie z Outlookiem dla Mac i nie mogą być otwierane ani dostępne w Outlooku dla Windows, który zamiast tego używa formatu pliku PST.
Praca z plikami OLM
Otwieranie plików OLM
Pliki w formacie OLM można otworzyć na dwa sposoby:
- używając konstruktora
- używając statycznej metody FromFile
Istnieją różnice w zachowaniu między tymi metodami. Zobacz sekcję poniżej.
Użycie konstruktora
Aby otworzyć plik, wywołaj konstruktor klasy OlmStorage klasy i przekaż pełną nazwę pliku lub strumień jako argument:
var fileName = "MyStorage.olm";
var olm = new OlmStorage(fileName);
Użycie metody statycznej FromFile
Aby otworzyć plik, użyj metody statycznej FromFile i przekaż pełną nazwę pliku lub strumień jako argument:
var fileName = "MyStorage.olm";
var olm = OlmStorage.FromFile(fileName);
Pobieranie folderów
Aby uzyskać dostęp do struktury katalogów pliku OLM, utwórz instancję OlmStorage klasy, używając jej konstruktora i przekazując ścieżkę do pliku. Po otwarciu pliku uzyskaj dostęp do jego struktury katalogów przy użyciu FolderHierarchy właściwość. Ta właściwość zwraca listę OlmFolder obiekty, z których każdy reprezentuje katalog w pliku OLM. Aby dalej badać strukturę katalogów, uzyskaj dostęp do SubFolders właściwość każdego obiektu, która zwraca listę jego podkatalogów. Korzystając z tych właściwości, możesz nawigować po całej hierarchii katalogów pliku OLM i uzyskać dostęp do wszystkich katalogów i podkatalogów, które zawiera.
Poniższy przykład wyświetla listę wszystkich folderów w kolejności hierarchicznej:
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+"-");
}
}
Podczas używania FromFile metodę, aby otworzyć plik OLM, a FolderHierarchy właściwość nie będzie inicjalizowana domyślnie i zwróci null. W takim przypadku wywołaj metodę GetFolders explicite, aby ją zainicjować FolderHierarchy właściwość i pobrać listę katalogów w pliku OLM:
using (var olm = OlmStorage.FromFile(fileName))
{
var folders = olm.GetFolders();
}
Można również uzyskać dowolny folder po nazwie:
- Wywołaj GetFolder metoda.
- Przekaż nazwę folderu jako pierwszy argument oraz wartość określającą, czy ignorować wielkość liter przy wyszukiwaniu folderu, jako drugi parametr.
using (var olm = OlmStorage.FromFile(fileName))
{
// get inbox folder by name
OlmFolder folder = olm.GetFolder("Inbox", true);
}
Lista e-maili
OlmFolder klasa, która reprezentuje folder, posiada następujące metody do uzyskania listy e‑maili:
- EnumerateMessages implementuje iterację e-maili w folderze. W tym przypadku każda iteracja zwraca OlmMessageInfo obiekt, który dostarcza krótkie informacje o e-mailu.
- EnumerateMapiMessages, również implementuje iterację e-maili w folderze, ale w tym przypadku każda iteracja zwraca MapiMessage obiekt, który reprezentuje sam e-mail ze wszystkimi właściwościami.
Użycie metody EnumerateMessages
using (var olm = OlmStorage.FromFile(fileName))
{
var folder = olm.GetFolder("Inbox", true);
foreach (var messageInfo in folder.EnumerateMessages())
{
Console.WriteLine(messageInfo.Subject);
}
}
Użycie metody 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");
}
}
Inne przydatne właściwości
Pozostałe przydatne właściwości klasy OlmFolder to: HasMessages i MessageCount właściwości, które zwracają obecność wiadomości w folderze oraz ich liczbę.
using (var olm = OlmStorage.FromFile(fileName))
{
var folder = olm.GetFolder("Inbox", true);
if (folder.HasMessages)
{
Console.WriteLine($"Message count: {folder.MessageCount}");
}
}
Uzyskaj lub ustaw datę modyfikacji wiadomości
Data modyfikacji reprezentuje datę i godzinę, kiedy wiadomość OLM została ostatnio zmodyfikowana. Możesz użyć OlmMessageInfo.ModifiedDate właściwość umożliwiająca pobranie lub aktualizację wartości daty modyfikacji wiadomości OLM.
Oto przykład, który demonstruje użycie właściwości:
foreach (OlmMessageInfo messageInfo in inboxFolder.EnumerateMessages())
{
DateTime modifiedDate = messageInfo.ModifiedDate;
}
Wyodrębnianie e‑maili i elementów
OlmStorage klasa ma ExtractMapiMessage metoda, która umożliwia wyodrębnianie e‑maili. Metoda otrzymuje OlmMessageInfo obiekt.
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);
}
}
}
Używanie API Traversal
Możesz wyodrębnić wszystkie elementy z pliku Outlook OLM w maksymalnym zakresie, bez wyrzucania wyjątków, nawet jeśli niektóre dane oryginalnego pliku są uszkodzone. Aby to zrobić, użyj OlmStorage(TraversalExceptionsCallback callback) konstruktor oraz Load(string fileName) metoda zamiast metody FromFile. Konstruktor pozwala zdefiniować metodę callback.
using (var olm = new OlmStorage((exception, id) => { /* Exception handling code. */ }))
Metoda callback udostępnia wyjątki ładowania i przeglądania.
Ten Load metoda zwraca ’true’, jeśli plik został pomyślnie załadowany i dalsze przeglądanie jest możliwe. Jeśli plik jest uszkodzony i przeglądanie nie jest możliwe, zwracane jest ‘false’.
if (olm.Load(fileName))
Poniższy fragment kodu oraz kroki pokazują, jak używać tego API:
- Utwórz nową instancję OlmStorage klasę, przekazując callback obsługi wyjątków, aby radzić sobie z ewentualnymi wyjątkami napotkanymi podczas procesu.
- Załaduj plik OLM, wywołując Load metodę na instancji OlmStorage.
- Jeśli plik OLM zostanie pomyślnie załadowany, uzyskaj hierarchię folderów, wywołując GetFolders metoda na instancji OlmStorage. Zwraca ona listę obiektów OlmFolder.
- Wywołaj metodę ExtractItems, przekazując instancję OlmStorage oraz listę obiektów OlmFolder.
- W metodzie ExtractItems iteruj po każdym folderze na liście folderów.
- Jeśli folder zawiera wiadomości (e‑maile), wypisz nazwę folderu w konsoli używając Console.WriteLine(folder).
- Iteruj wiadomości w bieżącym folderze, wywołując metodę EnumerateMessages na instancji OlmStorage i przekazując jako argument bieżący folder.
- Wypisz temat każdej wiadomości w konsoli używając Console.WriteLine(msg.Subject).
- Jeśli folder ma podfoldery, wywołaj ponownie metodę ExtractItems rekurencyjnie, przekazując instancję OlmStorage oraz podfoldery bieżącego folderu.
using (var olm = new OlmStorage((exception, id) => { /* Exception handling code. */ }))
{
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);
}
}
}
Wyodrębniaj wiadomości po identyfikatorach
Czasami konieczne jest wyodrębnienie wybranych wiadomości po identyfikatorach. Na przykład, Twoja aplikacja przechowuje identyfikatory w bazie danych i wyodrębnia wiadomość na żądanie. To efektywny sposób, aby uniknąć przeszukiwania całego magazynu przy każdym odnajdywaniu konkretnej wiadomości do wyodrębnienia. Ta funkcja jest dostępna dla magazynów OLM. EntryId właściwość OlmMessageInfo klasa pobiera identyfikator wpisu wiadomości. Przeciążona ExtractMapiMessage(string id) metoda OlmStorage klasa pobiera wiadomość z OLM.
Poniższy kod pokazuje, jak wyodrębnić wiadomości z OLM po identyfikatorach.
Kod wykonuje następujące kroki:
- Inicjalizuje pętlę foreach, aby iterować przez listę OlmMessageInfo obiektów. Pętla używa EnumerateMessages metodę obiektu olmFolder, aby pobrać listę wszystkich wiadomości w aktualnie iterowanym folderze.
- Pętla wyodrębnia odpowiadający obiekt MapiMessage z magazynu, wywołując ExtractMapiMessage(string id) metoda OlmStorage klasa, przekazująca EntryId bieżącej wiadomości jako parametr.
Pobrany obiekt MapiMessage może być używany do dostępu i manipulacji zawartością wiadomości. Pętla kontynuuje działanie, aż wszystkie wiadomości w folderze zostaną przetworzone.
foreach (OlmMessageInfo msgInfo in olmFolder.EnumerateMessages())
{
MapiMessage msg = storage.ExtractMapiMessage(msgInfo.EntryId);
}
Pobieranie ścieżki folderu
Możesz także uzyskać ścieżkę folderów w pliku OLM. Aspose.Email udostępnia OlmFolder.Path właściwość zwracająca ścieżkę folderu. Poniższy fragment kodu demonstruje użycie OlmFolder.Path właściwość do pobierania ścieżek folderów w pliku 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)
{
// print the current folder path
Console.WriteLine(folder.Path);
if (folder.SubFolders.Count > 0)
{
PrintPath(storage, folder.SubFolders);
}
}
}
Policz elementy w folderze
Możesz także policzyć liczbę elementów w folderze. Aspose.Email udostępnia OlmFolder.MessageCount właściwość zwracająca liczbę elementów w folderze. Poniższy fragment kodu demonstruje użycie OlmFolder.MessageCount właściwość do uzyskania liczby elementów w folderach pliku OLM.
var storage = new OlmStorage("SampleOLM.olm");
PrintMessageCount(storage.FolderHierarchy);
public static void PrintMessageCount(List<OlmFolder> folders)
{
foreach (OlmFolder folder in folders)
{
Console.WriteLine("Message Count [" + folder.Name + "]: " + folder.MessageCount);
}
}
Uzyskaj łączną liczbę elementów w OlmStorage
OlmStorage klasa posiada również GetTotalItemsCount() metoda zwracająca całkowitą liczbę elementów wiadomości znajdujących się w magazynie OLM.
using (var olm = new OlmStorage("storage.olm"))
{
var count = olm.GetTotalItemsCount();
}
Pobieranie kolorów kategorii Outlook
Aby pracować z kolorami kategorii lub kategoriami elementów Outlook przechowywanymi w plikach OLM, Aspose.Email oferuje następujące rozwiązania:
- OlmItemCategory klasa – reprezentuje kategorie elementów Outlook dostępne po nazwie i powiązanych kolorach, wyrażonych w formacie szesnastkowym.
- GetCategories() metoda OlmStorage klasa – pobiera listę kategorii.
Poniższy przykład kodu demonstruje, jak pobrać wszystkie użyte kategorie z magazynu OML:
using (var olm = OlmStorage.FromFile("storage.olm"))
{
var categories = olm.GetCategories();
foreach (var category in categories)
{
Console.WriteLine($"Category name: {category.Name}");
//Color is represented as a hexadecimal value: #rrggbb
Console.WriteLine($"Category color: {category.Color}");
}
}
Poniższy przykład kodu pokazuje, jak uzyskać kolor kategorii wiadomości:
foreach (var msg in olm.EnumerateMessages(folder))
{
if (msg.Categories != null)
{
foreach (var msgCategory in msg.Categories)
{
Console.WriteLine($"Category name: {msgCategory}");
var categoryColor = cat.First(c => c.Name.Equals(msgCategory, StringComparison.OrdinalIgnoreCase)).Color;
Console.WriteLine($"Category color: {categoryColor}");
}
}
}
Konwertuj OLM do PST
OLM jest formatem pliku bazy danych używanym przez Microsoft Outlook dla systemów Mac. Pliki OLM przechowują wiadomości e‑mail, dane kalendarza, dane kontaktów i ustawienia aplikacji. Plik OLM nie jest obsługiwany przez Outlook dla Windows. Dlatego nie można otworzyć pliku Outlook dla Mac (OLM) w Outlook dla Windows. Jeśli chcesz przenieść swoją skrzynkę pocztową z Outlook dla Mac do Outlook dla Windows, konieczna jest konwersja pliku OLM Outlook dla Mac do formatu pliku PST Outlook.
Kroki kodu
Aby skonwertować plik OLM do PST, postępuj zgodnie z poniższymi krokami:
- Utwórz instancję OlmStorage klasa do otwierania źródłowego OLM.
- Otwórz źródłowy plik OLM.
- Utwórz nowy plik PST przy użyciu Utwórz metoda.
- Utwórz metodę GetContainerClass, aby mapować klasę wiadomości na klasę folderu.
- Utwórz metodę AddToPst, która rekurencyjnie odczytuje każdy folder i jego wiadomości z OLM przy użyciu metody EnumerateMapiMessages i dodaje je do PST w tej samej kolejności, używając metod AddSubFolder i AddMessage.
Przykład kodu
Poniższy przykład kodu pokazuje, jak skonwertować OLM do PST.
Metoda Main:
// create an instance of OlmStorage class to open source OLM
using (var olm = new OlmStorage("my.olm"))
// create a new PST file
using (var pst = PersonalStorage.Create("my.pst", FileFormatVersion.Unicode))
{
// recursively reads each folder and its messages
// and adds them to the PST in the same order
foreach (var olmFolder in olm.FolderHierarchy)
{
AddToPst(pst.RootFolder, olmFolder);
}
}
Implementacja metody GetContainerClass:
public string GetContainerClass(string messageClass)
{
if (messageClass.StartsWith("IPM.Contact") || messageClass.StartsWith("IPM.DistList"))
{
return "IPF.Contact";
}
if (messageClass.StartsWith("IPM.StickyNote"))
{
return "IPF.StickyNote";
}
if (messageClass.StartsWith("IPM.Activity"))
{
return "IPF.Journal";
}
if (messageClass.StartsWith("IPM.Task"))
{
return "IPF.Task";
}
if (messageClass.StartsWith("IPM.Appointment") || messageClass.StartsWith("IPM.Schedule.meeting"))
{
return "IPF.Appointment";
}
return "IPF.Note";
}
Implementacja metody AddToPst:
public void AddToPst(FolderInfo pstFolder, OlmFolder olmFolder)
{
FolderInfo pstSubFolder = pstFolder.GetSubFolder(olmFolder.Name);
foreach (var msg in olmFolder.EnumerateMapiMessages())
{
if (pstSubFolder == null)
{
pstSubFolder = pstFolder.AddSubFolder(olmFolder.Name, GetContainerClass(msg.MessageClass));
}
pstSubFolder.AddMessage(msg);
}
if (pstSubFolder == null)
{
pstSubFolder = pstFolder.AddSubFolder(olmFolder.Name);
}
foreach (var olmSubFolder in olmFolder.SubFolders)
{
AddToPst(pstSubFolder, olmSubFolder);
}
}