Lesen Sie MSG-Dateien
Lesen Sie MSG-Dateien
mapi_message ist der Eingangspunkt für die Laden und Parschaft von Outlook MSG-Dateien. rufen Sie zu from_file() oder from_stream() Lesen Sie den vollständigen CFB-Kontaktor, extrahieren Sie alle MAPI Eigenschaften und zeigt sie durch typed accessor methods — keine Outlook-installation erforderlich ist.
Laden von einem Dateiweg
Gebrauch mapi_message::from_file() Mit 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';
}Kann ich von einem Stream laden?
Gebrauch mapi_message::from_stream() Wenn MSG-Daten aus einem Netzwerk-Socket kommen, wird eine Archiv oder irgendwelche 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';
}Öffnen Sie immer den Strom mit std::ios::binary.Text-Mode Streams Übersetzungslinie Enden Sie Windows und verstößt den CFB-Kontaktor.
Zugang zu Messaging-Eigenschaften
mapi_message Er zeigt die häufigsten Nachrichtseigenschaften wie sogenannte Gitter:
#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";
}Iterate Empfänger
message.recipients() zurückkehren a std::vector Gegenstände mit Empfänger display_name, email_address,und 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';
}
}Iterate Anlagen
message.attachments() zurückkehren a std::vector Einige Objekte - jede Exposition filename, mime_type, data, content_id,und 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()));
}
}
}Zugang zu eingebetteten Nachrichten
Wann is_embedded_message() ist true, die Anlage enthält eine weitere MSG-Datei. Zugang durch 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"));
}
}
}Tipps und beste Praktiken
- immer durch
std::ios::binaryzustd::ifstreambei der Laden von MSG-Dateien. - Check
html_body()vorbody()- HTML-Nachrichten speichern ihre Inhalte in HTML Körper Eigentum und Verlassenbody()und leeren. from_file()laden alle Anlagendaten in die Speicher. Für große MSG-Dateien, berücksichtigen Sie Öffnen des Unterkonteners mitmsg_readerMetadaten ohne vollständige Überprüfung Materialisierung von Bytes.- Die
strictParameter vonfrom_file(path, strict)undfrom_stream(stream, strict)Default zufalse, die kleinere strukturelle Abweichungen in den MSG-Dateien in der Realität tolerieren. - Empfangsobjekte exponieren
recipient_typeZu unterscheiden To, Cc und Bcc Beiträge.
Gemeinsame Probleme
| Thema | Ursache | Fix |
|---|---|---|
msg_exception auf einer gültigen Datei | Datei ist kein authentisches OLE CFB-Kontaktor | Überprüfen Sie mit cfb_reader::from_file() - wenn es auch ablässt, ist die Datei nicht ein gültiger MSG |
body() Rückkehr der leeren String | Nachrichten verwenden nur HTML-Bereich | Gebrauch html_body() Stattdessen |
recipients() ist leer | MSG ohne Empfänger | Zugang display_to über get_property_value() mit common_message_property_id::display_to |
| Stream Korruption auf Windows | Stream öffnet ohne std::ios::binary | Add zu std::ios::binary Flagge zu std::ifstream |
| Hocher Speicherverbrauch für große Dateien | Alle Anlagendaten werden vorne geladen | Gebrauch msg_reader für niedrige Zugangslive ohne vollständige Materialisierung |
FAQ
Das macht from_file() Halten Sie die Datei offen?
No. Die Datei wird geöffnet, vollständig verstopft und geschlossen, bevor die Methode zurückkehrt. Sie können die Quelldatei nach der Anruf verplaufen oder löschen.
Wie kann ich sagen, ob ein Anschluss eine Datei oder ein integriertes MSG ist?
Anruf attachment.is_embedded_message().Rückkehr true für integrierte MSG-Dateien; false für regelmäßige Dateiangänge. Für eingebettete Nachrichten, den Nested Object zugreifen über attachment.embedded_message.
Was ist der Unterschied zwischen from_file() und benutzen msg_reader?
mapi_message::from_file() ist die hochwertige API — sie verbreitet die volle Nachricht und Er zeigt Eigenschaften wie Typfelder. msg_reader Der niedrigste Leser, der Zugang zur Rohkonteinstruktur von CFB und ist nützlich, wenn Sie überprüfen müssen Message-Layout ohne alle MAPI-Eigenschaften zu verlieren.
Sind Unicode und ANSI MSG Dateien beide unterstützt?
Ja ja. mapi_message Beide Unicode (Eigentyp) ptyp_stringund ANSI (ptyp_string8String Eigenschaften. unicode_strings() Rückkehr true für Nachrichten mit Unicode Eigenschaften gespeichert.
API Referenzabschnitt
| Klasse / Methode | Beschreibung |
|---|---|
mapi_message::from_file(path) | Laden Sie eine MSG-Datei von einem std::filesystem::path |
mapi_message::from_file(path, strict) | Laden mit strengen Modus Option |
mapi_message::from_stream(stream) | Laden Sie MSG von einem std::istream |
mapi_message::from_stream(stream, strict) | Laden von Stream mit strengen Modus Option |
mapi_message::subject() | Rückkehr der Nachricht Subject String |
mapi_message::body() | Rückkehr zum Plain-Text-Bereich |
mapi_message::html_body() | Rückkehr des HTML-Bereichs (mit Freiheit, wenn nicht vorhanden) |
mapi_message::sender_name() | Rückgabe des Senders Display Name |
mapi_message::sender_email_address() | Rückkehr der Sender E-Mail-Adresse |
mapi_message::internet_message_id() | RFC 2822 Message-ID Header zurück |
mapi_message::message_class() | Zurück zur MAPI-Message-Klasse |
mapi_message::recipients() | Rückkehr der Empfängerliste |
mapi_message::attachments() | Rückkehr der Anlageliste |
mapi_attachment::is_embedded_message() | Genau, wenn das Anschluss ein integriertes MSG ist |
mapi_message::unicode_strings() | Genau, wenn die Nachricht Unicode-Stirn-Eigenschaften verwendet |