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::binarykestd::ifstreamsaat memuat file MSG. - Periksa
html_body()sebelumbody()Pesan HTML-only menyimpan konten mereka di dalam sistem penyimpanan. Properti dan leave HTML bodybody()kosong. from_file()Memasukkan semua data lampiran ke dalam memori. Untuk file MSG besar, pertimbangkan membuka wadah yang berada di bawahnya denganmsg_readeruntuk memeriksa metadata tanpa sepenuhnya mengmaterialkan byte lampiran.- Pengelolaan
strictparameter darifrom_file(path, strict)dan (b)from_stream(stream, strict)default untukfalse, mentolerir penyimpangan struktural kecil dalam file MSG dunia nyata. - Obyek penerima mengekspos
recipient_typeuntuk membedakan entri To, Cc dan Bcc.
Masalah Umum
| Isu | Penyebabnya | Perbaiki |
|---|---|---|
msg_exception pada file yang terlihat valid | File bukan kontainer OLE CFB asli | Periksa dengan: cfb_reader::from_file() jika juga melempar, file tidak valid MSG |
body() mengembalikan string kosong | Pesan hanya menggunakan HTML body | Penggunaan html_body() sebagai gantinya |
recipients() kosong. | MSG yang lebih tua tanpa tabel penerima | Akses display_to melalui: get_property_value() dengan: common_message_property_id::display_to |
| Korupsi streaming di Windows | Aliran dibuka tanpa std::ios::binary | Tambahkan std::ios::binary bendera ke std::ifstream |
| Penggunaan memori yang tinggi untuk file besar | Semua 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_messagemenangani baik Unicode (jenis properti)ptyp_string) dan ANSI (ptyp_string8) sifat string.unicode_strings()pengembaliantrueuntuk pesan disimpan dengan Unicode properti.
Ringkasan Referensi API
| Kelas / Metode | Deskripsi |
|---|---|
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 |