使用 Thunderbird 编程
读取 MBOX 文件
Mozilla Thunderbird 是一个由 Mozilla 基金会开发的开源跨平台电子邮件客户端。它使用自己的文件结构存储电子邮件,并通过专有文件格式管理消息索引和子文件夹。Aspose.Email 能够与 Thunderbird 邮件存储结构一起工作。该 MboxrdStorageReader 类允许开发者读取 Mozilla Thunderbird 邮件存储文件中的消息。本文展示了如何从 Thunderbird 邮件存储中读取消息:
- 在 FileStream 中打开 Thunderbird 存储文件。
- 创建该类的实例 MboxrdStorageReader 类,并将上述流传递给构造函数。
- 调用 ReadNextMessage() 获取第一条消息。
- 使用相同的 ReadNextMessage() 在 while 循环中读取所有消息。
- 关闭所有流。
下面的代码片段展示了如何读取 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}");
}
通过标识符从 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 类提供读取 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 文件拆分为多个部分,并将最大部分数限制为五个:
.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();
};