Lezen van MSG-bestanden
MSG-bestanden lezen
mapi_message is het toegangspunt voor het laden en parseren van Outlook MSG-bestanden. Eén enkele aanroep van from_file() of from_stream() leest de volledige CFB-container, haalt alle MAPI-eigenschappen op en stelt ze beschikbaar via typede accessor-methoden — er is geen Outlook-installatie vereist.
Laden vanaf een bestandspad
Gebruik mapi_message::from_file() met een 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';
}Laden vanaf een stream
Gebruik mapi_message::from_stream() wanneer MSG-data afkomstig is van een netwerksocket, een archief, of een 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';
}Open de stream altijd met std::ios::binary. Tekst-modus streams vertalen regeleinden op Windows en beschadigen de CFB-container.
Toegang tot berichteigenschappen
mapi_message exposeert de meest voorkomende berichtkenmerken als benoemde getters:
#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";
}Itereer ontvangers
message.recipients() retourneert een std::vector van ontvangerobjecten met display_name, email_address en 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';
}
}Itereer bijlagen
message.attachments() retourneert een std::vector van bijlageobjecten. Elk exposeert filename, mime_type, data, content_id en 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()));
}
}
}Toegang tot ingesloten berichten
Wanneer is_embedded_message() is true, bevat de bijlage een ander MSG-bestand. Toegang daartoe via 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 en best practices
- Geef altijd
std::ios::binarydoor aanstd::ifstreambij het laden van MSG-bestanden. - Controleer
html_body()vóórbody()— HTML-alleen berichten slaan hun inhoud op in de HTML body-eigenschap en latenbody()leeg. from_file()laadt alle bijlage-gegevens in het geheugen. Bij grote MSG-bestanden kun je overwegen de onderliggende container te openen metmsg_readerom metadata te inspecteren zonder de bijlage-bytes volledig te materialiseren.- De
strict-parameter vanfrom_file(path, strict)enfrom_stream(stream, strict)standaard naarfalse, waarbij kleine structurele afwijkingen in MSG-bestanden uit de praktijk worden getolereerd. - Recipient-objecten bieden
recipient_typeom To-, Cc- en Bcc-items te onderscheiden.
Veelvoorkomende problemen
| Probleem | Oorzaak | Oplossing |
|---|---|---|
msg_exception op een geldig ogend bestand | Bestand is geen echte OLE CFB-container | Verifieer met cfb_reader::from_file() — als het ook een fout geeft, is het bestand geen geldige MSG |
body() retourneert een lege string | Bericht gebruikt alleen HTML body | Gebruik html_body() in plaats daarvan |
recipients() is leeg | Oudere MSG zonder een ontvangerstabel | Toegang tot display_to via get_property_value() met common_message_property_id::display_to |
| Stream-corruptie op Windows | Stream geopend zonder std::ios::binary | Voeg std::ios::binary-vlag toe aan std::ifstream |
| Hoge geheugengebruik voor grote bestanden | Alle bijlagegegevens worden vooraf geladen | Gebruik msg_reader voor low-level toegang zonder volledige materialisatie |
FAQ
Houdt from_file() de bestandshandle open?
Nee. Het bestand wordt geopend, volledig geparseerd en gesloten voordat de methode terugkeert. Je kunt het bronbestand verplaatsen of verwijderen nadat de oproep is voltooid.
Hoe kan ik zien of een bijlage een bestand is of een ingebedde MSG?
Roep attachment.is_embedded_message() aan. Retourneert true voor ingebedde MSG-bestanden; false voor reguliere bestandsbijlagen. Voor ingebedde berichten kun je het geneste object benaderen via attachment.embedded_message.
Wat is het verschil tussen from_file() en het gebruik van msg_reader?
mapi_message::from_file() is de high-level API — het parseert het volledige bericht en stelt eigenschappen beschikbaar als getypeerde velden. msg_reader is de low-level lezer die toegang geeft tot de ruwe CFB-containerstructuur en nuttig is wanneer je de berichtlay-out wilt inspecteren zonder alle MAPI-eigenschappen te parseren.
Worden Unicode- en ANSI-MSG-bestanden beide ondersteund?
Ja. mapi_message verwerkt zowel Unicode (eigenschapstype ptyp_string) als ANSI (ptyp_string8) tekenreeks-eigenschappen. unicode_strings() retourneert true voor berichten die zijn opgeslagen met Unicode-eigenschappen.
API Reference Samenvatting
| Klasse / Methode | Beschrijving |
|---|---|
mapi_message::from_file(path) | Laad een MSG-bestand vanaf een std::filesystem::path |
mapi_message::from_file(path, strict) | Laad met de optie strikte modus |
mapi_message::from_stream(stream) | Laad MSG van een std::istream |
mapi_message::from_stream(stream, strict) | Laad van stream met strict mode-optie |
mapi_message::subject() | Retourneer de onderwerpstring van het bericht |
mapi_message::body() | Retourneer de plain-text body |
mapi_message::html_body() | Retourneer de HTML body (leeg als niet aanwezig) |
mapi_message::sender_name() | Retourneer de sender display name |
mapi_message::sender_email_address() | Retourneer het e-mailadres van de afzender |
mapi_message::internet_message_id() | Retourneer de RFC 2822 Message-ID-header |
mapi_message::message_class() | Retourneer de MAPI-berichtklasse-string |
mapi_message::recipients() | Retourneer de lijst met ontvangers |
mapi_message::attachments() | Geef de bijlagelijst terug |
mapi_attachment::is_embedded_message() | True als bijlage een ingebedde MSG is |
mapi_message::unicode_strings() | True als bericht Unicode-tekenreeks-eigenschappen gebruikt |