Программирование с Thunderbird
Чтение сообщений из MBOX
Mozilla Thunderbird является открытым, кросс‑платформенным почтовым клиентом, разработанным Mozilla Foundation. Он хранит электронные письма в собственной файловой структуре, управляя индексами сообщений и подпапками через проприетарные форматы файлов. Aspose.Email может работать со структурами хранилища почты Thunderbird. The MboxrdStorageReader class позволяет разработчикам читать сообщения из файла хранилища почты Mozilla Thunderbird. В этой статье показано, как читать сообщения из хранилища электронной почты Thunderbird:
- Откройте файл хранилища Thunderbird в FileStream.
- Создать экземпляр MboxrdStorageReader class и передайте вышеуказанный поток в конструктор.
- Вызвать ReadNextMessage() чтобы получить первое сообщение.
- Использовать тот же ReadNextMessage() в цикле while для чтения всех сообщений.
- Закрыть все потоки.
Следующий фрагмент кода показывает, как прочитать все сообщения из хранилища почты Thunderbird.
//Getting Marker information while reading messages from Mbox storage file
try (FileInputStream stream = new FileInputStream(dataDir + "Outlook.pst")) {
MboxLoadOptions lo = new MboxLoadOptions();
lo.setLeaveOpen(false);
try (MboxrdStorageReader reader = new MboxrdStorageReader(stream, lo)) {
MailMessage msg;
String[] fromMarker = {null};
while ((msg = reader.readNextMessage(/* out */fromMarker)) != null) {
System.out.println(fromMarker[0]);
}
}
}
Настройка параметров загрузки при чтении сообщений из MBOX
API Aspose.Email позволяет выполнять следующие операции с сообщениями при их чтении из файла MBOX:
Конвертировать сообщения из MBOX в PST с сохранением вложений TNEF
EmlLoadOptions emlLoadOptions = new EmlLoadOptions();
emlLoadOptions.setPreserveTnefAttachments(true);
MailStorageConverter.setMboxMessageOptions(emlLoadOptions);
// Convert messages from mbox to pst preserving tnef attachments.
PersonalStorage storage = MailStorageConverter.mboxToPst("Input.mbox", "Output.pst");
MailStorageConverter.MboxMessageOptions() свойство — получает или задаёт параметры загрузки email при разборе хранилища Mbox.
Чтение сообщений с сохранением вложений TNEF
MboxrdStorageReader reader = new MboxrdStorageReader("Input.mbox", new MboxLoadOptions());
// Read messages preserving tnef attachments.
EmlLoadOptions emlLoadOptions = new EmlLoadOptions();
emlLoadOptions.setPreserveTnefAttachments(true);
MailMessage eml = reader.readNextMessage(emlLoadOptions);
MboxrdStorageReader.readNextMessage(EmlLoadOptions options) method - Параметр EmlLoadOptions указывает опции при чтении сообщения из хранилища Mbox.
Перечисление сообщений с сохранением вложений TNEF
EmlLoadOptions emlLoadOptions = new EmlLoadOptions();
emlLoadOptions.setPreserveTnefAttachments(true);
// Enumerate messages preserving tnef attachments.
for (MailMessage message : reader.enumerateMessages(emlLoadOptions)) {
// do something
}
MboxrdStorageReader.enumerateMessages(EmlLoadOptions options) method - Указывает EmlLoadOptions при чтении сообщения из хранилища Mbox.
Извлечение сообщений из MBOX по идентификаторам
Иногда требуется извлечь выбранные сообщения по идентификаторам. Например, ваше приложение сохраняет идентификаторы в базе данных и извлекает сообщение по запросу. Это эффективный способ избежать полного обхода хранилища каждый раз для поиска конкретного сообщения для извлечения. Чтобы реализовать эту функцию для файлов MBOX, Aspose.Email предоставляет следующие методы и классы:
- MboxMessageInfo класс с EntryId property - Получает идентификатор записи.
- enumerateMessageInfo() метод MboxStorageReader class - Предоставляет перечислитель, поддерживающий итерацию сообщений в хранилище.
- extractMessage(String id) метод MboxStorageReader class - Получает сообщение из MBOX.
Пример кода ниже демонстрирует, как извлекать сообщения из MBOX по идентификаторам:
MboxStorageReader reader = MboxStorageReader.createReader("my.mbox", new MboxLoadOptions());
for (MboxMessageInfo msgInfo : reader.enumerateMessageInfo()) {
MailMessage eml = reader.extractMessage(msgInfo.getEntryId(), new EmlLoadOptions());
}
Примечание: Идентификатор сообщения уникален в пределах файла хранилища. Идентификаторы создаются Aspose.Email и не могут использоваться в других сторонних библиотеках или приложениях для обработки MBOX.
Фильтрация и поиск писем в файлах MBOX
Aspose.Email for Java предоставляет возможность фильтровать или искать сообщения в файлах MBOX с помощью запроса. Это позволяет получать только сообщения, соответствующие определённым критериям. Таким образом, вы можете улучшить производительность и удобство работы приложения при работе с большими файлами MBOX.
Пример кода ниже демонстрирует, как реализовать эту функцию, используя следующие методы:
-
enumerateMessages(MailQuery query)- возвращает перечисляемую коллекцию экземпляров MailMessage, соответствующих заданному запросу. -
enumerateMessageInfo(MailQuery query)- возвращает перечисляемую коллекцию экземпляров MboxMessageInfo, соответствующих заданному запросу.
MboxStorageReader reader = MboxStorageReader.createReader("input.mbox", new MboxLoadOptions());
MailQueryBuilder mqb = new MailQueryBuilder();
mqb.getSubject().contains("Project Update");
mqb.getSentDate().before(new Date());
for (MailMessage message : reader.enumerateMessages(mqb.getQuery())) {
System.out.println("Subject: " + message.getSubject());
}
Постраничное получение сообщений из файлов MBOX
Aspose.Email for Java поддерживает постраничное получение сообщений из файлов MBOX. Эта функция позволяет эффективно обрабатывать большие файлы MBOX, получая сообщения небольшими партиями, снижая потребление памяти и повышая производительность.
Пример кода ниже демонстрирует, как реализовать эту функцию, используя следующие методы:
-
enumerateMessages(int startIndex, int count)- извлекает указанное количество экземпляров MailMessage, начиная с заданного индекса. -
enumerateMessageInfo(int startIndex, int count)- извлекает указанное количество экземпляров MboxMessageInfo, начиная с заданного индекса.
MboxStorageReader reader = MboxStorageReader.createReader("input.mbox", new MboxLoadOptions());
int startIndex = 0;
int count = 10; // Retrieve messages in batches of 10
for (MailMessage message : reader.enumerateMessages(startIndex, count)) {
System.out.println("Subject: " + message.getSubject());
}
Запись сообщений
Этот MboxrdStorageWriter class предоставляет возможность записывать новые сообщения в файл хранилища почты Thunderbird. Чтобы записать сообщения:
- Откройте файл хранилища Thunderbird в FileStream.
- Создать экземпляр MboxrdStorageWriter class и передайте вышеуказанный поток в конструктор.
- Подготовьте новое сообщение, используя MailMessage класс.
- Вызвать WriteMessage() метод и передать вышеуказанное MailMessage экземпляр для добавления сообщения в хранилище Thunderbird.
- Закрыть все потоки.
Следующий фрагмент кода показывает, как записывать сообщения в хранилище почты Thunderbird.
//Getting marker information while writing messages to Mbox storage file
try (FileOutputStream writeStream = new FileOutputStream(dataDir + "inbox")) {
try (MboxrdStorageWriter writer = new MboxrdStorageWriter(writeStream, false)) {
MailMessage msg = MailMessage.load(dataDir + "Message.msg");
String[] fromMarker = {null};
writer.writeMessage(msg, fromMarker);
System.out.println(fromMarker[0]);
}
}
Получение общего количества сообщений из файла MBox
Этот MboxrdStorageReader class предоставляет возможность считывать количество элементов, доступных в файле MBox. Это может использоваться для разработки приложений, отображающих прогресс выполнения при обработке такого файла.
MboxLoadOptions lo = new MboxLoadOptions();
try (MboxrdStorageReader reader = new MboxrdStorageReader("inbox.dat", lo)) {
System.out.println("Total number of messages in Mbox file: " + reader.getTotalItemsCount());
}
Получить текущий размер сообщения
FileInputStream stream = new FileInputStream(dataDir + "ExampleMbox.mbox");
MboxLoadOptions lo = new MboxLoadOptions();
try (MboxrdStorageReader reader = new MboxrdStorageReader(stream, lo)) {
MailMessage msg = null;
while ((msg = reader.readNextMessage()) != null) {
//returns the number of bytes read
long currentDataSize = reader.getCurrentDataSize();
System.out.println("Bytes read: " + currentDataSize);
}
}
Установить предпочтительную кодировку текста при загрузке файлов Mbox
Этот setPreferredTextEncoding(Charset value) метод MboxLoadOptions class получает или задает предпочтительную кодировку для сообщений. Создайте считыватель для файла Mbox с указанными параметрами загрузки, и ваши сообщения с закодированным содержимым будут правильно считаны и обработаны. Ниже приведён пример кода, показывающий, как внедрить эту функцию в проект:
MboxLoadOptions lo = new MboxLoadOptions();
lo.setPreferredTextEncoding(Charset.forName("utf-8"));
MboxrdStorageReader reader = new MboxrdStorageReader("sample.mbox", lo);
MailMessage message = reader.readNextMessage();
Разделить хранилище Mbox на меньшие части
Aspose.Email предоставляет следующие компоненты, предназначенные для более точного контроля обработки хранилища Mbox, позволяя разбивать большие файлы на управляемые части и реализовывать пользовательские действия во время процесса:
- MboxStorageReader.SplitInto(long chunkSize, String outputPath) method - Позволяет разделить хранилище Mbox на более мелкие части, упрощая управление и обработку больших файлов Mbox.
MboxStorageReader.SplitInto(long chunkSize, String outputPath, String partFileNamePrefix) Вариация предыдущего метода, эта также позволяет задать пользовательский префикс для имён разделённых файлов Mbox.
MboxStorageReader.setEmlCopyingEventHandler Событие Это событие происходит перед копированием письма в новый файл Mbox. Вы можете настроить действия до обработки писем.
MboxStorageReader.setEmlCopiedEventHandler Событие Это событие происходит после копирования письма в новый файл Mbox. Вы можете выполнить постобработку писем.
MboxStorageReader.setMboxFileCreatedEventHandler Событие Это событие происходит, когда создаётся новый файл Mbox. Вы можете обработать это событие, чтобы реагировать на создание файла.
MboxStorageReader.setMboxFileFilledEventHandler Событие. Это событие происходит, когда новый Mbox‑файл заполняется письмами. Вы можете реагировать на наполнение файла письмами.
NewStorageEventHandler(Object sender, NewStorageEventArgs e) представляет делегат для обработки событий, возникающих после создания или обработки нового файла хранилища.
MimeItemCopyEventHandler(Object sender, MimeItemCopyEventArgs e) представляет делегат для обработки событий, связанных с копированием Mime‑элементов, обычно используемый в сценариях, когда объект MailMessage копируется из одного хранилища в другое.
NewStorageEventArgs представляет аргументы, используемые в событиях, возникающих после создания нового файла хранилища или после его обработки.
MimeItemCopyEventArgs представляет аргументы события, связанные с копированием объекта MailMessage из одного хранилища в другое, как до начала копирования, так и после его завершения.
Приведённый ниже пример кода демонстрирует, как взаимодействовать с файлами Mbox, обрабатывать события, связанные с этими файлами, и выполнять операции, такие как разбиение хранилища Mbox на более мелкие части с учётом количества сообщений и частей.
messageCount = 0;
partCount = 0;
// Create an instance of MboxrdStorageReader
MboxLoadOptions lo = new MboxLoadOptions();
lo.setLeaveOpen(false);
MboxrdStorageReader mbox = new MboxrdStorageReader("my.mbox", lo);
// Subscribe to events
mbox.setMboxFileCreatedEventHandler(new NewStorageEventHandler() {
public void invoke(Object sender, NewStorageEventArgs e) {
System.out.println("New Mbox file created: " + e.getFileName());
partCount++;
}
});
mbox.setMboxFileFilledEventHandler(new NewStorageEventHandler() {
public void invoke(Object sender, NewStorageEventArgs e) {
System.out.println("Mbox file filled with messages: " + e.getFileName());
}
});
mbox.setEmlCopiedEventHandler(new MimeItemCopyEventHandler() {
public void invoke(Object sender, MimeItemCopyEventArgs e) {
System.out.println("Message added to new Mbox file. Subject: " + e.getItem().getSubject());
messageCount++;
}
});
// Split the Mbox storage into smaller parts
mbox.splitInto(10000000, testOutPath, "Prefix");
// Output the final messageCount and partCount
System.out.println("Total messages added: " + messageCount);
System.out.println("Total parts created: " + partCount);