소개
프로그래밍 방식으로 이메일 메시지를 파싱하는 것은 아카이브 도구, 컴플라이언스 파이프라인 및 마이그레이션 유틸리티에서 흔히 요구되는 작업입니다. Outlook MSG 파일은 MAPI 속성 스트림을 포함하는 Compound File Binary (CFB) 컨테이너 형식을 사용하고, EML 파일은 MIME 표준을 따릅니다. 두 형식 모두 인코딩, 접힌 헤더, 중첩된 첨부 파일을 신중히 처리해야 합니다.
Aspose.Email FOSS for .NET은(는) 무료이며 MIT 라이선스를 가진 C# 라이브러리로, MSG 및 EML 메시지에 대한 완전한 읽기-쓰기 API를 제공합니다. .NET 8.0+을 대상으로 하며 Microsoft Outlook이나 네이티브 COM 인터옵 계층에 대한 의존성이 없습니다. 이 라이브러리는 aspose.email.foss NuGet 패키지로 제공됩니다.
이 게시물에서는 라이브러리에 포함된 메시지 파싱 기능을 살펴봅니다. 디스크에서 파일을 로드하는 것부터 개별 MAPI 속성을 추출하고 형식 간 변환까지 다룹니다.
포함 내용
MSG 파일 로드
MapiMessage 클래스는 Outlook MSG 파일 작업을 위한 주요 진입점입니다. 파일 경로나 스트림에서 메시지를 로드할 수 있으며, 선택적인 strict-validation 플래그를 사용해 파일에서 발견된 구조적 문제를 표시할 수 있습니다.
// Load an MSG file from disk
var message = MapiMessage.FromFile("meeting-invite.msg");
Console.WriteLine($"Subject: {message.Subject}");
Console.WriteLine($"From: {message.SenderName} <{message.SenderEmailAddress}>");
Console.WriteLine($"Date: {message.MessageDeliveryTime}");
Console.WriteLine($"Recipients: {message.Recipients.Count}");
Console.WriteLine($"Attachments: {message.Attachments.Count}");
반환된 MapiMessage은 Subject, Body, HtmlBody, SenderName, SenderEmailAddress, InternetMessageId, 및 MessageDeliveryTime을 포함한 일반 필드에 대한 형식이 지정된 속성을 노출합니다.
EML 메시지 로드 중
EML 파일은 MIME 형식을 사용합니다. MapiMessage.LoadFromEml은 파일 경로, Stream, 또는 byte[]를 받아 동일한 MapiMessage 객체를 반환하므로, 소스 형식에 관계없이 하나의 통합된 API을 사용합니다.
// Load from a file path
var fromFile = MapiMessage.LoadFromEml("newsletter.eml");
// Load from a stream
using var stream = File.OpenRead("newsletter.eml");
var fromStream = MapiMessage.LoadFromEml(stream);
Console.WriteLine($"Subject: {fromStream.Subject}");
Console.WriteLine($"Body: {fromStream.Body?.Trim()}");
파서는 접힌 헤더, Base64 및 quoted-printable 전송 인코딩, 그리고 다중 수신자 To/Cc 필드를 처리합니다.
수신자 및 첨부 파일 작업
메시지를 로드하면 수신자와 첨부 파일은 강력하게 형식이 지정된 컬렉션으로 사용할 수 있습니다. 각 MapiRecipient은 EmailAddress, DisplayName, 및 RecipientType 필드를 포함합니다. 각 MapiAttachment는 Filename, Data, MimeType, 및 ContentId을 제공합니다.
var message = MapiMessage.FromFile("report.msg");
foreach (var recipient in message.Recipients)
{
Console.WriteLine($" {recipient.DisplayName} <{recipient.EmailAddress}> (type={recipient.RecipientType})");
}
foreach (var attachment in message.Attachments)
{
Console.WriteLine($" {attachment.Filename} ({attachment.MimeType}, {attachment.Data.Length} bytes)");
File.WriteAllBytes(attachment.Filename!, attachment.Data);
}
내장 메시지 첨부 파일도 지원됩니다. MapiAttachment.IsEmbeddedMessage이 true인 경우, EmbeddedMessage 속성은 재귀적으로 검사할 수 있는 중첩된 MapiMessage을 반환합니다.
MAPI 속성 접근
고급 시나리오에서는 모든 메시지, 수신자 및 첨부 파일이 Properties 컬렉션(형식: MapiPropertyCollection)을 노출합니다. 속성 ID와 유형 코드를 사용하여 개별 MAPI 속성을 읽고, 추가하고, 제거할 수 있습니다.
var message = MapiMessage.FromFile("custom-props.msg");
// Iterate all properties on the message
foreach (var prop in message.Properties.IterProperties())
{
Console.WriteLine($"Tag: 0x{prop.PropertyTag:X8}, Value: {prop.Value}");
}
// Read a specific property
var subject = message.Properties.Get(
(ushort)CommonMessagePropertyId.Subject,
(ushort)PropertyTypeCode.PtypString);
CommonMessagePropertyId 열거형은 핵심 메시지 의미, 본문 필드, 전송 헤더 및 첨부 메타데이터에 대한 잘 알려진 MAPI 속성 식별자를 정의합니다.
MSG와 EML 간 변환
구문 분석된 메시지는 두 형식 중 하나로 다시 저장될 수 있습니다. Save()은 MSG 바이트를 기록하고, SaveToEml()은 MIME 출력을 생성합니다. 이를 통해 형식 변환이 간단해집니다.
// Load an EML and save as MSG
var message = MapiMessage.LoadFromEml("incoming.eml");
message.Save("converted.msg");
// Load an MSG and save as EML
var msg = MapiMessage.FromFile("outgoing.msg");
msg.SaveToEml("exported.eml");
두 방법 모두 파일 시스템에 접근하지 않고 메모리 내에서 처리하기 위한 Stream 매개변수를 허용합니다.
빠른 시작
NuGet에서 패키지를 설치하세요:
dotnet add package Aspose.Email.FOSS그럼 첫 번째 메시지를 구문 분석하십시오:
using Aspose.Email.Foss.Msg;
// Load an MSG file
var message = MapiMessage.FromFile("sample.msg");
Console.WriteLine($"Subject: {message.Subject}");
Console.WriteLine($"From: {message.SenderName} <{message.SenderEmailAddress}>");
Console.WriteLine($"Date: {message.MessageDeliveryTime}");
Console.WriteLine($"Body length: {message.Body?.Length ?? 0} chars");
// List attachments
foreach (var att in message.Attachments)
Console.WriteLine($" Attachment: {att.Filename} ({att.Data.Length} bytes)");
// Convert to EML
message.SaveToEml("sample.eml");
Console.WriteLine("Saved as EML.");
지원되는 형식
| 형식 | 확장자 | 읽기 | 쓰기 |
|---|---|---|---|
| Outlook MSG | .msg | 예 | 예 |
| MIME (EML) | .eml | 예 | 예 |
| 복합 파일 바이너리 | .cfb | 예 | 예 |
오픈 소스 및 라이선스
Aspose.Email FOSS for .NET은 MIT 라이선스로 제공됩니다. 전체 소스 코드는 GitHub의 aspose-email-foss/Aspose.Email-FOSS-for-.Net에서 이용할 수 있습니다. 기여, 이슈 및 풀 요청을 환영합니다.
시작하기
- Developer Guide — 자세한 문서 및 단계별 안내
- Knowledge Base — FAQ 및 사용 방법 기사
- API Reference — 전체 클래스 및 메서드 레퍼런스