Ako čítať súbory v C++
Aspose.Email FOSS for C++ lets you open and parse Outlook MSG files with a single Funkcia volania . mapi_message::from_file() a mapi_message::from_stream() Load na úplné posolstvo – subjekt, telo, odosielateľ, príjemcovia a prílohy – do pamäte objekt bez závislosti Outlook alebo COM.
Krok 1 - Vytvorenie projektu
Klonovať úložište a pridať ho do svojho 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)Krok 2 – Zahrňte hlavičku
#include "aspose/email/foss/msg/mapi_message.hpp"Tento jediný header poskytuje mapi_message a všetkých podporujúcich ľudí v aspose::email::foss::msg Názov priestoru.
Krok 3 – Nahrať správu z cesty súboru
Používať mapi_message::from_file() Keď máte a 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';
}Krok 4 – Nahrať správu z prúdu
Používať mapi_message::from_stream() Odtrhnúť od akéhokoľvek std::istream - užitočné pre spracovanie údajov MSG prijatých cez sieť alebo z pamäťového vyrovnávača:
#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';
}Vždy otvorte prúd s std::ios::binary Ako zabrániť končeniu riadkov systému Windows Preklad z kontingenčného kontajnera CFB.
Krok 5 – Iterujte príjemcov
message.recipients() Vráť sa A std::vector z prijímajúcich objektov, každý s display_name, email_address,a recipient_type Na poli:
#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';
}
}Krok 6 - Iterujte prílohy
message.attachments() Vráť sa A std::vector Zloženie: Každý objekt je pripojený Expozície filename, mime_type, data (zhruba v hrubých bytoch), content_id,a tiež The is_embedded_message() Prednášať sa:
#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';
}
}Bežné problémy a riešenia
prázdne body() Po nakladaní. Niektoré správy ukladajú text iba v HTML tele nehnuteľnosti - kontrolovať message.html_body() Kedy message.body() Vráti prázdny reťazec.
Stream otvorený bez std::ios::binary. V systéme Windows prekladajú textové prúdy sekvencie CRLF, ticho poškodzujúce binárne CFB dáta. Vždy otvárajte súbory s MSG std::ios::binary.
msg_exception vyhodené pre platný vzhľad súboru. Overiť, či je súbor skutočný MSG Súbory uložené niektorými exportnými nástrojmi môžu byť jednoduchým textom alebo MIME a nemôže byť rozdelený na mapi_message::from_file().
recipients() Vráti prázdny vektor. Staršie MSG súbory niekedy vynechajú príjemcu tabuľky, ale ukladacieho displeja príjemcov v display_to Vlastnosti: Prístup k nim cez message.get_property_value() s common_message_property_id::display_to a property_type_code::ptyp_string.
Veľké pripojenie dát do pamäte. - smapi_message::from_file() a from_stream() nahrať celú správu vrátane všetkých príloh. Pre veľké súbory otvorte Kontajnerový priestor s msg_reader a kontrolovať pripojenie prúdov bez plného materializovať ich.
Často kladené otázky
Aký je rozdiel medzi from_file() a from_stream()?
Obaja tvoria identickú mapi_message Objekty sú . from_file() Prijímať a std::filesystem::path Otvorte súbor interne. from_stream() čítať od akýkoľvek std::istream poskytnete – užitočné, keď sú údaje MSG už v pamäti alebo Prichádza cez socket.
robí from_file() Udržiavať súbor otvorený po načítaní?
Súbor sa otvorí, úplne zapíše do pamäte a predtým zatvorí. from_file() Môžete premiestniť alebo odstrániť zdrojový súbor ihneď po hovore.
Môžem čítať súbory MSG vytvorené programom Outlook v systéme macOS alebo Linux?
Áno. formát MSG (vlastnosti súboruOLE Compound File + MAPI) je prenosný cez operačné systémy. akýkoľvek .msg Súbor vytvorený ľubovoľnou verziou programu Outlook je možné otvoriť. s mapi_message::from_file().
Ako čítať HTML telo?
volanie message.html_body().Ak bola správa vytvorená iba s textovým telom, Vráti prázdny reťazec. message.body() Vráti telo jednoduchého textu.
Je prísny mód predvolený?
mapi_message::from_file(path, strict) a from_stream(stream, strict) Prijmite si voliteľný strict boolean. Default je false, ktorý toleruje menšie štrukturálne V reálnom svete súbory.