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.gitadd_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.