Membaca dan Mengonversi File Outlook

Bekerja dengan File OST

Aspose.Email untuk .NET menyediakan API untuk membaca file OST Microsoft Outlook. Anda dapat memuat file OST dari disk atau stream ke dalam sebuah instance dari Aspose.Email.Outlook.Pst.PersonalStorage kelas untuk mengakses isinya, seperti folder, subfolder, dan pesan. Microsoft Outlook membuat file PST untuk menyimpan email ketika menggunakan server mail POP3 atau IMAP. Sebaliknya, ia membuat file OST ketika Microsoft Exchange menjadi server mail. File OST juga mendukung ukuran file yang lebih besar dibandingkan file PST.

Baca File OST

Proses membaca file OST dengan Aspose.Email persis sama dengan membaca file PST. Kode yang sama dapat membaca file PST dan OST: cukup berikan nama file yang tepat ke PersonalStorage.FromFile() metode. Cuplikan kode berikut menunjukkan cara membaca file OST.

Konversi OST ke PST

Aspose.Email memungkinkan mengonversi file OST ke PST dengan satu baris kode. Demikian pula, file OST dapat dibuat dari file PST menggunakan baris kode yang sama dengan FileFormat enumerator. Saat ini, API mendukung konversi format OST ke PST kecuali versi 2013/2016/2019/2021 dan versi mendatang. Potongan kode berikut menunjukkan cara Mengonversi OST ke PST.

Untuk melakukan operasi lain dengan file OST, silakan merujuk ke halaman berikut:

Konversi PST ke OST

Konversi dari PST ke OST tidak didukung oleh Aspose.Email karena OST selalu dibuat oleh Outlook saat menambahkan akun dan menyinkronkan dengan server mail. Perbedaan antara file PST dan OST adalah PST hanya tersedia secara lokal. Konten OST juga tersedia di server email. Jadi tidak perlu mengonversi PST ke OST untuk penggunaan lokal. Namun Anda dapat mengimpor PST ke akun yang ada menggunakan wizard Impor/Ekspor di Outlook.

OLM adalah format file khusus yang digunakan oleh Microsoft Outlook untuk menyimpan data lokal seperti email, lampiran, catatan, data kalender, kontak, tugas, riwayat, dan lainnya. File OLM hanya kompatibel dengan Outlook untuk Mac dan tidak dapat dibuka atau diakses oleh Outlook untuk Windows, yang menggunakan format file PST.

Bekerja dengan File OLM

Buka File OLM

File format OLM dapat dibuka dengan dua cara:

  • menggunakan konstruktor
  • menggunakan metode statik FromFile

Ada perbedaan perilaku antara metode-metode ini. Lihat bagian di bawah.

Menggunakan Konstruktor

Untuk membuka file, panggil konstruktor dari OlmStorage kelas dan berikan nama file lengkap atau stream sebagai argumen ke dalamnya:

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

Menggunakan Metode Statis FromFile

Untuk membuka file, gunakan metode statik FromFile dan berikan nama file lengkap atau stream sebagai argumen:

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

Mengambil Folder

Untuk mengakses struktur direktori file OLM, buat sebuah instance dari OlmStorage kelas menggunakan konstruktornya dan berikan jalur ke file. Setelah file terbuka, akses struktur direktorinya menggunakan FolderHierarchy properti. Properti ini mengembalikan daftar OlmFolder objek, masing-masing mewakili sebuah direktori dalam file OLM. Untuk mengeksplorasi struktur direktori lebih lanjut, akses SubFolders properti dari setiap objek, yang mengembalikan daftar subdirektorinya. Dengan menggunakan properti ini, Anda dapat menavigasi seluruh hierarki direktori file OLM dan mengakses semua direktori serta subdirektori yang ada.

Contoh di bawah menampilkan daftar semua folder dalam urutan hierarki:

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+"-");
    }
}

Saat menggunakan FromFile metode untuk membuka file OLM, FolderHierarchy properti tidak akan diinisialisasi secara default dan akan mengembalikan null. Dalam kasus ini, panggil metode GetFolders secara eksplisit untuk menginisialisasi FolderHierarchy properti dan mengambil daftar direktori dalam file OLM:

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

Selain itu, Anda dapat mengambil folder apa pun dengan nama:

  1. Panggil GetFolder metode.
  2. Berikan nama folder sebagai argumen pertama dan nilai, yang menunjukkan apakah mengabaikan sensitivitas huruf besar/kecil saat mencari folder, sebagai parameter kedua.
using (var olm = OlmStorage.FromFile(fileName))
{
    // get inbox folder by name
    OlmFolder folder = olm.GetFolder("Inbox", true);
}

Daftar Email

OlmFolder kelas, yang mewakili folder, memiliki metode berikut untuk mendapatkan daftar email:

  • EnumerateMessages mengimplementasikan iterasi email dalam sebuah folder. Dalam kasus ini, setiap iterasi mengembalikan OlmMessageInfo objek, yang memberikan info singkat tentang email.
  • EnumerateMapiMessages, juga mengimplementasikan iterasi email dalam sebuah folder, tetapi dalam kasus ini, setiap iterasi mengembalikan MapiMessage objek, yang mewakili email itu sendiri, dengan semua properti.

Menggunakan Metode EnumerateMessages

using (var olm = OlmStorage.FromFile(fileName))
{
    var folder = olm.GetFolder("Inbox", true);
    foreach (var messageInfo in folder.EnumerateMessages())
    {
        Console.WriteLine(messageInfo.Subject);
    }
}

Menggunakan Metode 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");
    }
}

Properti berguna lainnya

Properti berguna lainnya dari kelas OlmFolder adalah: HasMessages dan MessageCount properti, yang mengembalikan keberadaan pesan di folder dan jumlahnya.

using (var olm = OlmStorage.FromFile(fileName))
{
    var folder = olm.GetFolder("Inbox", true);

    if (folder.HasMessages)
    {
        Console.WriteLine($"Message count: {folder.MessageCount}");
    }
}

Dapatkan atau Atur Tanggal Modifikasi Pesan

Tanggal modifikasi mewakili tanggal dan waktu ketika pesan OLM terakhir dimodifikasi. Anda dapat menggunakan the OlmMessageInfo.ModifiedDate properti untuk mengambil atau memperbarui nilai tanggal modifikasi dari pesan OLM.

Berikut contoh yang menunjukkan penggunaan properti:

foreach (OlmMessageInfo messageInfo in inboxFolder.EnumerateMessages())
{
   DateTime modifiedDate = messageInfo.ModifiedDate;
}

Ekstrak Email dan Item

OlmStorage kelas memiliki ExtractMapiMessage metode yang memungkinkan mengekstrak email. Metode ini menerima sebuah OlmMessageInfo objek.

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);
        }
    }
}

Menggunakan API Traversal

Anda dapat mengekstrak semua item dari file OLM Outlook sejauh mungkin, tanpa melempar pengecualian, bahkan jika sebagian data file asli rusak. Untuk melakukan ini, gunakan OlmStorage(TraversalExceptionsCallback callback) konstruktor dan Load(string fileName) metode alih-alih metode FromFile. Konstruktor memungkinkan mendefinisikan metode callback.

using (var olm = new OlmStorage((exception, id) => { /* Exception handling  code. */ }))

Metode callback membuat pengecualian saat pemuatan dan traversel tersedia.

The Load metode mengembalikan ’true’ jika file berhasil dimuat dan penelusuran lebih lanjut memungkinkan. Jika file rusak dan penelusuran tidak memungkinkan, ‘false’ dikembalikan.

if (olm.Load(fileName))

Potongan kode berikut dan langkah-langkahnya menunjukkan cara menggunakan API ini:

  1. Buat instance baru dari OlmStorage kelas, dengan melewatkan callback penanganan pengecualian untuk menangani setiap pengecualian yang muncul selama proses.
  2. Muat file OLM dengan memanggil Load metode dari instance OlmStorage.
  3. Jika file OLM berhasil dimuat, dapatkan hierarki folder dengan memanggil GetFolders metode pada instance OlmStorage. Ini mengembalikan daftar objek OlmFolder.
  4. Panggil metode ExtractItems, dengan melewatkan instance OlmStorage dan daftar objek OlmFolder.
  5. Dalam metode ExtractItems, iterasi setiap folder dalam daftar folder.
  6. Jika folder berisi pesan (email), cetak nama folder ke konsol menggunakan Console.WriteLine(folder).
  7. Iterasi pesan-pesan dalam folder saat ini dengan memanggil metode EnumerateMessages pada instance OlmStorage, dengan melewatkan folder saat ini sebagai argumen.
  8. Cetak subjek setiap pesan ke konsol menggunakan Console.WriteLine(msg.Subject).
  9. Jika folder memiliki subfolder, panggil metode ExtractItems secara rekursif lagi, dengan melewatkan instance OlmStorage dan subfolder dari folder saat ini.
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);
        }
    }
}

Ekstrak Pesan berdasarkan Identifier

Kadang diperlukan untuk mengekstrak pesan terpilih berdasarkan identifier. Misalnya, aplikasi Anda menyimpan identifier dalam basis data dan mengekstrak pesan sesuai permintaan. Ini adalah cara efisien untuk menghindari penelusuran seluruh penyimpanan setiap kali menemukan pesan spesifik untuk diekstrak. Fitur ini tersedia untuk penyimpanan OLM. EntryId properti dari OlmMessageInfo kelas mendapatkan identifier entri pesan. Overload ExtractMapiMessage(string id) metode dari OlmStorage kelas mengambil pesan dari OLM.

Kode di bawah menunjukkan cara mengekstrak pesan dari OLM berdasarkan identifier.

Kode melakukan langkah-langkah berikut:

  1. Memulai loop foreach untuk iterasi melalui daftar OlmMessageInfo objek. Loop menggunakan EnumerateMessages metode dari objek olmFolder untuk mengambil daftar semua pesan dalam folder saat ini yang sedang diiterasi.
  2. Loop mengekstrak objek MapiMessage yang sesuai dari penyimpanan dengan memanggil ExtractMapiMessage(string id) metode dari OlmStorage kelas, dengan memasukkan EntryId dari pesan saat ini sebagai parameter.

Objek MapiMessage yang diambil dapat digunakan untuk mengakses dan memanipulasi isi pesan. Loop berlanjut sampai semua pesan di folder telah diproses.

  foreach (OlmMessageInfo msgInfo in olmFolder.EnumerateMessages())
  {
      MapiMessage msg = storage.ExtractMapiMessage(msgInfo.EntryId);
  }

Pengambilan Path Folder

Anda juga dapat mendapatkan jalur folder dari folder dalam file OML. Aspose.Email menyediakan OlmFolder.Path properti yang mengembalikan jalur folder. Cuplikan kode berikut menunjukkan penggunaan OlmFolder.Path properti untuk mendapatkan jalur folder dalam file OML.

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);
        }
    }
}

Hitung Item di Folder

Anda juga dapat menghitung jumlah item dalam folder. Aspose.Email menyediakan OlmFolder.MessageCount properti yang mengembalikan jumlah item dalam folder. Cuplikan kode berikut menunjukkan penggunaan OlmFolder.MessageCount properti untuk mendapatkan jumlah item dalam folder file OML.

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);
    }
}

Dapatkan Jumlah Total Item OlmStorage

OlmStorage kelas juga memiliki GetTotalItemsCount() metode yang mengembalikan total jumlah item pesan yang terdapat dalam penyimpanan OLM.

  using (var olm = new OlmStorage("storage.olm"))
  {
     var count = olm.GetTotalItemsCount();
  }

Pengambilan Warna Kategori Outlook

Untuk bekerja dengan warna kategori atau kategori item Outlook yang disimpan dalam file OLM, Aspose.Email menawarkan solusi berikut:

  • OlmItemCategory kelas - mewakili kategori item Outlook yang tersedia dengan nama mereka dan warna yang terkait, yang diwakili dalam format heksadesimal.
  • GetCategories() metode dari OlmStorage kelas - mengambil daftar kategori.

Contoh kode berikut menunjukkan cara mendapatkan semua kategori yang digunakan dari penyimpanan 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}");
    }
}

Contoh kode di bawah menunjukkan cara mendapatkan warna kategori pesan:

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}");
        }
    }
}

Konversi OLM ke PST

OLM adalah format file basis data yang digunakan oleh Microsoft Outlook untuk sistem Mac. File OLM menyimpan pesan email, data kalender, data kontak, dan pengaturan aplikasi. File OLM tidak didukung oleh Outlook untuk Windows. Oleh karena itu, tidak mungkin membuka file Outlook untuk Mac (OLM) di Outlook untuk Windows. Jika Anda ingin memigrasikan kotak surat Anda dari Outlook untuk Mac ke Outlook untuk Windows, Anda perlu mengonversi file OLM Outlook untuk Mac ke format file PST Outlook.

Langkah Kode

Untuk mengonversi file OLM ke PST ikuti langkah-langkah berikut:

  1. Buat sebuah instance dari OlmStorage kelas untuk membuka OLM sumber.
  2. Buka file OLM sumber.
  3. Buat file PST baru menggunakan Buat metode.
  4. Buat metode GetContainerClass untuk memetakan kelas pesan ke kelas folder.
  5. Buat metode AddToPst yang secara rekursif membaca setiap folder dan pesan-pesannya dari OLM menggunakan metode EnumerateMapiMessages dan menambahkannya ke PST dengan urutan yang sama menggunakan metode AddSubFolder dan AddMessage.

Contoh kode

Contoh kode berikut menunjukkan cara mengonversi OLM ke PST.

Metode 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);
    }
} 

Implementasi metode 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";
}

Implementasi metode 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);
    }
}