Thunderbird を使用したプログラミング
MBOX ファイルの読み取り
Mozilla Thunderbird はオープンソースのクロスプラットフォームメールクライアントで、Mozilla Foundation が開発しています。独自のファイル構造にメールを保存し、専用のファイル形式でメッセージインデックスやサブフォルダーを管理します。Aspose.Email は Thunderbird のメールストレージ構造と連携できます。 MboxrdStorageReader このクラスは開発者が Mozilla Thunderbird のメールストレージファイルからメッセージを読み取れるようにします。本記事では Thunderbird のメールストレージからメッセージを読む方法を示します。
- FileStream で Thunderbird のストレージファイルを開きます。
- インスタンスを作成します MboxrdStorageReader クラスを使い、上記ストリームをコンストラクタに渡します。
- 呼び出す ReadNextMessage() 最初のメッセージを取得します。
- 同じものを使用します ReadNextMessage() ループで全メッセージを読み取ります。
- すべてのストリームを閉じます。
以下のコードスニペットは、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 のメールストレージファイルに新しいメッセージを書き込む機能を提供します。メッセージを書き込むには:
- FileStream で Thunderbird のストレージファイルを開きます。
- インスタンスを作成します MboxrdStorageWriter クラスを使い、上記ストリームをコンストラクタに渡します。
- 上記を使用して新しいメッセージを作成します MailMessage クラス。
- 呼び出す WriteMessage() メソッドに渡し、上記を使用します MailMessage インスタンスを使用してメッセージを Thunderbird のストレージに追加します。
- すべてのストリームを閉じます。
以下のコードスニペットは、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 未満のバージョンのメンバー:
-
SplitInto(long chunkSize, string outputPath) - 指定されたチャンクサイズに基づいて、Mbox ストレージを小さなパーツに分割します。
-
SplitInto(long chunkSize, string outputPath, string partFileNamePrefix) - 各パートに指定したファイル名プレフィックスを付けて、Mbox ストレージを小さなパーツに分割します。
-
Cancel() - 実行中の分割操作を中断します。
以下のコードサンプルは、キャンセル機構を利用しながら 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();
};