Файлы хранилища Mbox

Основная цель этой статьи — помочь вам разобраться в формате mbox и предложить фрагменты кода, которые могут помочь в процессе чтения файлов mbox. Вы узнаете, как анализировать файлы mbox, а также как получать доступ, просматривать и сохранять содержащиеся в них сообщения.

О формате Mbox

Формат mbox имеет важное значение благодаря своей долгой истории и широкому признанию в качестве стандартизированного формата для хранения сообщений электронной почты. Это формат обычного текстового файла, который позволяет объединять несколько сообщений электронной почты и хранить их в одном файле. Простота и совместимость этого формата с различными почтовыми клиентами и системами делают его популярным выбором для архивирования и передачи данных электронной почты. Кроме того, формат mbox сохраняет важные метаданные, такие как отправитель, получатель, тема и отметка времени, обеспечивая целостность сообщений.

Наиболее популярные почтовые клиенты, совместимые с этим форматом:

  • Thunderbird — широко используемый почтовый клиент с открытым исходным кодом, который использует формат mbox для хранения сообщений электронной почты. Он хранит все сообщения папки в одном файле с расширением «.mbox». Для удобства пользователя и простоты управления для каждой папки внутри почтового ящика создаются отдельные файлы. Это позволяет пользователям беспрепятственно импортировать и экспортировать файлы mbox, упрощая перенос данных электронной почты между Thunderbird и другими mbox-совместимыми приложениями.

  • Apple Mail — почтовый клиент по умолчанию на устройствах macOS и iOS со встроенной поддержкой формата mbox. Это позволяет пользователям легко получать доступ, импортировать или передавать файлы mbox в Apple Mail, сохраняя каждую папку почтового ящика в виде отдельного файла. Файлы Apple Mail обычно хранятся с расширениями «.mbox» или «.mbox.plist».

  • Evolution — многофункциональное приложение для управления электронной почтой и личной информацией для Linux, которое также поддерживает формат mbox. Он позволяет пользователям импортировать файлы mbox, обеспечивая плавную интеграцию данных электронной почты в комплексную платформу Evolution.

Это всего лишь несколько примеров почтовых клиентов, использующих формат mbox. Понимание формата и его использования в различных почтовых клиентах важно при программной работе с такими файлами, поскольку это помогает обеспечить совместимость и точный анализ данных электронной почты.

Существуют различные варианты формата, каждый со своими особенностями реализации. Некоторые из часто встречающихся форматов mbox включают mboxrd, mboxo, mboxcl, mboxcl2. Эти варианты в основном различаются тем, как они обрабатывают определенные аспекты, такие как разделители сообщений и метаданные. Важно помнить об этих различиях при работе с файлами mbox, поскольку они могут повлиять на совместимость и анализ данных электронной почты.

Python API для чтения файлов Mbox

Работать с файлами mbox в Python легко с нашей библиотекой Aspose.Email for Python. Этот надежный и многофункциональный API-интерфейс предлагает широкий набор функций для обработки электронной почты, например, возможность читать файлы mbox, извлекать сообщения и управлять данными электронной почты.

Важно отметить, что Aspose.Email for Python также предлагает всестороннюю поддержку различных форматов mbox, в том числе упомянутых ранее. Это означает, что вы можете беспрепятственно работать с этими файлами из разных почтовых клиентов, независимо от конкретных деталей реализации формата mbox. Чтобы использовать возможности API, можно либо загрузить его DLL, либо установить его из PyPI с помощью следующей команды:

> pip install Aspose.Email-for-Python-via-NET

Открыть файл Mbox

Чтобы начать работать с файлом в формате mbox, мы должны сначала открыть его. В этом нам поможет библиотека Aspose.Email.

В нашем коде мы будем следовать шагам, описанным ниже:

  • Код начинается с импорта необходимых модулей из библиотеки Aspose.Email: классов MboxStorageReader и MboxLoadOptions.

  • Затем мы создаем экземпляр MboxLoadOptions, чтобы указать нужные параметры загрузки файла.

  • Затем мы устанавливаем для параметра leaveopen значение False, указывающее, что файл должен быть закрыт после чтения, и указываем UTF8 в качестве предпочтительной кодировки текста.

  • Наконец, мы создаем экземпляр класса MboxStorageReader, вызывая статический метод createreader, передавая имя исходного файла и экземпляр MboxLoadOptions.

Следующий фрагмент кода демонстрирует, как открыть файл mbox:

from aspose.email.storage.mbox import MboxStorageReader, MboxLoadOptions

mbox_load_options = MboxLoadOptions()
mbox_load_options.leave_open = False
mbox_load_options.preferred_text_encoding = 'utf-8'

mbox_reader = MboxStorageReader.create_reader(file_name, mbox_load_options)

Список сообщений из файла Mbox

Поскольку файл был открыт, мы можем исследовать сохраненные в нем сообщения. Приведенные ниже фрагменты кода представляют два подхода к отображению сообщений из файла mbox.

Подход 1: метод EnumerateMessageInfo

Первый подход к отображению сообщений из файла mbox заключается в использовании метода enumeratemessageinfo класса MboxStorageReader. Он перебирает сообщения и просматривает основную информацию о сообщении, такую как тема, поля с, по и дату. Он также возвращает идентификатор сообщения (идентификатор записи), который используется позже для чтения всего содержимого сообщения. Этот подход имеет следующие характеристики:

  • Производительность: он быстрее по сравнению с другим подходом из-за того, что основное внимание уделяется чтению и просмотру основной информации о сообщении, избегая синтаксического анализа и загрузки тела сообщения во время итерации.

  • Эффективность. Ориентируясь только на базовую информацию, он минимизирует потребление памяти и время обработки. Это особенно ценно, когда приходится иметь дело с большими файлами, содержащими множество сообщений.

Чтобы читать, перечислять и просматривать сообщения в файле mbox, мы собираемся выполнить следующие шаги:

  • Импортируйте необходимые модули из библиотеки Aspose.Email: классы MboxStorageReader и MboxLoadOptions.

  • Создайте экземпляр класса MboxLoadOptions. Этот объект будет содержать различные параметры загрузки файла.

  • Настройте свойства объекта:

    • Установите для параметра leaveopen значение False, если вы хотите закрыть файл после его прочтения.
    • Задайте для параметра preferencetextencoding значение utf-8, чтобы указать желаемую кодировку текста для содержимого сообщения.
  • Откройте файл с помощью метода MboxStorageReader.createreader() класса MboxStorageReader.

  • Выполните итерацию по каждому сообщению в файле, используя метод enumeratemessageinfo() объекта mboxreader, извлекая определенные сведения из каждого сообщения. В нашем примере это тема, адрес, дата и время.

Следующий фрагмент кода демонстрирует процесс перебора сообщений с использованием метода enumeratemessageinfo и извлечения их информации.

from aspose.email.storage.mbox import MboxStorageReader, MboxLoadOptions

mbox_load_options = MboxLoadOptions()
mbox_load_options.leave_open = False
mbox_load_options.preferred_text_encoding = 'utf-8'

with MboxStorageReader.create_reader(file_name, mbox_load_options) as mbox_reader:
   for message_info in mbox_reader.enumerate_message_info():
        print(message_info.subject)
        print(message_info.from_address)
        print(message_info.to)
        print(message_info.date)

Таким образом, мы можем получить доступ к таким свойствам, как «Тема», «От», «Кому» и «Дата», и отобразить соответствующие сведения.

Подход 2: метод EnumerateMessages

В отличие от первого подхода, второй предназначен для прямого перебора экземпляров MailMessage, содержащихся в файле mbox, с использованием метода enumeratemessages. Этот метод считывает и загружает все содержимое сообщения во время каждой итерации, обеспечивая немедленный доступ к полной информации электронной почты. Вот некоторые ключевые аспекты этого подхода:

  • Полнота: позволяет получить доступ и обрабатывать все содержимое сообщения, включая тело, вложения, заголовки и другие части.

  • Удобство: этот подход оказывается полезным, когда вы хотите выполнять операции с целым сообщением, например сохранять каждое сообщение в отдельный файл. Это упрощает процесс, загружая все содержимое сообщения во время каждой итерации, что позволяет выполнять нужные операции без необходимости последующего поиска.

Следующий фрагмент кода демонстрирует процесс перебора сообщений с использованием метода enumeratemessages и получение всего содержимого сообщения.

from aspose.email.storage.mbox import MboxStorageReader, MboxLoadOptions

mbox_load_options = MboxLoadOptions()
mbox_load_options.leave_open = False
mbox_load_options.preferred_text_encoding = 'utf-8'

with MboxStorageReader.create_reader(file_name, mbox_load_options) as mbox_reader:
   for eml in mbox_reader.enumerate_messages():
        eml.save(f"{eml.subject}.eml")

Стоит отметить, что загрузка всего содержимого сообщения для каждой итерации потенциально может повлиять на производительность, особенно при работе с большими файлами или значительным количеством сообщений. Таким образом, важно оценить ваши конкретные потребности и принять во внимание такие факторы, как размер файла, количество сообщений и операции, которые вы собираетесь выполнять, при определении наиболее подходящего подхода для вашей ситуации.

Чтение сообщений в файлах Mbox

Другая манипуляция, которую вы, возможно, захотите выполнить с файлом mbox, — это чтение содержащихся в нем сообщений. Вы можете сделать это, используя их строковый идентификатор, полученный из первого подхода перечисления MessageInfo.

При использовании метода enumeratemessageinfo для получения списка сообщений каждое сообщение связывается с уникальным идентификатором в одном файле mbox. Этот идентификатор, обычно представляемый в виде строки, можно получить из свойства entryid объекта MboxMessageInfo.

Получив идентификатор сообщения, мы можем использовать его для просмотра всего содержимого сообщения, выполнив следующие действия:

  • Мы создаем экземпляр EmlLoadOptions. Этот объект будет содержать различные параметры загрузки файлов EML.
  • Настройте свойства:
    • Установите для параметра saveembeddedmessageformat значение True, если вы хотите сохранить встроенный формат сообщения в файле EML.
    • Установите для параметра preservetnefattachments значение True, если вы хотите сохранить вложения TNEF в файле EML.
  • Создайте экземпляр MboxLoadOptions. Этот объект будет содержать различные параметры загрузки файла mbox.
  • Настройте свойства mboxloadoptions:
    • Установите для параметра leaveopen значение False, если вы хотите закрыть файл после его прочтения.
    • Задайте для параметра preferencetextencoding значение utf-8, чтобы указать желаемую кодировку текста для содержимого сообщения.
  • Откройте файл с помощью метода MboxStorageReader.createreader().
  • Внутри цикла foreach мы обращаемся к свойству EntryId каждого объекта MboxMessageInfo, которое представляет собой уникальный идентификатор соответствующего сообщения.
  • Затем мы используем этот идентификатор вместе с методом ExtractMessage класса MboxStorageReader для получения полного сообщения в виде объекта MailMessage.
  • Наконец, мы можем выполнять любые операции с сообщением, например сохранять его в отдельный файл .eml.

Фрагмент кода ниже демонстрирует, как читать отдельное сообщение, используя его строковый идентификатор:

from aspose.email.storage.mbox import MboxStorageReader, MboxLoadOptions
from aspose.email import EmlLoadOptions

eml_load_options = EmlLoadOptions()
eml_load_options.preserve_embedded_message_format = True
eml_load_options.preserve_tnef_attachments = True

mbox_load_options = MboxLoadOptions()
mbox_load_options.leave_open = False
mbox_load_options.preferred_text_encoding = 'utf-8'

with MboxStorageReader.create_reader(file_name, mbox_load_options) as mbox_reader:
   for message_info in mbox_reader.enumerate_message_info():
        eml = mbox_reader.extract_message(message_info.entry_id, eml_load_options)
        eml.save(f"{eml.subject}.eml")

Существенным преимуществом этого подхода является то, что он позволяет выборочно читать и обрабатывать определенные сообщения, игнорируя другие. Эта гибкость оказывается особенно полезной при работе с большими файлами, содержащими большое количество сообщений. Благодаря выборочной обработке только нужных сообщений ненужные вычисления сводятся к минимуму, что повышает общую эффективность.

Важно понимать, что идентификатор сообщения уникален в пределах одного файла. Таким образом, при работе с сообщениями в нескольких файлах mbox возникает необходимость поддерживать сопоставление между этими идентификаторами и соответствующими им файлами.

Утилиты

Библиотека Aspose.Email предлагает несколько служебных функций для улучшения работы с файлами mbox. Рассмотрим пару из них:

Получить общее количество элементов, хранящихся в mbox

Существует простой способ определить общее количество элементов (сообщений), хранящихся в файле mbox. Используйте метод gettotalitemscount() для получения общего количества элементов (сообщений), присутствующих в файле.

Следующий код получает общее количество элементов (сообщений), присутствующих в файле.

from aspose.email.storage.mbox import MboxStorageReader, MboxLoadOptions

mbox_load_options = MboxLoadOptions()
mbox_load_options.leave_open = False
mbox_load_options.preferred_text_encoding = 'utf-8'

with MboxStorageReader.create_reader(file_name, mbox_load_options) as mbox_reader:
    items_count = mbox_reader.get_total_items_count()

Получите размер данных, прочитанный за одну итерацию

Чтобы получить размер данных, считанных во время одной итерации, вы можете получить доступ к свойству currentdatasize объекта mboxreader, чтобы получить размер данных (сообщения), считываемых в текущей итерации.

Следующий код перебирает каждое сообщение в файле. Во время каждой итерации получается размер прочитанного в данный момент сообщения.

from aspose.email.storage.mbox import MboxStorageReader, MboxLoadOptions

mbox_load_options = MboxLoadOptions()
mbox_load_options.leave_open = False
mbox_load_options.preferred_text_encoding = 'utf-8'

with MboxStorageReader.create_reader(file_name, mbox_load_options) as mbox_reader:
   for message_info in mbox_reader.enumerate_message_info():
        message_size = mbox_reader.current_data_size

Заключение

В этой статье мы рассмотрели mbox — стандартизированный и широко распространенный формат для хранения сообщений электронной почты. Его простота и совместимость с различными почтовыми клиентами и системами делают его популярным выбором для архивирования и передачи данных электронной почты. Формат, включая его варианты, поддерживается нашей мощной библиотекой Aspose.Email for Python, которая позволяет легко читать, извлекать и обрабатывать данные электронной почты. Наши простые фрагменты кода и шаги кода представляют собой исчерпывающие и подробные инструкции о том, как открывать, перечислять и просматривать сообщения в файлах mbox.

Вы можете изучить другие функции Aspose.Email, используя документацию. Кроме того, вы можете размещать свои запросы на наш форум.

Смотрите также