Com llegir els arxius MSG en C++
Aspose.Email FOSS for C++ lets you open and parse Outlook MSG files with a single Funció de trucada. mapi_message::from_file() i mapi_message::from_stream() càrrega el missatge complet —subject, cos, enviador, destinatari i annexos— en una memòria Object amb no dependència d’Outlook o COM.
Pas 1 - Creació del projecte
Clona el repositori i afegeix-lo al teu 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)Pas 2 - Incloure el capçalera
#include "aspose/email/foss/msg/mapi_message.hpp"Aquest únic encàrrec proporciona mapi_message Tots els tipus de suport a la aspose::email::foss::msg Nom de la ciutat.
Pas 3 - Carregar un missatge d’una ruta de fitxers
Utilitzar mapi_message::from_file() Quan tens una 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';
}Pas 4 - Carregar un missatge d’un corrent
Utilitzar mapi_message::from_stream() Per descomptar de qualsevol std::istream - Utilitzats per a processar dades MSG rebudes a través d’una xarxa o d’un buffer de memòria:
#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';
}Sempre obrir el corrent amb std::ios::binary Per evitar el finalitzar Windows Traducció de la corrupció del contenidor CFB.
Pas 5 - Recipients de iterat
message.recipients() Torna a std::vector de les persones que es troben, cadascuna amb display_name, email_address,i recipient_type Els camps:
#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';
}
}Pas 6 - Iterat de l’atracció
message.attachments() Torna a std::vector de l’actitud. cada acció Exposició filename, mime_type, data (Els bits greus són els que, content_id,I el is_embedded_message() Predicant el:
#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';
}
}Problemes comuns i solucions
Vàstic body() Després de la càrrega. Alguns missatges emmagatzemen text només en el cos HTML Propietat de la propietat. comprovació message.html_body() Quan message.body() Torna una línia buida.
El corrent s’obre sense std::ios::binary. A Windows, els fluxos de text-mode tradueixen CRLF seqüències, silenciosament corrupt dades binàries CFB. Sempre obrir els arxius MSG amb std::ios::binary.
msg_exception Es va llançar per un fitxer de visió valid. Verificar que el fitxer és un MSG autèntic Els arxius guardats per algunes eines d’exportació poden ser text pla o MIME i No es pot fer parcel·lar per mapi_message::from_file().
recipients() Es torna un vector buit. Els arxius MSG més grans de vegades omet el destinatari la taula, però alberg de les mostres dels destinataris en el display_to MAPI propietat. accés a través de message.get_property_value() amb common_message_property_id::display_to i property_type_code::ptyp_string.
Gran adjunt de dades en memòria. El seumapi_message::from_file() i from_stream() carregar tota la comunicació inclòs tots els bit d’adhesió. per a arxius grans, obrir el Contingut amb el msg_reader i inspeccionar els fluxos d’adhesió sense ser completament Materialitzar els seus.
Preguntes freqüents
Quina és la diferència entre from_file() i from_stream()?
Ambdues genera un mateix mapi_message El objecte. from_file() Accepta el A std::filesystem::path Obre el fitxer internament. from_stream() Llegir de Qualsevol std::istream que proporciona, utilitzant quan les dades MSG ja estan en memòria o Arribant sobre una cistella.
que fa from_file() Mantenir el fitxer obert després de la càrrega?
No. El fitxer s’obre, es parseta completament en la memòria i tanca abans de from_file() Podeu moure o eliminar el fitxer font immediatament després de la trucada.
Puc llegir els arxius MSG creats per Outlook en macOS o Linux?
El format MSG (OLE Compound File + MAPI) és portable a través de la xarxa. Sistema operatiu: qualsevol .msg Es pot obrir qualsevol fitxer produït per qualsevol versió d’Outlook. amb mapi_message::from_file().
Com es pot llegir el cos HTML?
trucades message.html_body().Si el missatge es va crear amb només un cos de text pla, Això torna una línia buida. message.body() Retorn al cos de text pla.
És el mode estricte la default?
mapi_message::from_file(path, strict) i from_stream(stream, strict) Acceptació a Opcional strict La debilitat és la false,que es pot tolerar estructuralment menor. Desviacions en els arxius MSG del món real.