Четене на MSG файлове
Четене на MSG файлове
mapi_message е входната точка за зареждане и анализиране на Outlook MSG файлове. Един единствен Обади се на: from_file() или с други: from_stream() чете пълния CFB контейнер, извлича всички MAPI свойства, и ги излага чрез типизирани методи за достъп няма Outlook инсталация Необходими.
Зареждане от пътека на файл
Използване на: mapi_message::from_file() с а 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';
}Заредени от поток
Използване на: mapi_message::from_stream() когато MSG данни пристигат от мрежов сокет, и архив или друг std::istream:
#include <fstream>
#include <iostream>
#include "aspose/email/foss/msg/mapi_message.hpp"
int main()
{
std::ifstream input("sample.msg", std::ios::binary);
const auto message = aspose::email::foss::msg::mapi_message::from_stream(input);
std::cout << "Subject: " << message.subject() << '\n';
}Винаги отваряй поток с: std::ios::binary.Текстови редове превод на линия Свършва на Windows и разгражда CFB контейнера.
Свойства на съобщенията за достъп
mapi_message разкрива най-често срещаните свойства на съобщенията като именени получатели:
#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"));
// Core properties
std::cout << "Subject: " << message.subject() << '\n';
std::cout << "Sender name: " << message.sender_name() << '\n';
std::cout << "Sender email: " << message.sender_email_address() << '\n';
std::cout << "Internet msg-id: " << message.internet_message_id() << '\n';
std::cout << "Message class: " << message.message_class() << '\n';
// Body — check html_body() first; fall back to plain body()
const auto& body = message.html_body().empty()
? message.body()
: message.html_body();
std::cout << "Body length: " << body.size() << " chars\n";
}Итеративни получатели
message.recipients() връща a std::vector от получаващи обекти с display_name, email_address, и recipient_type:
#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"));
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';
}
}Итеративни приложения
message.attachments() връща a std::vector Всяка от тях разкрива многобройни обекти. filename, mime_type, data, content_id, и is_embedded_message():
#include <filesystem>
#include <fstream>
#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"));
for (const auto& a : message.attachments())
{
std::cout << a.filename
<< " " << a.mime_type
<< " " << a.data.size() << " bytes"
<< " embedded=" << (a.is_embedded_message() ? "yes" : "no")
<< '\n';
if (!a.is_embedded_message())
{
std::ofstream out("extracted_" + a.filename, std::ios::binary);
out.write(reinterpret_cast<const char*>(a.data.data()),
static_cast<std::streamsize>(a.data.size()));
}
}
}Достъп до вградени съобщения
Кога? is_embedded_message() е в: true, приложението съдържа друг файл MSG. Достъп до него чрез: attachment.embedded_message:
#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"));
for (const auto& a : message.attachments())
{
if (a.is_embedded_message() && a.embedded_message != nullptr)
{
const auto& inner = *a.embedded_message;
std::cout << "Embedded subject: " << inner.subject() << '\n';
inner.save(std::filesystem::path("embedded.msg"));
}
}
}Съвети и най-добри практики
- Винаги преминавам.
std::ios::binaryв) къмstd::ifstreamпри зареждане на файлове с MSG. - Проверка.
html_body()преди товаbody()Съобщенията, съдържащи само HTML, съхраняват своето съдържание в системата за електронно съобщение. HTML имот на тялото и оставятbody()Празно е. from_file()За големи MSG файлове, помислете за: отваряне на подлежащата контейнер с:msg_readerда проверява метаданните без напълно материализиращи байтове за прикрепване.- Съветът на ЕС
strictпараметър наfrom_file(path, strict)и в)from_stream(stream, strict)Неизпълнение на изискванията заfalse, толериращи малки структурни отклонения в реални файлове на MSG. - Обществени обекти на получателя.
recipient_typeда се различават вписванията To, Cc и Bcc.
Общи проблеми
| Издание | Причина за това | Ремонтиране |
|---|---|---|
msg_exception в файл с валиден вид | Файлът не е истински контейнер на OLE CFB | Проверете с: cfb_reader::from_file() ако също хвърли, файлът не е валиден MSG. |
body() връща празен ред | Съобщение използва само HTML корпус | Използване на: html_body() вместо това. |
recipients() е празен. | По-стари МСГ без таблица за получатели | Достъп до информация display_to чрез: get_property_value() с: common_message_property_id::display_to |
| Поквара на потока в Windows | Поток отворен без std::ios::binary | Добавяне std::ios::binary Флаг към std::ifstream |
| Високо потребление на памет за големи файлове | Всички данни за приложенията са заредени предварително. | Използване на: msg_reader за достъп на ниско ниво без пълно материализиране |
FAQ
- Да, нали? from_file() Да държим файловата дръжка отворена?
Не. Файлът се отваря, напълно анализира и затваря преди метода да бъде върнат. Можете да преместите или изтриете източния файл след обаждането.
Как да кажа дали приложеният файл е вграден или MSG?
Обади се. attachment.is_embedded_message().Връщане на парични средства true за вградени файлове на MSG; false за обичайни файлови приложения. За вградени съобщения, достъп до гнезден обект чрез: attachment.embedded_message.
Каква е разликата между: from_file() и използване на msg_reader?
mapi_message::from_file() е API на високо ниво разглежда цялото съобщение и излага свойствата като типизирани полета. msg_reader е читателят на ниско ниво, който дава достъп до структурата на суровия контейнер CFB и е полезен, когато трябва да инспектирате разпределение на съобщенията без анализиране на всички свойства MAPI.
Поддържат ли се файловете Unicode и ANSI MSG?
- Да, много добре.
mapi_messageобработва както Unicode (тип на свойствотоptyp_string) и ANSI (ptyp_string8) свойства на струните.unicode_strings()Доходи за отпускане на данъциtrueза съобщения съхранявани с свойства на Unicode.
Снимка на API референтна информация
| Клас / метод | Описание на състоянието |
|---|---|
mapi_message::from_file(path) | Зареждане на MSG файл от std::filesystem::path |
mapi_message::from_file(path, strict) | Натоварване с опция строго режим |
mapi_message::from_stream(stream) | Натоварване на MSG от std::istream |
mapi_message::from_stream(stream, strict) | Натоварване от поток с опция строго режим |
mapi_message::subject() | Върнете поредицата на темата за съобщението |
mapi_message::body() | Връщане на тялото с обикновен текст |
mapi_message::html_body() | Връщане на HTML тялото (празно, ако не е налице) |
mapi_message::sender_name() | Връщане на името за показване на изпратителя |
mapi_message::sender_email_address() | Върнете адреса на изпращача. |
mapi_message::internet_message_id() | Връщане на заглавието RFC 2822 Message-ID |
mapi_message::message_class() | Връщане на MAPI класовия ред съобщения |
mapi_message::recipients() | Връщане на списъка с получателите |
mapi_message::attachments() | Връщане на списъка с приложения |
mapi_attachment::is_embedded_message() | Включено в системата за управление на емисиите (MSG) |
mapi_message::unicode_strings() | True ако съобщението използва Unicode string свойства |