Thunderbird を使用したプログラミング

MBOX ファイルの読み取り

Mozilla Thunderbird はオープンソースのクロスプラットフォームメールクライアントで、Mozilla Foundation が開発しています。独自のファイル構造にメールを保存し、専用のファイル形式でメッセージインデックスやサブフォルダーを管理します。Aspose.Email は Thunderbird のメールストレージ構造と連携できます。 MboxrdStorageReader このクラスは開発者が Mozilla Thunderbird のメールストレージファイルからメッセージを読み取れるようにします。本記事では Thunderbird のメールストレージからメッセージを読む方法を示します。

  1. FileStream で Thunderbird のストレージファイルを開きます。
  2. インスタンスを作成します MboxrdStorageReader クラスを使い、上記ストリームをコンストラクタに渡します。
  3. 呼び出す ReadNextMessage() 最初のメッセージを取得します。
  4. 同じものを使用します ReadNextMessage() ループで全メッセージを読み取ります。
  5. すべてのストリームを閉じます。

以下のコードスニペットは、Thunderbird のメールストレージからすべてのメッセージを読む方法を示しています。

// The path to the File directory.
var dataDir = RunExamples.GetDataDir_Thunderbird();

// Open the storage file with FileStream
var stream = new FileStream(dataDir + "ExampleMbox.mbox", FileMode.Open, FileAccess.Read);
// Create an instance of the MboxrdStorageReader class and pass the stream
var reader = new MboxrdStorageReader(stream, false);
// Start reading messages
var message = reader.ReadNextMessage();

// Read all messages in a loop
while (message != null)
{
    // Manipulate message - show contents
    Console.WriteLine("Subject: " + message.Subject);
    // Save this message in EML or MSG format
    message.Save(message.Subject + ".eml", SaveOptions.DefaultEml);
    message.Save(message.Subject + ".msg", SaveOptions.DefaultMsgUnicode);

    // Get the next message
    message = reader.ReadNextMessage();
}

// Close the streams
reader.Dispose();
stream.Close();

メッセージプロパティの取得

MboxMessageInfo クラスにはメッセージ情報を取得するための以下のプロパティが含まれます。

  • DateTime Date - メッセージの日付を取得します
  • MailAddress From - 送信者アドレスを取得します
  • string Subject - メッセージの件名を取得します
  • MailAddressCollection To - メッセージの受信者アドレスコレクションを取得します
  • MailAddressCollection CC - CC 受信者のアドレスコレクションを取得します
  • MailAddressCollection Bcc - メッセージの BCC 受信者のアドレスコレクションを取得します
MboxStorageReader reader = MboxStorageReader.CreateReader(fileName, new MboxLoadOptions());

foreach (var mboxMessageInfo in reader.EnumerateMessageInfo())
{
    Console.Writeline($"Subject: {mboxMessageInfo.Subject}");
    Console.Writeline($"Date: {mboxMessageInfo.Date}");
    Console.Writeline($"From: {mboxMessageInfo.From}");
    Console.Writeline($"To: {mboxMessageInfo.To}");
    Console.Writeline($"CC: {mboxMessageInfo.CC}");
    Console.Writeline($"Bcc: {mboxMessageInfo.Bcc}");
}

ID による MBOX からのメッセージ抽出

この MboxStorageReader クラスには EnumerateMessageInfo() メソッドは、MBOX ファイル内の各メッセージを反復処理できるようにします。このメソッドを使用すると、ストレージ全体を繰り返し走査することなく個々のメッセージを抽出でき、パフォーマンスが向上し処理時間が短縮されます。

この MboxMessageInfo class は以下を提供します EntryId プロパティで、MBOX ファイル内の各メッセージのユニークな識別子へのアクセスを提供します。この識別子はデータベースに保存したり、必要に応じて特定のメッセージを迅速に検索・抽出する参照として使用できます。

この ExtractMessage(string id) メソッドは MboxStorageReader このクラスは、開発者が固有の EntryId に基づいてメッセージを抽出できるようにします。 ExtractMessage(string id) メソッドを使用すると、保存された EntryId を利用して対応するメッセージを取得し、追加の操作を行うことができます。

以下のコードサンプルは、識別子を使用して MBOX ファイルからメッセージを抽出する方法を示しています。

MboxStorageReader reader = MboxStorageReader.CreateReader("my.mbox", new MboxLoadOptions());

foreach (MboxMessageInfo msgInfo in reader.EnumerateMessageInfo())
{
    MailMessage eml = reader.ExtractMessage(msgInfo.EntryId, new EmlLoadOptions());
}

MBOX からメッセージを読む際のロードオプション設定

以下の機能により、メッセージのロードおよび処理に関するさまざまなオプションを指定できます。

  • MailStorageConverter.MboxMessageOptions プロパティ - Mbox ストレージを解析する際のメールロードオプションを取得または設定します。

  • MboxrdStorageReader.ReadNextMessage(EmlLoadOptions options) メソッド - EmlLoadOptions パラメーターは Mbox ストレージからメッセージを読む際のオプションを指定します。

var reader = new MboxrdStorageReader(fileName, new MboxLoadOptions());
// Read messages preserving tnef attachments.
var eml = reader.ReadNextMessage(new EmlLoadOptions {PreserveTnefAttachments = true});
MailStorageConverter.MboxMessageOptions(new EmlLoadOptions {PreserveTnefAttachments = true});
// Convert messages from mbox to pst preserving tnef attachments.
var pst = MailStorageConverter.mboxToPst("Input.mbox", "Output.pst");

Mbox ファイル読み込み時の優先テキストエンコーディング設定

MboxrdStorageReader クラスにはエンコーディングオプションが用意されています。これにより mbox ファイルのロードに追加オプションが提供され、エンコードされた内容のメッセージが正しく読み取られ処理されます。以下のコードスニペットは、必要に合わせたテキストエンコーディングの設定方法を示しています。

var reader = new MboxrdStorageReader("sample.mbox", new MboxLoadOptions() { PreferredTextEncoding = Encoding.UTF8});
var message = reader.ReadNextMessage();

MBOX ファイルからメッセージ総数を取得

この MboxrdStorageReader class は MBox ファイル内の項目数を読み取る機能を提供します。これを使用して、ファイル処理中の進行状況を表示するアプリケーションを開発できます。

// The path to the File directory.
var dataDir = RunExamples.GetDataDir_Thunderbird();

using (var stream = new FileStream(dataDir + "ExampleMbox.mbox", FileMode.Open, FileAccess.Read))
using (var reader = new MboxrdStorageReader(stream, false))
{
    Console.WriteLine("Total number of messages in Mbox file: " + reader.GetTotalItemsCount());
}

現在のメッセージサイズを取得

using (var stream = new FileStream(dataDir + "ExampleMbox.mbox", FileMode.Open, FileAccess.Read))
using (var reader = new MboxrdStorageReader(stream, false))
{
    MailMessage msg;
    while ((msg = reader.ReadNextMessage()) != null)
    {
        long currentDataSize = reader.CurrentDataSize;

        msg.Dispose();
    }
}

MBOX から PST への変換(署名の保持または削除)

変換プロセス中にファイルから署名を削除するには、次を設定します。 MboxToPstConversionOptions.RemoveSignature true に設定するプロパティです。

以下のコードサンプルは、このプロパティの使用方法を示しています。

var pstDataStream = new MemoryStream();
var personalStorage = PersonalStorage.Create(pstDataStream, FileFormatVersion.Unicode);
MailStorageConverter.MboxToPst(new MboxrdStorageReader(new FileStream(fileName, FileMode.Open, FileAccess.Read), new MboxLoadOptions()),
personalStorage,
    "Inbox",
new MboxToPstConversionOptions() { RemoveSignature = true });

MBOX ファイルの書き込み

この MboxrdStorageWriter このクラスは、Thunderbird のメールストレージファイルに新しいメッセージを書き込む機能を提供します。メッセージを書き込むには:

  1. FileStream で Thunderbird のストレージファイルを開きます。
  2. インスタンスを作成します MboxrdStorageWriter クラスを使い、上記ストリームをコンストラクタに渡します。
  3. 上記を使用して新しいメッセージを作成します MailMessage クラス。
  4. 呼び出す WriteMessage() メソッドに渡し、上記を使用します MailMessage インスタンスを使用してメッセージを Thunderbird のストレージに追加します。
  5. すべてのストリームを閉じます。

以下のコードスニペットは、Thunderbird のメールストレージにメッセージを書き込む方法を示しています。

// Open the storage file with FileStream
var stream = new FileStream(dataDir + "ExampleMbox.mbox", FileMode.Open, FileAccess.Write);

// Initialize MboxStorageWriter and pass the above stream to it
var writer = new MboxrdStorageWriter(stream, false);
// Prepare a new message using the MailMessage class
var message = new MailMessage("from@domain.com", "to@domain.com", Guid.NewGuid().ToString(), "added from Aspose.Email");
message.IsDraft = false;
// Add this message to storage
writer.WriteMessage(message);
// Close all related streams
writer.Dispose();
stream.Close();

MBOX ストレージの分割/分割操作のキャンセル

Aspose.Email は Mbox ストレージを小さなパーツに分割するメソッドを提供し、大規模なメールアーカイブの取り扱いを容易にします。使用している .NET バージョンに応じて、利用可能なメソッドとそのパラメーターは異なる場合があります。以下は、そのメソッドの MboxStorageReader .NET Framework 4.5 と .NET Core の両バージョン、および 4.5 未満のバージョンでも使用されるクラスです。

.NET Framework 4.5 および .NET Core バージョンのメンバー:

  • SplitInto(long chunkSize, string outputPath, CancellationToken token) - 指定されたチャンクサイズに基づいて、Mbox ストレージを小さなパーツに分割します。

  • パラメーター:

    • chunkSize: 各チャンクの概算サイズ(バイト)です。
    • outputPath: チャンクが作成されるフォルダーのパスです。
    • token: 操作をキャンセルできる可能性のある CancellationToken です。
  • SplitInto(long chunkSize, string outputPath, string partFileNamePrefix, CancellationToken token) - 各パートに指定したファイル名プレフィックスを付けて、Mbox ストレージを小さなパーツに分割します。

  • パラメーター:

    • chunkSize: 各チャンクの概算サイズ(バイト)です。
    • outputPath: チャンクが作成されるフォルダーのパスです。
    • partFileNamePrefix: 各パートのファイル名に付加されるプレフィックスです。
    • token: 操作をキャンセルできる可能性のある CancellationToken です。

.NET Framework 4.5 未満のバージョンのメンバー:

以下のコードサンプルは、キャンセル機構を利用しながら MBOX ファイルを最大5部に分割し、プロセスを制限する方法を示しています。

.NET Framework 4.5 および .NET Core:

int partCount = 0;

var tokenSource = new CancellationTokenSource();

var mbox = new MboxrdStorageReader(fileName, new MboxLoadOptions { LeaveOpen = false });

// Subscribe to events
mbox.MboxFileCreated += (sender, e) =>
{
    partCount++;
    if (partCount >= 5)
        tokenSource.Cancel();
};

System.Threading.Tasks.Task task = mbox.SplitInto(10000000, outputPath, tokenSource.Token);
task.Wait();

.NET Framework 4.5 未満:

int partCount = 0;
var mbox = new MboxrdStorageReader(fileName, new MboxLoadOptions { LeaveOpen = false });
mbox.SplitInto(10000000, outputPath);

mbox.MboxFileCreated += (sender, e) =>
{
    partCount++;
    if (partCount >= 5)
        mbox.Cancel();
};