Læse MSG-filer
Læse MSG-filer
mapi_message er indgangspunktet for at indlæse og analysere Outlook MSG-filer. En enkelt opkald til from_file() eller en anden from_stream() læser den fulde CFB-beholder, udtrækker alle MAPI’er ingen Outlook-installation Det er nødvendigt.
Lade fra en filvej
Anvendelse: mapi_message::from_file() med en 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';
}Last fra en strøm
Anvendelse: mapi_message::from_stream() når MSG-data ankommer fra et netværkssocket, og en - eller et andet arkiv. 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';
}Åbn altid strømmen med: std::ios::binary.Tekst-modus strømme oversætte linje Endinger på Windows og beskadige CFB containeren.
Adgangsbeskedsegnelser
mapi_message afslører de mest almindelige meddelelsesegenskaber som navngivne gettere:
#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";
}Itererede modtagere
message.recipients() returnerer en std::vector af modtagereobjekter med display_name, email_address, og 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';
}
}Itererede vedhæftede filer
message.attachments() returnerer en std::vector De er alle i stand til at udvise en række forskellige former for indbyrdes kontakt. filename, mime_type, data, content_id, og 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()));
}
}
}Adgang til indlejrede meddelelser
Hvornår? is_embedded_message() er: true, bilaget indeholder en anden MSG-fil. Tilgang 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 og bedste praksis
- Altid passerer.
std::ios::binarytilstd::ifstreamved indlæse af MSG-filer.
- Altid passerer.
- Kontrollering
html_body()førbody()Kun HTML-meddelelser gemmer deres indhold i HTML-legemeegenskaber og forladbody()- Det er tomt. from_file()For store MSG-filer kan man overveje at bruge en anden metode. åbning af den underliggende beholder med:msg_readerat kontrollere metadata uden fuldt ud at materialiserende vedhæftede byte.- Den Europæiske Union
strictParametre for:from_file(path, strict)og:from_stream(stream, strict)Forfald tilfalse, der tolererer mindre strukturelle afvigelser i virkelige MSG-filer. - Modtagerobjekter afslører
recipient_typeat skelne mellem To-, Cc- og Bcc-optagelser.
Almindelige problemer
| Udgave: | Årsagen til dette | Forklaret |
|---|---|---|
msg_exception på en gyldig fil | Filen er ikke en ægte OLE CFB-beholder | Verificer med: cfb_reader::from_file() hvis det også kaster, er filen ikke en gyldig MSG |
body() returnerer tomt string | Melding bruger kun HTML-legemet | Anvendelse: html_body() i stedet for |
recipients() er tomt. | Ældre MSG uden modtagertabell | Tilgang til display_to via: get_property_value() med: common_message_property_id::display_to |
| Stream-korruption på Windows | Strømmet åbnet uden std::ios::binary | Tilføjning std::ios::binary Flag til std::ifstream |
| Stor hukommelsesafgift for store filer | Alle vedhæftede data er indlæst på forhånd. | Anvendelse: msg_reader for adgang på lavt niveau uden fuld materialisering |
FAQ
- Ja. Det gør det. from_file() - Hold filhåndtaget åbent?
Filen åbnes, analyseres og lukkes før metoden returneres. Du kan flytte eller slette kilden efter opkaldet.
Hvordan ved jeg, om et bilag er en fil eller en indlejret MSG?
Ring til mig. attachment.is_embedded_message().- Indtægter true for indlejrede MSG-filer; false For indlejrede meddelelser, få adgang til den indelejste objekt via: attachment.embedded_message.
Hvad er forskellen mellem: from_file() og anvendelse af: msg_reader?
mapi_message::from_file() er API på højt niveau det analyserer hele meddelelsen og udstiller egenskaber som typede felter. msg_reader er den lavt niveau læser, der giver adgang til den rå CFB container struktur og er nyttigt, når du har brug for at inspektere MAPI-egenskaberne skal analyseres.
Støttes både Unicode- og ANSI MSG-filer?
- Ja, det er jeg.
mapi_messagehåndterer både Unicode (egentlighedstype) ogptyp_string) og ANSI (ptyp_string8) strengeegenskaber.unicode_strings()Indberetningertruefor meddelelser gemt med Unicode-egenskaber.
API-referenceoversigt
| Klasse/metode | Beskrivelse: |
|---|---|
mapi_message::from_file(path) | Lade en MSG-fil fra et std::filesystem::path |
mapi_message::from_file(path, strict) | Last med streng tilstand mulighed |
mapi_message::from_stream(stream) | Last af MSG fra en std::istream |
mapi_message::from_stream(stream, strict) | Last fra strøm med streng tilstand mulighed |
mapi_message::subject() | Vend indholdet af meddelelsen tilbage |
mapi_message::body() | Tilbagevis den almindelige tekst |
mapi_message::html_body() | Tilbagevis HTML-legemet (tomt, hvis det ikke er til stede) |
mapi_message::sender_name() | Tilbagevis senderens visningsnavn |
mapi_message::sender_email_address() | Tilbagevis e-mail adressen til afsender |
mapi_message::internet_message_id() | Tilbagevis RFC 2822-meddelelseselementets overskrift |
mapi_message::message_class() | Returnering af MAPI-meddelelsesserien |
mapi_message::recipients() | Tilbagevis modtagerlisten |
mapi_message::attachments() | Tilbagevis vedhæftede filer |
mapi_attachment::is_embedded_message() | Sandt, hvis vedhæftningen er en indlejret MSG |
mapi_message::unicode_strings() | Sandt, hvis meddelelsen bruger Unicode-strengegenskaber |