Как парсить файлы MSG в Python

Как парсить файлы MSG в Python

aspose-email-foss for Python предоставляет чистый Python API для чтения файлов Outlook MSG без зависимостей от Microsoft Office. Загрузите файл в объект MapiMessage, чтобы получить доступ ко всем данным сообщения.

Пошаговое руководство

Шаг 1: Установите пакет

pip install aspose-email-foss

Требуется Python 3.10 или новее.


Шаг 2: Импортировать класс MapiMessage

from aspose.email_foss.msg import MapiMessage

Шаг 3: Загрузить файл MSG

msg = MapiMessage.from_file("message.msg")

Для мягкого разбора повреждённых файлов передайте strict=False:

msg = MapiMessage.from_file("message.msg", strict=False)

Шаг 4: Доступ к свойствам сообщения

print(f"Subject: {msg.subject}")
print(f"Body: {msg.body}")
print(f"HTML Body: {msg.body_html[:200] if msg.body_html else 'None'}")
print(f"Message Class: {msg.message_class}")

Шаг 5: Список вложений

for att in msg.iter_attachments_info():
    name = att.storage_name
    is_embedded = att.is_embedded_message
    print(f"Attachment: {name}, embedded={is_embedded}")

Шаг 6: Проверка низкоуровневой структуры CFB

from aspose.email_foss.cfb import CFBReader

reader = CFBReader.from_file("message.msg")
print(f"Directory entries: {reader.directory_entry_count}")
for entry in reader.iter_streams():
    print(f"  Stream: {entry}")
reader.close()

Общие проблемы и решения

CFBError при загрузке

Файл не является действительным контейнером CFB. Убедитесь, что это настоящий файл Outlook MSG, а не EML.

Тело пусто, но HTML‑тело содержит контент

Некоторые сообщения хранят содержимое только в HTML. Проверьте msg.body_html, когда msg.body возвращает None.

Предупреждения проверки

Получите доступ к msg.validation_issues, чтобы увидеть кортеж предупреждений о соответствии для загруженного файла.


Часто задаваемые вопросы (FAQ)

Могу ли я читать файлы EML?

Не напрямую. Библиотека обрабатывает формат MSG (CFB). Сначала преобразуйте содержимое EML в объект EmailMessage, затем используйте MapiMessage.from_email_message().

Загружает ли процесс чтения все данные вложения в память?

Нет. Метаданные вложения читаются по запросу. Используйте iter_attachments_info() для лёгкой итерации.

Это потокобезопасно?

Каждый MapiMessage экземпляр независим. Параллельные чтения из разных экземпляров безопасны.

 Русский