Як читати файли на C++
Aspose.Email FOSS for C++ lets you open and parse Outlook MSG files with a single функції виклику. mapi_message::from_file() та mapi_message::from_stream() Завантажити The Повне повідомлення — суб’єкт, тіло, відправник, одержувач і додаток — в пам’ять Об’єкт без залежності Outlook або COM.
Крок 1 - Завантажити проект
Клонуйте репозиторій і додайте його до вашого 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 — Включити заголовки
#include "aspose/email/foss/msg/mapi_message.hpp"Цей єдиний гаджет забезпечує mapi_message Всі підтримують в aspose::email::foss::msg Названий простір.
Крок 3 — Завантажити повідомлення з шляху файлу
Використовуйте 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';
}Крок 4 — Завантажити повідомлення з потоку
Використовуйте mapi_message::from_stream() Від будь-якого з них відходити std::istream Корисні для обробка даних, отриманих через мережу або з буфера в пам’яті:
#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';
}Завжди відкривайте потоки з std::ios::binary Щоб запобігти закінченню ліній Windows Переклад з пошкодження контейнера CFB.
Крок 5 — Ітерація приймачів
message.recipients() Повернення А std::vector від об’єктів, що приймають, кожний з яких display_name, email_address,І recipient_type Поля :
#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 — Ітерати Анекси
message.attachments() Повернення А std::vector Прикметник об’єкта: кожен прикріплений предмет експонати filename, mime_type, data (з урахуванням вищезазначених причин), content_id,І та is_embedded_message() Проповідуватимуть :
#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';
}
}Поширені проблеми та виправлення
Порожні body() Після завантаження. Деякі повідомлення зберігають текст тільки в HTML-коробці. Нерухомість - перевірка message.html_body() Коли message.body() Повертає порожній ряд.
Потік відкрився без std::ios::binary. У Windows, текстові потоки перекладаються CRLF-секунди, тихо пошкоджуючи бінарні CFB-дані. Завжди відкривайте MSG файли з std::ios::binary.
msg_exception Завантажити файли, що виглядають як дійсні. Перевірте, чи є файл справжнім MSG (OLE Compound File).Файли, збережені деякими інструментами експортування, можуть бути простим текстом або MIME та Не можна розбивати на mapi_message::from_file().
recipients() Повертає порожній вектор. Старі файли іноді пропускають одержувача Столиця, але прийомники в магазині display_to Пропозиції доступу: доступ до них через message.get_property_value() З common_message_property_id::display_to та property_type_code::ptyp_string.
Великі обсяги даних в пам’яті. Іmapi_message::from_file() та from_stream() завантажити все повідомлення, включаючи всі біти додатків. Для великих файлів відкрийте Контейнерний контейнером з msg_reader Перевірка потоків прикріплення без повного Їх матеріалізують.
Часті запитання
У чому різниця між from_file() та from_stream()?
Обидва виробляють однакові mapi_message Об’єкт. from_file() Приймає а std::filesystem::path Відкрийте файл внутрішньо. from_stream() Читає від будь-який std::istream Ви надаєте — корисно, коли дані MSG вже знаходяться в пам’яті або Прибуття через сокет.
робить from_file() Чи можна відкрити файл після завантаження?
Файл відкривається, повністю завантажується в пам’ять і закривається до того, як він буде from_file() Ви можете перемістити або видалити джерельний файл відразу після виклику.
Чи можу я читати файли, створені Outlook на MacOS або Linux?
Формат MSG (вміст властивостей ОЛЕ Compound File + MAPI) переноситься по всьому Операційні системи: будь-який .msg Файл, створений будь-якою версією Outlook, можна відкрити. З mapi_message::from_file().
Як читати HTML тіло?
Телефонуйте message.html_body().Якщо повідомлення було створено лише з простою текстовою частиною, Це повертає порожній ряд. message.body() Повернення простого тексту.
Чи є строгий режим дефолтом?
mapi_message::from_file(path, strict) та from_stream(stream, strict) Прийняти а опціональний strict Боуліан: дефолт є false, що сприймає невеликі структурні Подібні файли використовуються в реальному світі.