Lập trình với Thunderbird
Đọc tệp MBOX
Mozilla Thunderbird là một khách hàng email mã nguồn mở, đa nền tảng, được phát triển bởi Mozilla Foundation. Nó lưu trữ email trong cấu trúc tệp riêng, quản lý chỉ mục tin nhắn và thư mục con qua các định dạng tệp độc quyền. Aspose.Email có thể làm việc với cấu trúc lưu trữ thư của Thunderbird. The MboxrdStorageReader lớp cho phép các nhà phát triển đọc tin nhắn từ tệp lưu trữ thư của Mozilla Thunderbird. Bài viết này chỉ ra cách đọc tin nhắn từ lưu trữ email của Thunderbird:
- Mở tệp lưu trữ Thunderbird trong FileStream.
- Tạo một đối tượng của MboxrdStorageReader lớp và truyền luồng trên vào hàm khởi tạo.
- Gọi ReadNextMessage() để lấy tin nhắn đầu tiên.
- Sử dụng cùng ReadNextMessage() trong vòng lặp while để đọc tất cả các tin nhắn.
- Đóng tất cả các luồng.
Đoạn mã dưới đây cho bạn thấy cách đọc tất cả các tin nhắn từ bộ lưu trữ thư của 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();
Lấy thuộc tính tin nhắn
MboxMessageInfo lớp chứa các thuộc tính sau để truy xuất thông tin về một tin nhắn:
- DateTime Ngày - Lấy ngày của tin nhắn
- MailAddress Từ - Lấy địa chỉ người gửi
- string Tiêu đề - Lấy tiêu đề tin nhắn
- MailAddressCollection Đến - Lấy tập hợp địa chỉ chứa người nhận của tin nhắn
- MailAddressCollection CC - Lấy tập hợp địa chỉ chứa người nhận CC
- MailAddressCollection Bcc - Lấy tập hợp địa chỉ chứa người nhận BCC của tin nhắn
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}");
}
Trích xuất tin nhắn từ MBOX theo định danh
Cái MboxStorageReader lớp bao gồm EnumerateMessageInfo() phương thức, cho phép bạn duyệt qua từng tin nhắn trong tệp MBOX. Khi sử dụng phương thức này, bạn có thể trích xuất các tin nhắn riêng lẻ mà không cần phải quét toàn bộ lưu trữ nhiều lần. Điều này cải thiện hiệu suất và giảm thời gian xử lý.
Cái MboxMessageInfo class cung cấp EntryId thuộc tính, cung cấp quyền truy cập vào các định danh duy nhất cho mỗi tin nhắn trong tệp MBOX. Định danh này có thể được lưu trong cơ sở dữ liệu hoặc sử dụng làm tham chiếu để nhanh chóng tìm và trích xuất các tin nhắn cụ thể khi cần.
Cái ExtractMessage(string id) phương thức trong MboxStorageReader lớp cho phép các nhà phát triển trích xuất tin nhắn dựa trên EntryId duy nhất của chúng. Với ExtractMessage(string id) phương thức, bạn có thể sử dụng EntryId đã lưu để lấy tin nhắn tương ứng và thực hiện các thao tác bổ sung với nó.
Mẫu mã sau đây minh họa cách trích xuất tin nhắn từ tệp MBOX bằng cách sử dụng các định danh:
MboxStorageReader reader = MboxStorageReader.CreateReader("my.mbox", new MboxLoadOptions());
foreach (MboxMessageInfo msgInfo in reader.EnumerateMessageInfo())
{
MailMessage eml = reader.ExtractMessage(msgInfo.EntryId, new EmlLoadOptions());
}
Cấu hình các tùy chọn tải khi đọc tin nhắn từ MBOX
Các tính năng sau sẽ cho phép bạn chỉ định các tùy chọn khác nhau liên quan tới việc tải và xử lý tin nhắn:
-
Thuộc tính MailStorageConverter.MboxMessageOptions - Lấy hoặc đặt các tùy chọn tải email khi phân tích lưu trữ Mbox.
-
Phương thức MboxrdStorageReader.ReadNextMessage(EmlLoadOptions options) - Tham số EmlLoadOptions chỉ định các tùy chọn khi đọc tin nhắn từ lưu trữ 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");
Đặt Bộ mã Văn bản Ưu tiên khi Tải tệp Mbox để Đọc
Tùy chọn mã hoá có sẵn cho lớp MboxrdStorageReader. Điều này cung cấp các tùy chọn bổ sung cho việc tải tệp mbox và đảm bảo các tin nhắn có nội dung đã mã hoá sẽ được đọc và xử lý đúng cách.. Đoạn mã sau đây cho thấy cách bạn có thể đặt mã hoá văn bản phù hợp với nhu cầu của mình:
var reader = new MboxrdStorageReader("sample.mbox", new MboxLoadOptions() { PreferredTextEncoding = Encoding.UTF8});
var message = reader.ReadNextMessage();
Lấy tổng số tin nhắn từ tệp MBOX
Cái MboxrdStorageReader lớp cung cấp khả năng đọc số lượng mục có trong tệp MBox. Điều này có thể được sử dụng để phát triển các ứng dụng hiển thị tiến độ hoạt động khi xử lý tệp như vậy.
// 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());
}
Lấy kích thước tin nhắn hiện tại
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();
}
}
Chuyển đổi MBOX sang PST Giữ lại hoặc Loại bỏ Chữ ký
Để xóa chữ ký khỏi tệp trong quá trình chuyển đổi, đặt MboxToPstConversionOptions.RemoveSignature thuộc tính thành true.
Mẫu mã sau đây cho thấy cách sử dụng thuộc tính này:
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 });
Ghi các tệp MBOX
Cái MboxrdStorageWriter lớp cung cấp khả năng ghi các tin nhắn mới vào tệp lưu trữ thư của Thunderbird. Để ghi tin nhắn:
- Mở tệp lưu trữ Thunderbird trong FileStream.
- Tạo một đối tượng của MboxrdStorageWriter lớp và truyền luồng trên vào hàm khởi tạo.
- Chuẩn bị một tin nhắn mới bằng cách sử dụng MailMessage lớp.
- Gọi WriteMessage() phương thức và truyền những giá trị ở trên MailMessage đối tượng để thêm tin nhắn vào bộ lưu trữ Thunderbird.
- Đóng tất cả các luồng.
Đoạn mã sau đây cho bạn thấy cách ghi tin nhắn vào bộ lưu trữ thư của 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();
Chia lưu trữ MBOX/Hủy thao tác chia
Aspose.Email cung cấp các phương thức để chia lưu trữ Mbox thành các phần nhỏ hơn, giúp dễ dàng quản lý các kho lưu trữ email lớn. Tùy vào phiên bản .NET bạn đang sử dụng, các phương thức khả dụng và tham số của chúng có thể khác nhau. Dưới đây là các phương thức của MboxStorageReader lớp được sử dụng cho cả .NET Framework 4.5 và các phiên bản .NET Core cũng như các phiên bản dưới 4.5.
Các thành viên cho .NET Framework 4.5 và các phiên bản .NET Core:
-
SplitInto(long chunkSize, string outputPath, CancellationToken token) - Chia lưu trữ Mbox thành các phần nhỏ hơn dựa trên kích thước khối đã chỉ định.
-
Tham số:
- chunkSize: Kích thước xấp xỉ của mỗi phần tính bằng byte.
- outputPath: Đường dẫn thư mục nơi các phần sẽ được tạo.
- token: Một CancellationToken cho phép hủy bỏ thao tác nếu cần.
-
SplitInto(long chunkSize, string outputPath, string partFileNamePrefix, CancellationToken token) - Chia lưu trữ Mbox thành các phần nhỏ hơn với tiền tố tên tệp nhất định cho mỗi phần.
-
Tham số:
- chunkSize: Kích thước xấp xỉ của mỗi phần tính bằng byte.
- outputPath: Đường dẫn thư mục nơi các phần sẽ được tạo.
- partFileNamePrefix: Tiền tố sẽ được thêm vào tên tệp của mỗi phần.
- token: Một CancellationToken cho phép hủy bỏ thao tác nếu cần.
Các thành viên cho .NET Framework phiên bản dưới 4.5:
-
SplitInto(long chunkSize, string outputPath) - Chia lưu trữ Mbox thành các phần nhỏ hơn dựa trên kích thước khối đã chỉ định.
-
SplitInto(long chunkSize, string outputPath, string partFileNamePrefix) - Chia lưu trữ Mbox thành các phần nhỏ hơn với tiền tố tên tệp nhất định cho mỗi phần.
-
Cancel() - Ngắt một thao tác chia đang diễn ra.
Các đoạn mã sau đây minh họa cách chia một tệp MBOX thành các phần trong khi giới hạn quá trình tối đa năm phần, sử dụng cơ chế hủy:
.NET Framework 4.5 và .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 Dưới 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();
};