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()가 비어 있습니다 | 수신자 테이블이 없는 오래된 MSG | get_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 |