Membaca File MSG

Membaca File MSG

mapi_message adalah titik masuk untuk memuat dan menganalisis file Outlook MSG. Satu Panggil ke: from_file() atau: from_stream() membaca penuh CFB wadah, mengekstrak semua MAPI properti, dan mengekspos mereka melalui metode aksesor diketik tidak ada instalasi Outlook diperlukan.


Pemuatan dari Jalur File

Penggunaan mapi_message::from_file() dengan a std::filesystem::path:

#include <filesystem>
#include <iostream>
#include "aspose/email/foss/msg/mapi_message.hpp"

int main()
{
    const auto message = aspose::email::foss::msg::mapi_message::from_file(
        std::filesystem::path("sample.msg"));

    std::cout << "Subject: " << message.subject() << '\n';
    std::cout << "From:    " << message.sender_name()
              << " <" << message.sender_email_address() << ">\n";
    std::cout << "Body:    " << message.body() << '\n';
}

Beban dari Aliran

Penggunaan mapi_message::from_stream() ketika data MSG tiba dari soket jaringan, dan Arsip, atau apa pun yang std::istream:

#include <fstream>
#include <iostream>
#include "aspose/email/foss/msg/mapi_message.hpp"

int main()
{
    std::ifstream input("sample.msg", std::ios::binary);
    const auto message = aspose::email::foss::msg::mapi_message::from_stream(input);

    std::cout << "Subject: " << message.subject() << '\n';
}

Selalu buka aliran dengan std::ios::binary. Streams mode teks menerjemahkan baris Endings pada Windows dan merusak CFB container.


Properti Pesan Akses

mapi_message mengungkapkan sifat pesan yang paling umum sebagai getter bernama:

#include <filesystem>
#include <iostream>
#include "aspose/email/foss/msg/mapi_message.hpp"

int main()
{
    const auto message = aspose::email::foss::msg::mapi_message::from_file(
        std::filesystem::path("sample.msg"));

    // Core properties
    std::cout << "Subject:          " << message.subject() << '\n';
    std::cout << "Sender name:      " << message.sender_name() << '\n';
    std::cout << "Sender email:     " << message.sender_email_address() << '\n';
    std::cout << "Internet msg-id:  " << message.internet_message_id() << '\n';
    std::cout << "Message class:    " << message.message_class() << '\n';

    // Body — check html_body() first; fall back to plain body()
    const auto& body = message.html_body().empty()
        ? message.body()
        : message.html_body();
    std::cout << "Body length: " << body.size() << " chars\n";
}

Penerima Iterate

message.recipients() mengembalikan a std::vector dari objek penerima dengan display_name, email_address, dan recipient_type:

#include <filesystem>
#include <iostream>
#include "aspose/email/foss/msg/mapi_message.hpp"

int main()
{
    const auto message = aspose::email::foss::msg::mapi_message::from_file(
        std::filesystem::path("sample.msg"));

    for (std::size_t i = 0; i < message.recipients().size(); ++i)
    {
        const auto& r = message.recipients()[i];
        std::cout << "[" << (i + 1) << "] "
                  << r.display_name << " <" << r.email_address << ">"
                  << "  type=" << r.recipient_type << '\n';
    }
}

Lampiran Iterate

message.attachments() mengembalikan a std::vector Setiap eksposor filename, mime_type, data, content_id, dan is_embedded_message():

#include <filesystem>
#include <fstream>
#include <iostream>
#include "aspose/email/foss/msg/mapi_message.hpp"

int main()
{
    const auto message = aspose::email::foss::msg::mapi_message::from_file(
        std::filesystem::path("sample.msg"));

    for (const auto& a : message.attachments())
    {
        std::cout << a.filename
                  << "  " << a.mime_type
                  << "  " << a.data.size() << " bytes"
                  << "  embedded=" << (a.is_embedded_message() ? "yes" : "no")
                  << '\n';

        if (!a.is_embedded_message())
        {
            std::ofstream out("extracted_" + a.filename, std::ios::binary);
            out.write(reinterpret_cast<const char*>(a.data.data()),
                      static_cast<std::streamsize>(a.data.size()));
        }
    }
}

Akses Pesan Tertanam

Kapan? is_embedded_message() adalah: true, lampiran berisi file MSG lainnya. Akses melalui: attachment.embedded_message:

#include <filesystem>
#include <iostream>
#include "aspose/email/foss/msg/mapi_message.hpp"

int main()
{
    const auto message = aspose::email::foss::msg::mapi_message::from_file(
        std::filesystem::path("sample.msg"));

    for (const auto& a : message.attachments())
    {
        if (a.is_embedded_message() && a.embedded_message != nullptr)
        {
            const auto& inner = *a.embedded_message;
            std::cout << "Embedded subject: " << inner.subject() << '\n';
            inner.save(std::filesystem::path("embedded.msg"));
        }
    }
}

Tips dan Praktik Terbaik

  • Selalu lewat. std::ios::binary ke std::ifstream saat memuat file MSG.
  • Periksa html_body() sebelum body() Pesan HTML-only menyimpan konten mereka di dalam sistem penyimpanan. Properti dan leave HTML body body() kosong.
  • from_file() Memasukkan semua data lampiran ke dalam memori. Untuk file MSG besar, pertimbangkan membuka wadah yang berada di bawahnya dengan msg_reader untuk memeriksa metadata tanpa sepenuhnya mengmaterialkan byte lampiran.
  • Pengelolaan strict parameter dari from_file(path, strict) dan (b) from_stream(stream, strict) default untuk false, mentolerir penyimpangan struktural kecil dalam file MSG dunia nyata.
  • Obyek penerima mengekspos recipient_type untuk membedakan entri To, Cc dan Bcc.

Masalah Umum

IsuPenyebabnyaPerbaiki
msg_exception pada file yang terlihat validFile bukan kontainer OLE CFB asliPeriksa dengan: cfb_reader::from_file() jika juga melempar, file tidak valid MSG
body() mengembalikan string kosongPesan hanya menggunakan HTML bodyPenggunaan html_body() sebagai gantinya
recipients() kosong.MSG yang lebih tua tanpa tabel penerimaAkses display_to melalui: get_property_value() dengan: common_message_property_id::display_to
Korupsi streaming di WindowsAliran dibuka tanpa std::ios::binaryTambahkan std::ios::binary bendera ke std::ifstream
Penggunaan memori yang tinggi untuk file besarSemua data lampiran dimuat di muka.Penggunaan msg_reader untuk akses tingkat rendah tanpa materialisasi penuh

FAQ

Apakah from_file() menyimpan file terbuka?

Tidak. File dibuka, di-parse sepenuhnya, dan ditutup sebelum metode dikembalikan. Anda dapat memindahkan atau menghapus file sumber setelah panggilan.

Bagaimana saya tahu apakah lampiran adalah file atau MSG tertanam?

Panggil. attachment.is_embedded_message().Pengembalian true untuk file MSG tertanam; false untuk lampiran file biasa. Untuk pesan tertanam, akses objek yang bersarang melalui: attachment.embedded_message.

Apa bedanya antara from_file() dan menggunakan msg_reader?

mapi_message::from_file() adalah API tingkat tinggi itu menganalisis seluruh pesan dan menunjukkan properti sebagai bidang yang diketik. msg_reader adalah pembaca tingkat rendah yang memberikan akses ke struktur kontainer CFB mentah dan berguna ketika Anda perlu memeriksa tata letak pesan tanpa menganalisis semua properti MAPI.

Apakah file Unicode dan ANSI MSG keduanya didukung?

  • Ya, aku tahu. mapi_message menangani baik Unicode (jenis properti) ptyp_string) dan ANSI (ptyp_string8) sifat string. unicode_strings() pengembalian true untuk pesan disimpan dengan Unicode properti.

Ringkasan Referensi API

Kelas / MetodeDeskripsi
mapi_message::from_file(path)Mengunggah file MSG dari sebuah std::filesystem::path
mapi_message::from_file(path, strict)Beban dengan opsi mode ketat
mapi_message::from_stream(stream)Pemuatan MSG dari sebuah std::istream
mapi_message::from_stream(stream, strict)Beban dari aliran dengan opsi mode ketat
mapi_message::subject()Kembalikan string subjek pesan
mapi_message::body()Kembalikan teks kosong
mapi_message::html_body()Kembalikan bagian HTML (kosong jika tidak ada)
mapi_message::sender_name()Kembalikan nama penyampai tampilan
mapi_message::sender_email_address()Kembalikan alamat email pengirim
mapi_message::internet_message_id()Kembalikan header RFC 2822 Message-ID
mapi_message::message_class()Kembalikan string kelas pesan MAPI
mapi_message::recipients()Kembalikan daftar penerima
mapi_message::attachments()Kembalikan daftar lampiran
mapi_attachment::is_embedded_message()Benar jika lampiran adalah MSG tertanam
mapi_message::unicode_strings()Benar jika pesan menggunakan sifat string Unicode
 Bahasa Indonesia