はじめに

メールメッセージをプログラムで解析することは、アーカイブツール、コンプライアンスパイプライン、マイグレーションユーティリティにおいて一般的な要件です。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 は、SubjectBodyHtmlBodySenderNameSenderEmailAddressInternetMessageId、および MessageDeliveryTime を含む共通フィールドの型付けされたプロパティを公開します。

EML メッセージの読み込み

EML ファイルは MIME 形式を使用します。MapiMessage.LoadFromEml はファイルパス、Stream、または byte[] を受け取り、同じ MapiMessage オブジェクトを返すため、ソース形式に関係なく 1 つの統一された 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 フィールドを処理します。

受信者と添付ファイルの操作

メッセージが読み込まれると、受信者と添付ファイルは強い型付けされたコレクションとして利用可能になります。各 MapiRecipientEmailAddressDisplayNameRecipientType フィールドを保持します。各 MapiAttachmentFilenameDataMimeType、および 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.IsEmbeddedMessagetrue の場合、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はいはい
Compound File Binary.cfbはいはい

オープンソースとライセンス

Aspose.Email FOSS for .NET は MIT ライセンスの下でリリースされています。完全なソースコードは GitHub の aspose-email-foss/Aspose.Email-FOSS-for-.Net で入手可能です。コントリビューション、課題、プルリクエストは歓迎します。


スタートガイド

関連リソース