Как да четем MSG файлове в C++

Как да четем MSG файлове в 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() Вземете на пълно съобщение — предмет, тяло, изпращач, получател и приложения — в паметта на Обект с никаква зависимост от Outlook или COM.

Стъпка 1 – Изграждане на проекта

Клониране на резервоара и го добавете към вашия CMakeLists.txt:

git clone https://github.com/aspose-email-foss/Aspose.Email-FOSS-for-Cpp.git
add_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() Когато имате A 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 полезни за обработка на MSG данни, получени чрез мрежа или от буфер в паметта:

#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 Line-End Превод от корумпиране на контейнера CFB.


Стъпка 5 – Итератни рецептори

message.recipients() Връща се в std::vector от обект, всеки с display_name, email_addressrecipient_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 Файловете, съхранени от някои инструменти за износ могат да бъдат плосък текст или MIME и Не може да бъде разпръснат от mapi_message::from_file().

recipients() Връща празен вектор. По-старите MSG файлове понякога пропуснат получателя Таблица, но магазин показват получателите в 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() Можете да преместите или изтриете източника на файла веднага след обаждането.

Мога ли да прочета MSG файлове, създадени от Outlook на macOS или Linux?

Форматът MSG (OLE 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,- които са по-малки в структурата на Отклонения в реалния свят MSG файлове.

Виж също

 Български