Jak czytać pliki MSG w C++

Jak czytać pliki MSG w C++

Aspose.Email FOSS for C++ lets you open and parse Outlook MSG files with a single Funkcja zadania. mapi_message::from_file() i mapi_message::from_stream() ładujmy na pełna wiadomość – przedmiot, ciało, nadawca, odbiorcy i załączniki – w pamięci Obiekt bez zależności Outlook lub COM.

Krok 1 – Zorganizuj projekt

Klonuj magazyn i dodaj go do swojego 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)

Krok 2 – Włącz nagłówek

#include "aspose/email/foss/msg/mapi_message.hpp"

Ten pojedynczy tytuł zapewnia mapi_message i wszystkich wspierających w aspose::email::foss::msg w nazwie.


Krok 3 - Pobierz wiadomość z drogi pliku

Używanie mapi_message::from_file() Kiedy masz 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';
}

Krok 4 – Pobierz wiadomość z strumienia

Używanie mapi_message::from_stream() Wyróżnia się od jakiegokolwiek std::istream - przydatne dla przetwarzanie danych MSG otrzymanych za pośrednictwem sieci lub z bufera pamięci:

#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';
}

Zawsze otwierajcie strumień z std::ios::binary Aby zapobiec linie Windows tłumaczenia z korumpowania kontenera CFB.


Krok 5 – Iterate receptory

message.recipients() Powrót A std::vector Obiekty, z których każdy display_name, email_address,i recipient_type W polach:

#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';
    }
}

Krok 6 – Iterate Atacments

message.attachments() Powrót A std::vector W każdym z nich - przywiązanie do Ekspozycje filename, mime_type, data (w przypadku surowych bajtów), content_id,i z is_embedded_message() Przekazuje się:

#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';
    }
}

Wspólne problemy i rozwiązania

Puste body() po ładowaniu. Niektóre wiadomości przechowują tekst tylko w ciele HTML Właściwości - sprawdź message.html_body() Kiedy message.body() Powróci pusty strzałek.

Stream otworzony bez std::ios::binary. W systemie Windows, tekst-mode przepływów tłumaczenia CRLF sekwencje, cicho korumpujące dane binarne CFB. Zawsze otwieraj pliki MSG z std::ios::binary.

msg_exception Wyrzucił go do ważnego pliku. Sprawdź, czy plik jest prawdziwy MSG Pliki zapisane przez niektóre narzędzia eksportowe mogą być płaskim tekstem lub MIME i Nie można go rozdzielić przez mapi_message::from_file().

recipients() Wracamy do pustego wektoru. Starsze pliki MSG czasami pomijają odbiorcę tabela, ale magazyn wyświetlać odbiorców w display_to MAPI właściwości. dostęp do niego poprzez message.get_property_value() z common_message_property_id::display_to i property_type_code::ptyp_string.

Duże dane w pamięci. Wystarczymapi_message::from_file() i from_stream() włącz całą wiadomość, w tym wszystkie przypisy bajtów. dla dużych plików otwórz Podstawowy pojemnik z msg_reader i sprawdź strumień przyczep bez pełnego i ich materializować.

Często zadawane pytania

Jaka jest różnica między from_file() i from_stream()?

Obie rodzaje tworzą identyczne mapi_message Obiekty . from_file() akceptuje A std::filesystem::path Otwórz plik wewnętrznie. from_stream() Czyta się od jakiejkolwiek std::istream dostarczane - przydatne, gdy dane MSG są już w pamięci lub Przybywając na socket.

Czyli from_file() Czy po załadowaniu plik jest otwarty?

Plik jest otwarty, w pełni przesuwany do pamięci i zamknięty przed from_file() Możesz przenieść lub usunąć plik źródłowy natychmiast po wezwaniu.

Czy mogę przeczytać pliki MSG stworzone przez program Outlook w systemie macOS lub Linux?

Format MSG (OLE Compound File + MAPI) jest przenośny w dowolnym zakresie. system operacyjny - wszelkie .msg plik wyprodukowany przez dowolną wersję programu Outlook można otworzyć z mapi_message::from_file().

Jak czytać ciało HTML?

Wzywaj message.html_body().Jeśli wiadomość została stworzona tylko z płaskim tekstem, To przywróci pustą strumień. message.body() Wróć do plików płaskich.

Czy standard jest standardem?

mapi_message::from_file(path, strict) i from_stream(stream, strict) akceptuj jeden Opcjonalne strict Boolean – to jest deficyt false,- które tolerują mniej strukturalne W rzeczywistym świecie pliki MSG.

Zobacz również

 Polski