Hur man läser MSG-filer i C++
Aspose.Email FOSS for C++ lets you open and parse Outlook MSG files with a single Funktionella samtal . mapi_message::from_file() och mapi_message::from_stream() Ladda den fullständig meddelande – ämne, kropp, sändebud, mottagare och bifogade - i ett in-minneslag Objekt med ingen Outlook eller COM beroende.
Steg 1 – Ställ in projektet
Klonera lagret och lägg till det i din CMakeLists.txt:
git clone https://github.com/aspose-email-foss/Aspose.Email-FOSS-for-Cpp.gitadd_subdirectory(Aspose.Email-FOSS-for-Cpp)
target_link_libraries(your_target PRIVATE AsposeEmailFoss::AsposeEmailFoss)Steg 2 – Inkludera header
#include "aspose/email/foss/msg/mapi_message.hpp"Denna enda header ger mapi_message och alla stödjande typer i aspose::email::foss::msg Namn på plats.
Steg 3 – Ladda upp ett meddelande från en filvägen
Användning mapi_message::from_file() När du har 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';
}Steg 4 – Ladda upp ett meddelande från en ström
Användning mapi_message::from_stream() att ta sig ur någon std::istream - Användbar för bearbetning av MSG-data som erhålls via ett nätverk eller från en in-memory buffer:
#include <fstream>
#include <iostream>
#include "aspose/email/foss/msg/mapi_message.hpp"
int main()
{
std::ifstream input("sample.msg", std::ios::binary);
auto message = aspose::email::foss::msg::mapi_message::from_stream(input);
std::cout << "Subject: " << message.subject() << '\n';
}Öppna alltid strömmen med std::ios::binary För att förhindra Windows line-end översättning från korruption av CFB-behållaren.
Steg 5 – Iteratreceptorer
message.recipients() Återkommer A std::vector av mottagande föremål, var och en med display_name, email_address,och recipient_type Fält är:
#include <fstream>
#include <iostream>
#include "aspose/email/foss/msg/mapi_message.hpp"
int main()
{
std::ifstream input("sample.msg", std::ios::binary);
auto message = aspose::email::foss::msg::mapi_message::from_stream(input);
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';
}
}Steg 6 – Iterate Anslutningar
message.attachments() Återkommer A std::vector av anslutningsobjekt. varje anslutning Exponeringar filename, mime_type, data (och de råa byterna), content_id,och den is_embedded_message() förutspådde:
#include <fstream>
#include <iostream>
#include "aspose/email/foss/msg/mapi_message.hpp"
int main()
{
std::ifstream input("sample.msg", std::ios::binary);
auto message = aspose::email::foss::msg::mapi_message::from_stream(input);
for (std::size_t i = 0; i < message.attachments().size(); ++i)
{
const auto& a = message.attachments()[i];
std::cout << "[" << (i + 1) << "] "
<< a.filename << " mime=" << a.mime_type
<< " bytes=" << a.data.size()
<< " embedded=" << (a.is_embedded_message() ? "yes" : "no")
<< '\n';
}
}Vanliga problem och fixar
tomt body() efter laddning. Vissa meddelanden lagrar text endast i HTML-kroppen Fastighet - kontrollera message.html_body() När message.body() återställer en tom sträng.
Stream öppnas utan std::ios::binary. På Windows, text-mode strömmar översätta CRLF sekvenser, tyst korrumperar binära CFB-data. alltid öppna MSG filer med std::ios::binary.
msg_exception kastas för en giltig-looking fil. Kontrollera att filen är en äkta MSG (OLE Compound File). filer som sparas av vissa exportverktyg kan vara platt text eller MIME och kan inte fördrivas av mapi_message::from_file().
recipients() återställer en tom vector. Äldre MSG-filer missar ibland mottagaren tabell men lagrar visar mottagare i display_to MAPI ägande. åtkomst till den via message.get_property_value() med common_message_property_id::display_to och property_type_code::ptyp_string.
Stora data i minnet. -här är detmapi_message::from_file() och from_stream() ladda hela meddelandet inklusive alla bifogade byter. För stora filer öppnar du Konteinern med underliggande msg_reader och inspektera anslutningsströmmar utan fullständig materialisera dem.
Ofta ställda frågor
Vad är skillnaden mellan from_file() och from_stream()?
Båda producerar en identisk mapi_message och objekt. from_file() accepterar A std::filesystem::path och öppnar filen intern. from_stream() Läs från Alla std::istream Du ger – användbar när MSG-data redan är i minnet eller Kommer över en socket.
Gör det from_file() Håll filen öppen efter laddning?
Filen öppnas, helt parsedd i minnet och stängd innan den är klar. from_file() Du kan flytta eller ta bort källfilen omedelbart efter samtalet.
Kan jag läsa MSG-filer som skapats av Outlook på macOS eller Linux?
Ja. MSG-formatet (OLE Compound File + MAPI-egenskaper) är överförbart mellan olika delar av Operativsystem - alla .msg filer som produceras av någon version av Outlook kan öppnas med mapi_message::from_file().
Hur läser jag HTML-kroppen?
Ringa till message.html_body().Om meddelandet skapades med endast en platt text kropp, Detta ger tillbaka en tom sträng. message.body() återvänder den platttextkroppen.
Är strikt läge standard?
mapi_message::from_file(path, strict) och from_stream(stream, strict) accepterar en Optionellt strict Booean. det är en default false,som tolererar mindre strukturella Avvikelser i verkliga MSG-filer.