Читать файлы 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) | Нагрузка МСГ с 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() | Верно , если сообщение использует свойства струн Unicode . |