Kā nolasīt MSG failus C++ valodā
Aspose.Email FOSS for C++ lets you open and parse Outlook MSG files with a single funkcijas izsaukums. mapi_message::from_file() un mapi_message::from_stream() ielādēt pilnu ziņojumu — tematu, ķermeni, sūtītāju, saņēmējus un pielikumu — atmiņā objektu bez Outlook vai COM atkarības.
1. solis — Iestatiet projektu
Klonējiet repozitoriju un pievienojiet to savam 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)2. solis — Iekļaujiet galveni
#include "aspose/email/foss/msg/mapi_message.hpp"Šis vienīgais galvenes fails nodrošina mapi_message un visus atbalstošos tipus aspose::email::foss::msg nosaukumvieta.
3. solis — Ielādējiet ziņojumu no faila ceļa
Izmantot mapi_message::from_file() kad jums ir 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';
}4. solis — Ielādēt ziņojumu no plūsmas
Izmantojiet mapi_message::from_stream() parsēt no jebkura std::istream — noderīgi apstrādājot MSG datus, kas saņemti caur tīklu vai no atmiņas bufera:
#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';
}Vienmēr atveriet plūsmu ar std::ios::binary lai novērstu Windows rindas beigas tulkošanu, lai nepakaitinātu CFB konteineru.
5. solis — Pārlūkot saņēmējus
message.recipients() atgriež std::vector no saņēmēja objektu, katram ar display_name, email_address, un recipient_type lauki:
#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';
}
}6. solis — Pārlūkot pielikumu
message.attachments() atgriež std::vector no pievienojuma objektu. Katrs pievienojums sniedz filename, mime_type, data (neapstrādātie baiti), content_id, un is_embedded_message() predikāts:
#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';
}
}Biežāk sastopamās problēmas un to risinājumi
Tukšs body() pēc ielādes. Daži ziņojumi glabā tekstu tikai HTML ķermenī īpašība. Pārbaudiet message.html_body() kad message.body() atgriež tukšu virkni.
Plūsma atvērta bez std::ios::binary. Windows vidē teksta režīma plūsmas pārvērš CRLF secības, klusi bojājot bināros CFB datus. Vienmēr atveriet MSG failus ar std::ios::binary.
msg_exception izsūta izņēmumu, ja fails izskatās derīgs. Pārbaudiet, vai fails ir īsts MSG (OLE Compound File). Daži eksportēšanas rīki saglabātie faili var būt vienkāršs teksts vai MIME un nevar parsēt ar mapi_message::from_file().
recipients() atgriež tukšu vektoru. Vecāki MSG faili dažkārt izlaiž saņēmēju tabulā, bet saglabā attēlošanas saņēmējus. display_to MAPI īpašība. Piekļūstiet tai caur message.get_property_value() ar common_message_property_id::display_to un property_type_code::ptyp_string.
Liela pievienojuma dati atmiņā. mapi_message::from_file() un from_stream() ielādēt visu ziņojumu, ieskaitot visus pievienojuma baitus. Lieliem failiem atveriet apakšējo konteineru ar msg_reader un pārbaudiet pievienojuma plūsmas bez pilnīgas materializējot tos.
Biežāk uzdotie jautājumi
Kāda ir atšķirība starp from_file() un from_stream()?
Abas rada identisku mapi_message objektu. from_file() pieņem std::filesystem::path un atver failu iekšēji. from_stream() lasa no jebkuru std::istream jūs nodrošināt — noderīgi, ja MSG dati jau ir atmiņā vai ierodas caur ligzdu.
Vai from_file() turēt failu atvērtu pēc ielādes?
Nē. Fails tiek atvērts, pilnībā parsēts atmiņā un aizvērts pirms from_file() atgriežas. Jūs varat pārvietot vai izdzēst avota failu nekavējoties pēc izsaukuma.
Vai es varu lasīt MSG failus, ko izveidojis Outlook uz macOS vai Linux?
Jā. MSG formāts (OLE Compound File + MAPI īpašības) ir pārnēsājams starp operētājsistēmām. Jebkurš .msg fails, kas izveidots ar jebkuru Outlook versiju, var tikt atvērts ar mapi_message::from_file().
Kā es varu nolasīt HTML ķermeni?
Izsaukums message.html_body(). Ja ziņojums tika izveidots tikai ar vienkārša teksta ķermeni, tas atgriež tukšu virkni. message.body() atgriež vienkāršā teksta ķermeni.
Vai stingrais režīms ir noklusējums?
mapi_message::from_file(path, strict) un from_stream(stream, strict) pieņem pēc izvēles strict būla. Noklusējuma vērtība ir false, kas tolerē nelielas struktūras novirzes reālajā pasaulē MSG failos.