Hoe kan ik MSG bestanden lezen in C++
Aspose.Email FOSS for C++ lets you open and parse Outlook MSG files with a single Functie van Call. mapi_message::from_file() en mapi_message::from_stream() Loop de volledige boodschap – onderwerp, lichaam, zender, ontvanger en bijlagen – in een geheugen Object zonder Outlook- of COM-afhankelijkheid.
Stap 1 - Het project opzetten
Cloneer het repository en voeg het toe aan uw 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)Stap 2 – Inclusief de header
#include "aspose/email/foss/msg/mapi_message.hpp"Deze single header biedt mapi_message En alle ondersteunende personen in de aspose::email::foss::msg Namespace voor.
Stap 3 - Een bericht laden vanuit een bestandspad
Gebruiken mapi_message::from_file() Wanneer je 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';
}Stap 4 - Een bericht laden van een stream
Gebruiken mapi_message::from_stream() Om te parseeren van een std::istream - nuttig voor verwerking van MSG gegevens die via een netwerk of vanuit een in-memory buffer zijn ontvangen:
#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';
}Open altijd de stroom met std::ios::binary Windows-lijnendingen voorkomen Vertaald van het corrupten van de CFB container.
Stap 5 - Iteratie van de ontvanger
message.recipients() Terug naar A std::vector van de ontvangende objecten, elk met display_name, email_address,en recipient_type De velden:
#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';
}
}Stap 6 - Iterate aanhangsels
message.attachments() Terug naar A std::vector van de aanhangobjecten. elk aanhangen expositie filename, mime_type, data (de ruwe bytes zijn), content_id,En de is_embedded_message() Predikant te zijn:
#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';
}
}Veelvoorkomende problemen en oplossingen
leeg body() Na het laden. Sommige berichten slaan alleen tekst op in de HTML-body. Eigendom - Check message.html_body() Wanneer message.body() Een lege string teruggeeft.
Stream open zonder std::ios::binary. In Windows, tekst-modus streams vertalen CRLF-sequenties, die stilzwijgend binaire CFB-gegevens corruperen. open altijd bestanden met std::ios::binary.
msg_exception Gegooid voor een geldig uitziende bestand. Controleer of het bestand een echt is MSG Bestanden die worden opgeslagen door sommige exporttools kunnen eenvoudige tekst of MIME zijn en Kan niet worden gepasseerd door mapi_message::from_file().
recipients() Hiermee wordt een lege vector teruggegeven. Oudere MSG bestanden soms de ontvanger over het hoofd laten tabel, maar de winkel toont ontvangers in de display_to MAPI eigendom. Toegang tot het via message.get_property_value() met common_message_property_id::display_to en property_type_code::ptyp_string.
Grote gegevens in het geheugen. - hetmapi_message::from_file() en from_stream() het hele bericht, inclusief alle bijlagen bytes. Voor grote bestanden, open de De container met de onderliggende msg_reader en controleer de aanhangstromen zonder volledig te materialiseren van hen.
Veelgestelde vragen
Wat is het verschil tussen from_file() en from_stream()?
Beide produceren een identieke mapi_message Het object. from_file() accepteert a std::filesystem::path Open het bestand intern. from_stream() Lees van Iedere std::istream u verstrekt – nuttig wanneer de MSG-gegevens al in het geheugen of Over een socket komen.
doet from_file() Houd je bestand open na het laden?
Het bestand wordt geopend, volledig in het geheugen gepasseerd en gesloten voordat het is opgenomen. from_file() U kunt het bronbestand onmiddellijk na de oproep verplaatsen of verwijderen.
Kan ik bestanden die zijn gemaakt door Outlook op macOS of Linux lezen?
Ja. het MSG-formaat (OLE Compound File + MAPI eigenschappen) is draagbaar via Operatiesystemen. elk .msg Bestanden die zijn geproduceerd door elke versie van Outlook kunnen worden geopend met mapi_message::from_file().
Hoe lees ik de HTML-body?
oproep message.html_body().Als het bericht werd gemaakt met slechts een lichaam van eenvoudige tekst, Hiermee wordt een lege string teruggegeven. message.body() Hiermee wordt het plain-text lichaam teruggegeven.
Is strikte mode de standaard?
mapi_message::from_file(path, strict) en from_stream(stream, strict) accepteren een optioneel strict Boolean.De default is het false,die een kleinere structurele afwijkingen in de echte wereld MSG bestanden.