Cum să citiți fișierele în C++
Aspose.Email FOSS for C++ lets you open and parse Outlook MSG files with a single Funcţia de apel. mapi_message::from_file() şi mapi_message::from_stream() încărcaţi mesajul complet – subiect, corp, expeditor, destinatar și atașamente – într-o memorie în interior Nu există dependență de Outlook sau COM.
Pasul 1 – Crearea proiectului
Clonează-ţi repozitorul şi adaugă-l la tine. 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)Pasul 2 – Includeți header-ul
#include "aspose/email/foss/msg/mapi_message.hpp"Acest singur header oferă mapi_message Toate tipurile de sprijin din cadrul aspose::email::foss::msg Numele spațiului.
Pasul 3 – Încărcați un mesaj dintr-un traseu de fișiere
folosesc mapi_message::from_file() Când ai 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';
}Pasul 4 – Încărcați un mesaj dintr-un flux
folosesc mapi_message::from_stream() Pentru a parasi orice std::istream Utile pentru prelucrarea datelor primite de către MSG printr-o rețea sau dintr-un tampon în memorie:
#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';
}Deschideţi întotdeauna fluxul cu std::ios::binary Pentru a preveni terminarea liniilor Windows - de la coruperea containerului CFB.
Pasul 5 – Iterarea receptorilor
message.recipients() Întoarce a std::vector de la obiectele destinatare, fiecare cu display_name, email_address,şi recipient_type Câmpurile :
#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';
}
}Pasul 6 – Iterarea atașamentelor
message.attachments() Întoarce a std::vector de ataşament. fiecare atașament Expoziţii filename, mime_type, data (în cazul în care se aplică la butoane), content_id,Şi, pe de altă parte, la is_embedded_message() Predică :
#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';
}
}Probleme comune și soluții
golului body() După încărcare. Unele mesaje stochează text numai în corpul HTML Proprietate - Verificare message.html_body() Când message.body() Returnează un șir gol.
Războiul s-a deschis fără std::ios::binary. În Windows, fluxurile de text în moduri de traducere Secvențe CRLF, corupând în tăcere datele CFB binare. Deschideți întotdeauna fișierele cu MSG std::ios::binary.
msg_exception aruncat pentru un fișier valid. Verificați dacă fișierul este autentic MSG Fişierele salvate de unele instrumente de export pot fi text simplu sau MIME şi Nu poate fi împărţită de mapi_message::from_file().
recipients() Returnează un vector gol. Fişierele mai vechi MSG omit uneori destinatarul de la tabel, dar magazinul afișează destinatarii în display_to Proprietatea: Accesat prin intermediul message.get_property_value() cu common_message_property_id::display_to şi property_type_code::ptyp_string.
Datele de stocare în memorie. sămapi_message::from_file() şi from_stream() încărcaţi întregul mesaj, inclusiv toate bytele ataşate. Pentru fişiere mari, deschideţi Containere cu msg_reader şi inspectează fluxurile de ataşament fără a fi complet să le materializeze.
Întrebări frecvente
Care este diferența dintre from_file() şi from_stream()?
Ambele forme au un produs identic. mapi_message Obiectul . from_file() Acceptă a std::filesystem::path Deschideți fișierul în interior. from_stream() Citește din Orice std::istream furnizată – utilă atunci când datele MSG sunt deja în memorie sau Ajungem peste un socket.
face from_file() Păstrați fișierul deschis după încărcare?
Fișierul este deschis, complet parsează în memorie și închis înainte de a fi from_file() Puteţi muta sau şterge fişierul sursă imediat după apel.
Pot citi fișierele create de Outlook pe macOS sau Linux?
Formatul MSG (proprietățile File Compound + MAPI) este portabil pe toate Sistem de operare. orice .msg Fișierele create de orice versiune a Outlook pot fi deschise. cu mapi_message::from_file().
Cum citesc corpul HTML?
Apelul message.html_body().Dacă mesajul a fost creat cu un corp simplu, Aceasta returnează un șir gol. message.body() Returnează corpul textului simplu.
Modul strict este default?
mapi_message::from_file(path, strict) şi from_stream(stream, strict) Acceptă un Opțional strict Boolean. defectul este false,care tolerează o structură minoră deformări în fişierele din lumea reală MSG.