Citirea fişierelor MSG
Citirea fişierelor MSG
mapi_message este punctul de intrare pentru încărcarea și analizarea fișierelor Outlook MSG. Un singur Apel la: from_file() sau de: from_stream() Citește întregul container CFB, extrage toate MAPI-urile. proprietăți, și le expune prin metode de accesori tipate nu Outlook instalație necesar.
Încărcare de pe o cale a fișierului
Utilizare: mapi_message::from_file() cu o 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';
}Sarcina de la un flux
Utilizare: mapi_message::from_stream() atunci când datele MSG ajung de la un socket de rețea, o arhiva, sau orice alt 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';
}Întotdeauna deschide fluxul cu: std::ios::binary. Fluxuri în mod text traduc linie Terminări pe Windows şi coruperea container CFB.
Proprietăți de accesare a mesajelor
mapi_message expune cele mai comune proprietăți de mesaj ca gettere denumite:
#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";
}Recepționari iterați
message.recipients() returnează un std::vector de obiectele destinatarilor cu: display_name, email_address, și 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';
}
}Atasamente iterate
message.attachments() returnează un std::vector Fiecare expuse filename, mime_type, data, content_id, și 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()));
}
}
}Acces la mesaje încorporate
Când ? is_embedded_message() este: true, anexa conține un alt fișier MSG. Accesul prin: 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"));
}
}
}Sfaturi şi cele mai bune practici
- Întotdeauna treci.
std::ios::binaryla … înstd::ifstreamla încărcarea fișierelor MSG. - Verifică.
html_body()înainte debody()Mesajele numai HTML îşi stochează conţinutul în sistemul de date. Proprietatea corpului HTML și lasă-l să plecebody()E goală. from_file()Pentru fişiere MSG mari, ia în considerare: deschiderea recipientului de la bază cu:msg_readersă inspecteze metadatele fără a le verifica pe deplin; materializarea baiti de atașament.- În ceea ce priveşte
strictparametru defrom_file(path, strict)și de:from_stream(stream, strict)încadrări lafalse, care tolerează abateri structurale minore în fișiere MSG reale. - Obiecte de primire expune
recipient_typepentru a distinge articolele To, Cc și Bcc.
Probleme comune
| Numărul de date | Cauza | Fixare |
|---|---|---|
msg_exception pe un fișier care arată valid | Fișierul nu este un container OLE CFB autentic | Verificaţi cu: cfb_reader::from_file() dacă arunca, fişierul nu este un MSG valabil. |
body() returnă o șiră goală. | Mesajul folosește doar corpul HTML | Utilizare: html_body() în schimbul |
recipients() este goală. | GMS mai vechi fără tabel de recepție | Accesul display_to prin intermediul get_property_value() cu: common_message_property_id::display_to |
| Corupție de flux pe Windows | Curent deschis fără std::ios::binary | Adăugați std::ios::binary Pavilionul către std::ifstream |
| Utilizare mare a memoriei pentru fișiere mari | Toate datele atașate sunt încărcate în avans. | Utilizare: msg_reader pentru acces la nivel scăzut fără materializare completă |
FAQ
- Da. Nu, nu e aşa. from_file() Să ţin dosarul deschis?
Nu. Fișierul este deschis, complet analizat și închis înainte ca metoda să se întoarcă. Puteți muta sau șterge fișierul sursă după apel.
Cum pot să spun dacă un atașament este un fișier sau o MSG încorporată?
Sună-mă. attachment.is_embedded_message().Retourări true pentru fișierele integrate de MSG; false Pentru mesaje încorporate, accesați obiectul nestat. prin intermediul attachment.embedded_message.
Care este diferenţa între: from_file() și folosirea msg_reader?
mapi_message::from_file() este API de nivel înalt parsează întregul mesaj și expune proprietățile ca câmpuri tipate. msg_reader este cititorul de nivel scăzut care dă acces la structura de recipient CFB brut și este util atunci când aveți nevoie pentru a inspecta Mesajul de layout fără parsing toate proprietățile MAPI.
Fișierele Unicode și ANSI MSG sunt suportate?
- Da, am fost.
mapi_messagese ocupă atât Unicode (tip de proprietateptyp_string) și ANSI (ptyp_string8) proprietăți de șir.unicode_strings()rambursăritruepentru mesaje stocate cu proprietăți Unicode.
Rezultatele de la data aplicării.
| Clasa / metoda | Descriere: |
|---|---|
mapi_message::from_file(path) | Încărcați un fișier MSG de la o std::filesystem::path |
mapi_message::from_file(path, strict) | Sarcină cu opțiunea de mod strict |
mapi_message::from_stream(stream) | Încărcătura de MSG din un std::istream |
mapi_message::from_stream(stream, strict) | Sarcina de la flux cu opțiunea strictă mod |
mapi_message::subject() | Întoarce șirul de subiect al mesajului |
mapi_message::body() | Întoarce corpul textului simplu |
mapi_message::html_body() | Întoarce corpul HTML (goală dacă nu este prezentă) |
mapi_message::sender_name() | Întoarce numele de afișare al expeditorului |
mapi_message::sender_email_address() | Întoarce adresa de e-mail a expeditorului |
mapi_message::internet_message_id() | Întoarceți știrul RFC 2822 de mesaj-ID |
mapi_message::message_class() | Întoarce șirul de mesaje MAPI |
mapi_message::recipients() | Întoarce lista de destinatar |
mapi_message::attachments() | Întoarce lista atașamentelor |
mapi_attachment::is_embedded_message() | Adevărat dacă atașamentul este un MSG încorporat. |
mapi_message::unicode_strings() | E adevărat dacă mesajul folosește proprietăți de șir Unicode |