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

스트림에서 로드

네트워크 소켓, 아카이브 또는 기타 std::istream에서 MSG 데이터가 도착할 때 mapi_message::from_stream()을(를) 사용합니다:

#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은 가장 일반적인 메시지 속성을 명명된 getter로 노출합니다:

#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()은 display_name, email_address, recipient_type를 포함한 수신자 객체의 std::vector을 반환합니다:

#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()은 첨부 파일 객체의 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"));
        }
    }
}

팁 및 모범 사례

  • MSG 파일을 로드할 때 항상 std::ios::binary을 std::ifstream에 전달하십시오.
  • body() 전에 html_body()을 확인하십시오 — HTML 전용 메시지는 내용을 HTML 본문 속성에 저장하고 body()는 비워 둡니다.
  • from_file()은 모든 첨부 데이터를 메모리로 로드합니다. 큰 MSG 파일의 경우, msg_reader을 사용하여 기본 컨테이너를 열어 첨부 바이트를 완전히 실체화하지 않고 메타데이터를 검사하는 것을 고려하십시오.
  • from_file(path, strict) 및 from_stream(stream, strict)의 strict 매개변수는 기본값이 false이며, 실제 MSG 파일의 사소한 구조적 편차를 허용합니다.
  • 수신자 객체는 To, Cc 및 Bcc 항목을 구분하기 위해 recipient_type을 노출합니다.

일반적인 문제

문제원인해결 방법
msg_exception에 대해 유효해 보이는 파일파일이 진정한 OLE CFB 컨테이너가 아닙니다cfb_reader::from_file() 로 검증 — 또한 오류가 발생하면 파일이 유효한 MSG가 아닙니다
body() 가 빈 문자열을 반환합니다메시지는 HTML 본문만 사용합니다대신 html_body()를 사용하세요
recipients()가 비어 있습니다수신자 테이블이 없는 오래된 MSGget_property_value()을 통해 common_message_property_id::display_to와 함께 display_to에 접근하세요
Windows에서 스트림 손상std::ios::binary 없이 스트림이 열렸습니다std::ifstream에 std::ios::binary 플래그를 추가하세요
대용량 파일에 대한 높은 메모리 사용량모든 첨부 데이터가 미리 로드됩니다전체 실체화 없이 저수준 접근을 위해 msg_reader를 사용하십시오

FAQ

from_file()이 파일 핸들을 열어 둡니까?

아니요. 파일이 열리고 전체적으로 파싱된 뒤 메서드가 반환되기 전에 닫힙니다. 호출 후에 원본 파일을 이동하거나 삭제할 수 있습니다.

첨부 파일이 일반 파일인지 임베디드 MSG인지 어떻게 확인합니까?

attachment.is_embedded_message()을(를) 호출하십시오. 임베디드 MSG 파일의 경우 true을 반환하고, 일반 파일 첨부의 경우 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()은 Unicode 속성으로 저장된 메시지에 대해 true을 반환합니다.


API Reference 요약

클래스 / 메서드설명
mapi_message::from_file(path)std::filesystem::path에서 MSG 파일을 로드합니다
mapi_message::from_file(path, strict)엄격 모드 옵션을 사용하여 로드합니다
mapi_message::from_stream(stream)MSG를 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인 경우 True
mapi_message::unicode_strings()메시지가 Unicode 문자열 속성을 사용하는 경우 True

참조

 한국어